智谱ZCode被扒"静默打包上传完整Git历史",当天道歉、宣布开源:去领周末3亿Token或续费Coding Plan之前,先做三步自查、锁两行命令、算清三本账

源自232位全网作者

01:05

今天下午到晚上,中文程序员的时间线被同一件事刷屏:智谱官方 AI 编程客户端 ZCode,被扒出只要你在登录状态,就会在后台把整个工作区——重点是完整的 .git 历史——静默打包加密,直传阿里云 OSS。 #智谱ZCode偷传用户数据# 冲上热搜,官方当天 17:43 先在飞书用户群道歉,归因是「代码库索引」功能,晚上正式发致歉声明,口径是已修复、将开源、补偿额度重置。ferstar 博客微博微博

如果你正在用 ZCode,或者前几天刚被"周末 3 亿 Token"种草准备下载,这篇帮你把三件事一次说清:它到底传了什么、你关不关得掉、补偿和替代方案怎么选。

一、先看实锤:不是"可能会传",是"已经传了"

事情的起点很朴素。9 月 18 日凌晨,开发者 ferstar 清理磁盘时发现 ZCode 的本地数据目录 `~/.zcode` 占了 700 多 MB,顺着扒下去,在 `v2/checkpoints/` 里翻出一个 313 MB 的加密压缩包,旁边的状态文件写着:工作区是一个商业项目,345 MB 内容被打包成 313 MB 密文,类型是 baseline(全量快照),上传失败次数 564 次——也就是说它一直在锲而不舍地重试往云端传。ferstar 博客

逆向客户端代码后,整条上传链路被还原出来:客户端先向 zcode.z.ai 申请上传凭证,拿到 OSS 表单签名和一把 RSA 公钥;然后在本地把工作区打成 tar.gz、AES-256-CTR 加密、用这把公钥包裹密钥,不经过智谱业务服务器,直接表单直传阿里云 OSS知乎

智谱ZCode被扒

最讽刺的地方在密钥上:这把 RSA 公钥是服务端临时下发的,私钥从头到尾只在云端。你硬盘上那份几百兆的密文,你自己打不开,ZCode 客户端自己也打不开,全世界只有智谱后端能解。如果这真是给你做断点恢复或跨设备同步的,密钥理应绑在你本地——一把只有服务端能解的钥匙,很难解释成"备份"。ferstar 博客

当晚,知乎作者冯若航(vonng)在 macOS 的 ZCode 3.12.3 上按同样路线独立复现了一遍取证,结论是"属实,而且不是’会’,是’已经’":他的机器上有四个工作区留下了快照记录,其中一份写入了"上传被接受"的状态标记,另外两份快照的文件清单里,.git 的字节占比分别达到 93.9% 和 98.5%知乎

二、传走的不只是代码,是你代码的"族谱"

密文解不开,但快照生成时留下的文件清单(manifest)是明文的。ferstar 统计了那份包含 42,411 个文件的清单:

内容

体积

占比

.git/lfs/(LFS 大文件缓存)

196.1 MB

56.8%

.git/objects/(完整 Git 历史对象库)

102.2 MB

29.6%

.git/logs/(reflog 操作轨迹)

0.6 MB

0.2%

其余源码与文档

~46.2 MB

13.4%

.git 一个目录占了 86.6%。 这意味着云端拿到的不是你当前写的那几个文件,而是这个仓库自创建以来的全部历史:哪怕你早就删掉的敏感配置和历史密钥、本地还没推远端的分支名(直接暴露未公开的研发动向)、.git/config 里配的内网 GitLab 域名,全都一锅端。ferstar 博客

智谱ZCode被扒

更扎心的是筛选逻辑。冯若航把代码里的文件过滤链拆开看:.git 的放行排在所有排除规则之前——密钥过滤器、1 MB 体积上限,对 .git 下的任何东西永远不生效。一个 137 MB 的 packfile 可以整包带走;谁要是往仓库里提交过一次私钥,哪怕当天就 git rm 掉、哪怕后来跑过 filter-repo 重写历史,它都会随 .git/objects 原样出去。他自己扫了 78,141 个 Git 对象,确认签名私钥没进包——用他的话说,“我只是运气好”,这个设计让出不出事只取决于运气。知乎

智谱ZCode被扒

顺带一提:除了工作区,它还会把 ZCode 的全局配置文件(比如 settings.behavior.json)跨工作区打包,随每次快照一起上传;触发点是每次发 Prompt 前和任务结束时,单个活跃会话里最多产生 62 次快照捕获。ferstar 博客

三、你关掉的开关,根本管不着它

很多人的第一反应是去设置里找开关。ferstar 把两个设置项和代码逻辑逐一对过:

开关

你以为它管

实际管

优化体验(optimizeAgentExperienceEnabled)

数据采集/遥测上传

只管要不要拿你的数据训练模型,关了照样抓快照上传

仓库快照索引(repoSnapshotIndexingEnabled)

快照功能本身

只管服务端拿到快照后建不建索引,本地打包上传一点不落

负责快照捕获和上传的模块是启动时无条件实例化的,代码里没有任何针对用户配置的判断,唯一的要求就是登录态。换句话说:只要你登录了,这个机制就是常开的,UI 里没有任何开关能关掉它。 评论区一句高赞总结很到位:开关只是关掉了摄像头灯,录像没停。ferstar 博客

隐私政策层面,ZCode 的政策里只写了会收集"对话中提交的文本、文件和代码"——这是 AI 助手调模型推理的常规操作,各家都一样;但通篇没提"整个工作区连同完整 Git 历史静默打包上传",官方文档和更新日志也没有任何说明。ferstar 博客

四、三步自查:你的机器中没中招

别凭感觉,直接看目录(macOS / Linux 通用):

  1. 看体积:`du -sh ~/.zcode`。如果几百 MB 起步、`v2/checkpoints/` 里躺着 `.enc` 文件,说明本地快照机制在跑。

  2. 看状态文件:打开 `~/.zcode/v2/checkpoints/` 下的状态 JSON,重点看三个字段:`workspacePath`(它扫了你哪个项目)、`failureCount`(重试次数,不为 0 说明一直在尝试上传)、`lastAcceptedManifestHash`(出现这个字段,对应上传已被服务端接受的分支——这是"已经传上去"的判定依据,冯若航机器上就有一份)。

  3. 看日志:客户端日志里搜 snapshot 相关记录,能看到快照捕获和上传动作的频次。

智谱ZCode被扒

只想确认"传没传上去",第 2 步是关键。当然,"没传上去"只是这台机器这次没传成,只要机制还在,下一次随时可以成功。

五、两行命令,把它锁进笼子

手动删没用——ferstar 删过一次,半小时后新的 313 MB 包就重新打好了,失败计数从 564 跳到 565。最直接有效的办法是在文件系统层加"不变锁",从内核层面禁止写入:

macOS:

```bash
rm -rf ~/.zcode/v2/checkpoints && mkdir -p ~/.zcode/v2/checkpoints
chflags uchg ~/.zcode/v2/checkpoints
```

Linux:

```bash
rm -rf ~/.zcode/v2/checkpoints && mkdir -p ~/.zcode/v2/checkpoints
sudo chattr +i ~/.zcode/v2/checkpoints
```

验证方法:`touch ~/.zcode/v2/checkpoints/test`,报 Operation not permitted 就是锁上了。代价是 ZCode 的"检查点回滚/时间线"功能失效(这功能本来就是拿全量代码上云换的),日常的代码补全、对话、工具调用完全正常。想恢复,macOS 用 `chflags nouchg`、Linux 用 `sudo chattr -i` 解锁即可。官方修复版发布后,记得先解锁再升级,否则更新可能装不进去。

六、补偿这笔账,四类人感受完全不同

官方的补偿是送一次周额度重置,外加本周末照常发放的 Weekend Build 3 亿 Token(模型 GLM-5.3-Fl 系列)。小红书

智谱ZCode被扒

听起来不少,放到具体人头上:

  1. 重度订阅用户:一张重置卡相当于把本周烧完的额度回满一次。有用户吐槽,16 号晚上开始免费任务已经从 3 个减到 1 个,这么大舆论只给了 1 张重置卡,还不如平时一个小活动给的多。微博

  2. 只登录没订阅的免费党:周额度重置对你们基本无感——你没有付费周额度可重置。巍峰说得更直白,只是登录了没订阅、周末领鸡蛋或者用 BYOK 的用户,就倒霉了呗。微博

  3. BYOK 用户(自带 API Key):同上,重置卡跟你没关系,但你被扫的工作区一个字节都没少。

  4. 公司/商业项目用户:这不是补偿能覆盖的问题。如果自查发现 `lastAcceptedManifestHash` 存在,该走的流程是:排一遍 Git 历史里曾经提交过的凭据(数据库密码、API Key、签名私钥),全部轮换;内部 GitLab 域名、未公开分支名暴露过,按自家保密制度评估是否需要上报。

七、还能不能继续用:模型没出事,出事的是客户端

这里要把两件事分开:GLM 5.3 这代模型和 Coding Plan 订阅本身没翻车——冯若航复现取证前刚夸过"GLM 5.3 这代模型是真能打,Coding Plan 便宜",翻车的是 ZCode 这个桌面客户端的快照设计。所以"要不要退订 GLM"和"要不要继续用 ZCode"是两个独立决策。

  • 只写个人开源/学习项目:代码本来就是公开给人看的,主要损失是未推送分支名暴露动向。锁目录继续用,或等修复版+开源版验证后再放开,都行。

  • 有商业项目在机器上:先自查、先轮换历史凭据,然后要么锁目录,要么把 ZCode 换成开源客户端接 GLM 的 API。

  • 涉敏单位、签了保密协议的项目:不用纠结,卸载并清理 `~/.zcode`。评论区已经有人开始担心"要是敏感部门用了这个就废了"。

替代方案这边,事件反而催生了一个"合订本时刻":智谱宣布将开源 ZCode,MiniMax Code 跟进宣布开源,Kimi Code、DeepSeek 的 Harness 本来就是开源的。 有知乎用户总结,等于 deepseek、mimo、qwen、kimi、glm、minimax 的编程客户端一夜之间全开源了。 高权限本地 Agent 客户端,开源从加分项变成了及格线。 两个月前 Grok Build 翻过同样的车,马斯克靠最快速度开源把口碑救了回来,这次智谱几乎是照着这条路径走的。微博知乎知乎

八、接下来盯这三个信号,比盯情绪有用

  1. 开源是否兑现、范围够不够:上传快照模块在不在开源代码里、社区能不能编译出"无快照版"。开源但不包含问题模块,等于没开。

  2. 隐私政策是否改:把"工作区快照"的范围、去向、保存期限白纸黑字写进去,并且把默认行为改成 opt-in(先问再传),而不是修完继续默认开。

  3. 社区复测:锁目录大法在后续版本是否依然有效、官方是否给出一个真正能关掉快照的设置项。互联网没有记忆,但你的 .git 有——下一次舆情靠羊毛力度翻篇之前,先看这三条落地了没有。

写在最后

用 AI 写代码,模型推理必然要吃代码上下文,这一点大家心里都有数。这次越线的地方不在"给模型看代码",而在三个词:不告而取、拿全部、不给关——数据范围扩大了用户不知情,想拒绝找不到开关,密钥还只在服务端手里。正如那篇取证博客结尾写的:工具没有原罪,但红线应该由使用者自己划;既然软件里关不掉,那就用操作系统的锁把它关进笼子里。ferstar 博客

周末那 3 亿 Token 该领可以领,但在官方把上面三个信号落地之前,先把 `~/.zcode/v2/checkpoints` 锁上,再打开它。

内容由AI生成
1
扫一下,分享更方便,购买更轻松
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

最新文章 热门文章