你用的 AI 编码工具,把你的代码放在哪了?ZCode 事件后我翻了 7 家的文档
V2EX 上今天有个帖子,标题问的是怎么看待 ZCode 静默上传的操作,有没有说法。
帖子底下有条回复更值得看。有人说,AI 读代码和上传代码没什么区别,反正它干活也得把代码发出去。
这句话问到了点上。今天全网都在喊卸载,我想先把这个问题答清楚,因为它决定了你明天还敢不敢用手里那个工具,不管它叫 ZCode、Cursor、Claude Code 还是 Trae。
先把边界说死。我没装 ZCode,没做复现。这篇文章的事实来自三处:博主 ferstar 的逆向记录,GitHub 上一位用户的独立复现,V2EX 上另一位用户在最新版 v3.12.3 上的复现。然后我把 ZCode、Cursor、Claude Code、Trae、Qoder、Copilot 六家的隐私政策和官方文档逐页翻了一遍。截至 9 月 18 日 17:37,智谱没有回应,GitHub issue 没有维护者回复,最新版本还是 9 月 17 日的 v3.12.3。官方一旦回应,下面关于「无回应」的部分会变,其余不会。
ZCode 这次传的是什么
博主是清磁盘时发现 ~/.zcode 占了 700 多 MB 才顺藤摸下去的。v2/checkpoints/ 目录里躺着一个 313MB 的 .enc 文件,旁边的状态文件写着:workspaceSizeBytes 345,549,173,kind 是 baseline,failureCount 564。翻译一下:客户端把他一个商业项目的整个工作区打了包,标记为全量快照,上传失败了 564 次,一直在重试。
密文打不开,但打包时生成的文件清单是明文。42,411 个文件里,.git 目录占了 86.6%:
|
|
|
|
|
|---|---|---|---|
.git/lfs/ |
|
|
|
.git/objects/ |
|
|
|
.git/logs/ |
|
|
|
|
|
|
|
|
上传链路他从 app.asar 里逆出来了。我按他的记录重画一遍:
GitHub issue #707 的复现者补了一个细节:普通工作区文件有 1MB 的单文件上限,.git/ 下的文件不受这个限制。这一条目前只有他一个人报告。
上面这些都是行为描述,下面按离机范围、密钥归属、开关作用、政策披露四个变量逐个看。
变量一:托运,还是随身
回到那条 V2EX 回复。AI 干活确实要把代码发出去,但「发出去」有两种。
随身:你问一个问题,工具从仓库里挑出相关的几个文件、几百行,随请求发给模型,用完即弃。这是推理必需的,所有工具都这么干。
托运:不管你问什么,先把整个仓库连同几年的提交历史打成一箱,寄到云端仓库存着。
ZCode 这次是托运。它还不只托运你现在打开的项目:另一份清单叫 repo_snapshot_extra_manifest,把你的全局配置文件跨工作区一起带上。
托运和随身的差别落在历史上,当前代码两种方式都会碰到。.git/objects 里有你三年前提交过、后来删掉的那个 API key;.git/logs 里有你还没推远端的分支名,也就是没发布的功能计划;.git/config 里有你内网 GitLab 的主机名和仓库路径。这些东西,随身模式一辈子碰不到。
这种事今年七月已经发生过一次。xAI 的 Grok Build 被安全研究员 cereblab 抓到把整个 git bundle 传到 Google Cloud Storage:一个 12GB 的仓库,模型实际只需要 192KB 上下文,客户端上传了 5.10GiB。后来马斯克承诺删数据并开源。开源之后大家发现上传代码还在源码里,只是服务端加了一个开关把它关了。
六家里谁在托运,谁在随身,文档里能查到的部分我放在最后那张表里。这里先说一句:Claude Code 的 checkpoint 也存文件快照,托运这个动作本身不构成问题。差别出在下一个变量,也就是那份被托运走的快照,它的解密钥匙到底在谁手里。
变量二:钥匙在谁手里
寄存柜有两种。一种钥匙给你,你随时能开;一种钥匙留在柜台,只有柜台能开。
ZCode 的加密是标准的信封加密:文件内容用随机对称密钥走 AES-256-CTR,对称密钥再用 RSA-OAEP 包一层。问题在那把 RSA 公钥的来源。它是服务端在发凭证的时候动态下发的,私钥从来没到过你的机器。博主拿本地所有私钥去解那个信封,全部失败。
也就是说,那个躺在你硬盘上的 313MB,你打不开,ZCode 客户端自己也打不开,只有智谱后端能开。
对比一下 Cursor 的写法。它的数据使用页(9 月 3 日更新)写的是:文件用客户端生成的唯一密钥加密,密钥只在单次请求期间存在于服务器,缓存内容临时,不持久化。钥匙是你这边生成的,请求结束就作废。
Claude Code 更简单:checkpoint 是本地文件快照,随会话存在你机器上,只记录 Claude 自己用编辑工具改过的文件,默认 30 天清理。没有上传这一步,也就没有钥匙的问题。
博主在文章里给了一个判断标准,我觉得比任何道德定性都有用:如果这个功能真是给用户做回滚或跨设备同步的,解密钥匙理应在用户手里,Git 和 Time Machine 都是这么设计的。一把只有服务端能用的钥匙,用途只有一个,就是让服务端能读。
这一条是推断,我把它标出来,判断留给你,后面几个变量都是文档里能直接查到的。
变量三:开关管的是什么
ZCode 设置里有两个看起来相关的开关,博主对照代码查了它们各自管什么:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
打包上传这个后台组件是启动时无条件实例化的,代码里没有读任何用户偏好,唯一门槛是能拿到一个有效的登录 token。issue #707 的复现者把 repoSnapshotIndexingEnabled 设成 false 之后,上传照旧。
博主删掉那个 313MB 的包,半小时后它重新打了一个,重试计数从 564 变成 565。
这个坑不是 ZCode 独有的。开关名字和开关实际管的东西对不上,在其他工具的文档里也有,只是程度不同:
如果你用的是 Cursor:Privacy Mode 管的是「不用于训练」和「零数据保留」,它不阻止你的代码上下文经 Cursor 服务器发给模型。这是文档原文的意思,不是缺陷,但你得知道它不管传输。
如果你用的是 Trae:隐私模式管的是对话内容不用于分析和训练。代码库索引这个功能,文档写的是「临时上传仓库文件计算 embedding,算完永久删除明文」,隐私模式不控制这一步,文档也没说索引能不能关。
如果你用的是 Copilot 个人版:GitHub 官方博客 3 月 25 日发的通知,从 4 月 24 日起,Free、Pro、Pro+ 的交互数据默认用于训练,包括输入、输出、代码片段和上下文,要自己去设置里关。Business 和 Enterprise 不受影响。
开关每家都有,要看的是它管到训练、索引、传输里的哪一层,这一点文档里通常写得到。
变量四:政策写没写
我把 ZCode 的隐私政策(6 月 15 日版,运营主体是一家新加坡公司 JINGSHENG HENGXING TECHNOLOGY)从头翻到尾。收集范围写的是「对话中提交的文本、文件、配置参数、shell 命令」,加设备信息和埋点。全文没有 workspace、repository、snapshot、checkpoint、git 这几个词,没有提阿里云或任何对象存储,「优化计划默认关闭,未主动加入前不用于训练」。
官方文档我也翻了。导航里二十多个页面,没有 checkpoint、时间线、快照或数据隐私专页。Repo Wiki 那页写的是「ZCode 把经过安全规则过滤、按需读取的代码上下文发给你选的模型服务」,产物存本地。Edit History 那页只讲怎么改消息、怎么撤销文件变更,不讲存哪。
官方材料里找不到「整仓上传」这件事,一处都没有。
其他几家在这个变量上的分数不一样。Cursor 有独立的数据使用页,写到了缓存、密钥和第三方模型商的保留期。Claude Code 的 checkpoint 文档写了存哪、留多久、怎么调。Trae 写了索引会临时上传明文。Qoder 的政策提到用了第三方「代码库数据存储」服务,服务器在美国、新加坡、日本,改进用途的数据最长留五年,有 Share & Improve 开关。Copilot 的留存期在 Trust Center 里按访问表面分了几套口径,页面是动态加载的,我没能抓到原文,这里不引具体天数。
写了不代表你会满意。写了至少能拿它对照实际行为。ZCode 这里连对照的起点都没有,隐私政策和官方文档里找不到任何一句能和这次的行为对上。
一张表,四个问题
把四个变量摆在一起:
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表里「文档未说」的格子,我查过,文档里确实没有。这几个格子本身就是信息。
决策规则只有一条:托运可以接受,前提是钥匙在你手里、开关能关、文档写了。四项缺一项,就按这份代码已经不在自己控制范围内来处理,先把历史里出现过的密钥轮换掉。
今天就能做的三件事
装过 ZCode 的,跑这三条:
副作用是 checkpoint 回滚和时间线功能不可用;对话、补全、工具调用不受影响。想恢复用 chflags nouchg。
锁完目录之后还有一件事。如果你的 .git 历史里出现过任何 key、token、内网地址,按已泄露处理,轮换掉。密文你打不开,没法确认里面没有。
没装 ZCode 的,下次引入任何 AI 编码工具之前,先问四个问题,答案要能在文档里指出来:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
回到开头那条回复,AI 读代码和上传代码,有区别吗?
有。AI 读代码是干活必需的。要看的是它读完之后,那份东西放在哪、谁能开、你能不能叫停,这些有没有白纸黑字。
博主是清磁盘时才发现的。你也可以现在打开终端,看一眼自己那个工具的数据目录,~/.zcode、~/.cursor、~/.claude 这类路径,先弄清里面存了什么。
来源与边界
-
ferstar:扒一扒 ZCode 静默上传全量 Git 历史的骚操作,2026-09-18 02:00 发布。上传链路、清单占比、开关分析、防御命令均以该记录为准。 -
zai-org/feedback Issue #707,2026-09-18 06:50 UTC,独立复现,含 1MB 上限不适用于 .git 的补充;截至本文写作无维护者回复。 -
V2EX #1242997:在 v3.12.3.7463 上复现;V2EX #1242973:Windows 与 macOS 双平台复现。 -
ZCode 隐私政策(2026-06-15 版)、Repo Wiki 文档、Edit History 文档、Changelog。 -
Cursor 数据使用说明(2026-09-03 更新)、Claude Code Checkpointing 文档、Trae 隐私模式文档、Qoder 隐私政策(2026-05-12 更新)。Copilot 训练政策引自 GitHub 官方博客 2026-03-25;留存期未能抓到 Trust Center 原文,正文不引具体天数。 -
Grok Build 前例:虎嗅 2026-07-17 转述安全研究员 cereblab 的测试。
本文没有在任何环境复现 ZCode 的上传行为,「钥匙只在服务端」一条为博主逆向所得的单源技术结论。文中对 ZCode 之外各工具的描述均来自其公开文档,文档未写明的项如实标注「文档未说」。截至 2026-09-18 17:37,智谱与 ZCode 团队未对此事作出公开回应

