智谱 ZCode 被曝静默上传整个代码库,git 历史一并打包

太长不看版本

  • 智谱 ZCode 被曝登录后自动上传全量工作区快照,.git 占比 86.6% 到 98.9%
  • 上传走信封加密,私钥只在服务端,你本地和客户端自己都解不开
  • UI 里两个相关开关都不控制上传,采集决定权在服务端
  • 两个月前 xAI 的 Grok Build 出过同类事件,最后靠服务端开关叫停
  • 自查四步,从本地目录体积查到加密密钥归属
  • 已经传上去的数据拿不回来,优先动作是轮换历史凭据

9 月 18 日凌晨,开发者 ferstar 在清理磁盘。

他发现 ~/.zcode 占了 700 多 MB。ZCode 是智谱(Z.ai)官方的 AI 编程客户端,这个目录本该只放配置和缓存。

点进 v2/checkpoints/,里面躺着一个 313MB 的 .enc 加密文件,还有一份状态文件。工作区路径指向一个商业项目,345MB 的原始内容被压成 313MB,标记为 baseline,也就是全量快照,失败计数写着 564。

他把取证过程写成了博客,中午发到 X。当天下午,V2EX 出现第一条讨论帖。

发生了什么

  • 凌晨,ferstar 博客发布了中英文两个版本的《扒一扒 ZCode 静默上传全量 Git 历史的骚操作》(链接见文章末尾),附有本机物证和代码逆向。
  • 12:35,ferstar 在 X 上 @ 官方账号,列出三条指控。
  • 13:00 到 15:00 之间,V2EX 出现一条帖子《有用 zcode 的,马上关闭》,好几个人现场自查,当场确认中招。
  • 15:00 前后,Windows 侧有人发出完整复现,数出 32 个工作区被采过快照。
  • 15:20,一个 14K 粉的账号把这件事定性为「紧急」,呼吁先停用。25 分钟后,科技媒体发稿。
  • 16:44,一位博主用 Claude 在 macOS 上重跑了一遍取证流程。他给的判断是,情况属实,而且不是「会」,是「已经」。
  • 17:40,官方仍然没有公开说明,隐私政策页面也没有改动。

它到底干了什么

这条链路的每一步都能在本机复现。

客户端每次发送 Prompt 之前,都会向 zcode.z.ai 申请一次上传凭证。服务端返回快照 ID / RSA 公钥 / OSS 表单凭证。客户端随后在本地打包 tar.gz,用 AES-256-CTR 加密内容,再用 RSA-OAEP 把这把对称密钥包一层。最后,包裹直接 POST 到阿里云 OSS。
ZCode静默快照上传链路

这一步绕过了智谱自己的业务服务器。 几百 MB 到上 GB 的流量不占它带宽。bucket 域名由服务端动态下发,从不写进客户端日志,想靠改 hosts 断掉上传是走不通的。

加密了,但钥匙不在你手里。 这是信封加密,保护的是传输和静态存储,它不等于端到端加密,也不决定解密权归谁。ferstar 拿本机所有私钥去解那几个信封,全部失败。本地那份密文,你打不开,ZCode 客户端自己也打不开——只有智谱后端能解。

快照里 .git 才是主角。 打包时留在本地的文件清单是明文的,这一点你自己就能验证。ferstar 统计了一份 42,411 个文件的清单,.git 一个目录占了 86.6%。其他样本更极端,有 93.9%、98.5%,Windows 侧一份快照里 .git98.91%

.git 比「当前代码」危险得多。

Git 只追加。你在某次提交里删掉 .env、把口令挪走,旧内容仍然躺在 objects 里。拿到完整 .git,一条 git log --all --diff-filter=D 就能把删过的敏感文件逐个点名捞回来。

reflog 还会暴露你尚未推送的分支名,等于暴露没公开的研发动向。.git/config 里写着内部 GitLab 域名和仓库路径。

一位复核者翻自己仓库的时候,发现了 .git/filter-repo 目录。这个目录说明该仓库做过历史重写,通常正是为了清除敏感数据。他刻意清理掉的东西,恰恰被带走了。

文件筛选的判定顺序也偏着 .git。它是一条顺序判定链,.git 的放行排在所有排除规则之前,密钥过滤器和 1 MB 的体积上限对它都不生效。那位复核者仓库里有个 .asc 文件就这么漏进了清单,幸好是一把公钥。

关不掉。 UI 里有两个看起来相关的开关,实测都不管上传。「优化体验」管的是数据要不要用于训练。「仓库快照索引」管的是服务端拿到快照后要不要建索引。

那位复核者查了自己机器 9 月 13 日到 18 日的日志,这个字段出现 1,339 次,全是 false。而那几份快照,全造在这几天里。

决定权不在本地。客户端每次 Prompt 都无条件去申请凭证,服务端发就采,不发就不采。这个请求不缓存、不写日志,失败也没有提示。你的电脑上没有任何一个开关能否决它。

代码层面也一样。负责快照捕获与上传的模块在启动时无条件实例化,没有任何针对用户配置的判断。

删也删不掉。ferstar 删掉待传的包之后,半小时内客户端重新打包了一份,失败计数从 564 变成 565。

ZCode 隐私政策里写的收集范围是「你通过对话提交给我们的代码」,原文是 through conversation。后台快照不是通过对话提交的,这条行为落在条款描述的范围之外。


两个月前,同一件事发生过

2026 年 7 月,xAI 的 Grok Build 出过同一类问题,把完整 Git 仓库打包上传。

Grok Build 传的目标是 Google Cloud Storage 上一个叫 grok-code-session-traces 的桶,而且是明文,.env 里的 API_KEYDB_PASSWORD 直接可见。

量级的差距有实测数据。研究者建了一个 12 GB 的测试仓库,里面的文件模型根本不会去读。结果上传通道发出 5.10 GiB,模型对话通道只收到 192 KB,差了约 27,800 倍。他还放了一个标记文件,明确要求不要读取,上传后照样能从包里完整还原出来。传出去的内容,跟 agent 实际读了什么无关。

关开关也没用:研究者把「改进模型」关掉重跑,上传照旧。

Grok Build 是靠服务端下发的开关叫停的,客户端版本都没更新。 xAI 随后给 CLI 加了个 /privacy 命令,但抓包验证认为它管的是数据保留,拦不住发送。

这组对照说明,叫停一个全局开关就够了,「技术上来不及修」这个说法根本站不住。

Claude Code 和 Cursor 同样是云端产品,同样会把实际打开的文件发出去,差别在于收集范围——一个按需读片段,一个整仓打包。我只想说明并非「国外工具就干净」。


怎么自查

原始链接里,几位复核者用的方法互相独立,下面按省力程度排。

一、30 秒版本,先看三个地方。

本地目录体积。macOS 是 ~/.zcode/v2/checkpoints/,Windows 是 %USERPROFILE%\.zcode\v2\checkpoints。ferstar 这里是 303MB;Windows 侧那位复核者数出 32 个工作区被采过快照,最大单包 107 MB。任何 AI 客户端都有自己的数据根目录,du -sh 看一眼就够。

状态文件。每个工作区一个目录,里面有一份状态文件。重点看四个字段:kind 是不是 baselinefailureCount 是多少,有没有 lastAcceptedManifestHash。最后这个字段出现,通常意味着这份快照已经被服务端接受。

出站流量。那位写独立复核的博主是在发现「为什么这几天流量跑那么快」之后,才挂上监控去定位的;V2EX 一位写 Rust 的开发者是从流量里数出「一周上传 33G」的。

二、再看明文清单。

打开 manifests/,看哪些文件进了包,重点看 .git 占多少,而不是工作区。如果 .git/objects/.git/lfs/.git/logs/ 都在清单里,完整历史就被带走了。这一步不依赖任何厂商口径。

三、把这一步外包给另一个 Agent,可以,但要分清三种用法。

原始链接里确实有人走了这条捷径,效果差别很大。

有效的一种,是让另一个 Agent 按原文路线跑一遍取证。那位独立复核的博主就是这么做的,他自己写的是「我立刻在自己的 Mac 上,让 Claude 按他的路线把取证重跑了一遍」,文末也注明「检查借助 Claude 完成」。这比自己啃逆向代码省力得多。

参考意义有限的一种,是只问它「ZCode 安不安全」。V2EX 有人「让 deepseek 核实了一下」,X 上也有人说「让 deepseek 分析了 zcode,它也说有这个风险」。这只是模型意见,不是证据。

最不建议的一种,是用 ZCode 查自己。V2EX 有一位「让 zcode glm5.3 分析了」,等于让被质疑的一方自查。

另外有人提过更彻底的办法:拦截请求,把服务端下发的公钥换成自己生成的,等它打包完再用自己的私钥解包。这条路径目前只有提议,没有见到验证记录。


怎么避免

如果你自查发现中招,下面这个顺序来自原始链接里几位复核者的处理办法。

先假设它已经传上去了。 密文你解不开,也拿不回来,纠结「传没传」没有意义。Windows 侧那位复核者已经写清楚,已上传的内容拿不回来,能做的只是确认本地不再新增。

清掉待传的包。 那位独立复核的博主把这条排在建议第一位:清掉 ~/.zcode/v2/checkpoints/*/pending/ 下的密文。理由是你唯一能自主控制的就是这个环节——服务端一恢复下发凭证,它就会续传。

历史里出现过的凭据全部轮换。 .env 里的 API key 和数据库口令,还有 CI token 和任何写进过提交的密钥。密钥过滤器只看文件名,对 Git 历史无效。Windows 侧另外发现 model-providers.jsonprovider_config.json 里的 API key 是明文存放,那个目录别整体同步到网盘。

要彻底阻断,就锁目录。 ferstar 给的方案是在文件系统层加不变锁,让快照写不出文件。macOS 是清空目录后 chflags uchg ~/.zcode/v2/checkpoints,Linux 是 sudo chattr +i ~/.zcode/v2/checkpoints,Windows 是那位复核者给的 icacls 拒绝写入。验证方式统一:touchNew-Item 建个新文件,应该报权限错误。代价是检查点回滚不可用,日常补全、对话和工具调用不受影响。想恢复,macOS 用 chflags nouchg,Linux 用 chattr -i,Windows 用 icacls /remove:d

那位 Windows 复核者还多做了一层,在 app.asar 里把快照的捕获函数做等长字节替换,直接改成提前返回。这一步要改客户端文件,属于进阶操作,他只推荐给看得懂 ASAR 结构的人。

hosts 屏蔽不推荐。 那位独立复核的博主专门提了这条:登录接口同域,一屏蔽会一起干掉。

最后才是卸载,或者换台机器跑。 那位独立复核的博主自己的处置是:主力开发环境先限制程序联网、保全本地记录,再卸载,重要仓库不再交给它;剩下的额度换到一台隔离开发机上烧完。

社区里还有几种处理方式。V2EX 上至少六条「已卸载」,有人去工信部投诉,有人拟了对中央网信办和香港私隐专员公署的投诉信,有人说周一就卖出智谱股票,也有人打算退掉刚买的年费。反方向的理由也有人讲,「该传的都传完了,卸载也没什么用」。

官方状态。 截至 9 月 18 日傍晚,官方没有任何公开说明,隐私政策页面也没有改动。有两位观察者发现,上午 11:55 之后本地没有再新增快照包——这只是观察,不是证据。


最后

如果一个功能的开关从来不在用户手里,用户凭什么认为自己有边界?

7 月 Grok Build 出问题人的那次,关停动作在服务端完成。这一次,采集的决定权同样在服务端——厂商有能力在不发新版的情况下关掉它。

用户侧能做的事只有一件,审计自己的出站流量。 或者至少知道,钥匙在谁手里。


参考来源

  1. 扒一扒 ZCode 静默上传全量 Git 历史的骚操作 / ferstar 博客 / https://blog.ferstar.org/posts/zcode-silent-workspace-snapshot-upload/
  2. ferstar 的 X 帖子 / @ferstar_org / https://x.com/ferstar_org/status/2100805861002355154
  3. 智谱 ZCode,你打包上传我的代码仓库干什么? / 老冯云数(网易号)/ https://dy.163.com/article/L74FCG1G0556CSY5.html
  4. Urgent!!! ZCode silently uploads full-repository snapshots / baokezhang(NodeLoc)/ https://www.nodeloc.com/t/topic/109590
  5. 有用 zcode 的,马上关闭!它打包上传了你整个代码库! / V2EX 主讨论帖 / https://www.v2ex.com/t/1242973
  6. What xAI’s Grok Build CLI Actually Sends to xAI: A Wire-Level Analysis / cereblab(gist)/ https://gist.github.com/cereblab/dc9a40bc26120f4540e4e09b75ffb547
  7. ZCode 隐私政策(2026-06-15 版)/ zcode.z.ai
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值