智谱的 AI 编程桌面端 ZCode,今天被扒出一个大问题。开发者 ferstar 发了一篇取证博客,说只要登录了账号,ZCode 会在后台静默把整个工作区——包括完整的 .git 历史、LFS 大文件缓存、reflog 和全局配置——打包加密上传到阿里云 OSS。该消息马上在国内技术圈传开,有人用自己的 Mac 顺着取证路径重跑了一遍,结论是"属实,而且不是会不会,是已经"。

事情的起点很普通:ferstar 清理磁盘时发现 ~/.zcode 占了 700 多 MB。一路挖下去,在 v2/checkpoints/ 里看到一个 313MB 的 .enc 加密文件,旁边是状态元数据——这是一份标记为 baseline 的全量快照,workspaceSizeBytes 345MB,failureCount 已经到 564(上传失败了 564 次,还躺在 pending 里等重试)。他那个项目总共 10GB,剔除依赖后剩下的 345MB 几乎全是核心资产。
他把客户端的 app.asar 扒开逆向,上传链路还原得很完整:客户端先向 zcode.z.ai 请求上传凭证,拿到 OSS 表单签名、动态 Object Key、大小限制和一把加密公钥;然后在本地打包、流式加密后,根本不经过智谱的业务服务器,直接走表单直传阿里云 OSS,再由 OSS 回调通知智谱后端登记。

最讽刺的是加密方式。标准信封加密:内容用随机对称密钥走 AES-256-CTR,对称密钥再用 RSA-OAEP 包裹。但公钥是服务端动态下发的,私钥从头到尾只在云端。ferstar 试遍本机所有私钥都解不开——"你硬盘上那份 313MB 的密文,你打不开,ZCode 客户端自己也打不开,全天下只有智谱后端的私钥能解。"
快照里到底装了啥?密文解不开,但生成时的 Manifest(42,411 个文件的清单)是明文留在本地的。统计下来 .git 一个目录占了 86.6%:.git/lfs 56.8%、.git/objects 29.6%、.git/logs 0.2%,剩下的源码文档只有 13.4%。
也就是说一旦上传,云端拿到的不只是当前工作区代码,而是仓库自建库以来的全部历史——早就被删掉的敏感配置和历史 key、没推远端的本地分支名(等于未公开的研发动向)、.git/config 里写的内部 GitLab 域名。连全局配置文件 settings.behavior.json 都会被跨工作区打包随快照上传。
真正让开发者炸毛的是开关形同虚设。设置里两个开关——"优化体验"和"仓库快照索引"——你以为能关掉上传,其实一个只管要不要拿数据训练、一个只管服务端要不要建索引,关了本地打包上传一点不落。看客户端代码,负责捕获上传的 sidecar 在启动时无条件实例化,没有任何针对用户配置的判断,唯一门槛是能拿到登录 JWT。触发点是每次发 Prompt 前的 captureBeforePrompt 和任务结束时的 repo-wiki-update,单个活跃会话最多出现 62 次捕获。

隐私政策里只写会收集"对话中提交的文本、文件和代码",对"打包整个工作区和完整 Git 历史"只字未提,文档、FAQ、更新日志里也都没有。
怎么防御?删是打地鼠——作者第一次删了 pending 包,半小时后它重新抓了一份,失败计数从 564 蹦到 565。有效办法是在文件系统层加锁:macOS 用 chflags uchg ~/.zcode/v2/checkpoints,Linux 用 sudo chattr +i,内核拒绝写入,让上传链路无产物可发。代价是检查点回滚和时间线界面失效,对话、补全、工具执行不受影响。
"推理需要上下文,这大家都接受。真正越界的是两件事:数据范围和架构姿态。"
对了,智谱官方刚刚进行了回应:
各位ZCode用户:
今日社区中的相关讨论我们高度重视,第一时间完成自查,先向受影响的用户道歉。现就有关情况说明如下:
此次问题源于ZCode的代码库索引“功能。该功能昌在帮助用户在本地生成仓库索引,以支持包括历史版本在内的会话检查点恢复、历史版本回退及Repo Wiki 等功能。
Repo Wiki功能在生成Wikj页面时可能会触发仓库数据上传。Wij页面在云端生成后,相关上传数据会立即销毁,不会保存。由于该功能在上线初期默认开启,部分用户因此受到影响,对此我们深感抱歉,目前相关问题已经修复。
我们深知任何关于数据的问题都会直接影响用户对产品的信任,我们将于近期开源ZCode代码库,在一个更加开放的生态中把产品做的更好,并邀请第三方评估人员对系统运行情况进行审查,并持续公开产品审查进展,以完全透明的方式建立大家的信任。
对于此次问题给大家带来的困扰,我们深表歉意。我们将为全体ZCode用户额外提供一次周额度重置,额度将于今日发放。
再次感谢大家的关注与监督。
来源:
