夜雨聆风学习资料网

ARTICLE · 1040405

开关是假的,代码是真的:AI编程助手被扒出偷偷上传整个Git历史

开关是假的,代码是真的:AI编程助手被扒出偷偷上传整个Git历史

先说个程序员后背发凉的事。

9月18日,一位网名叫 ferstar 的开发者逆向了智谱旗下AI编程桌面端 ZCode,发现一件细思极恐的事:只要你登录着,它就会在后台把你整个工作区悄悄打包、加密、上传——不是你正在编辑的那几个文件,是连 .git 历史一起的完整快照。

他自己的一份商业项目实测:打包文件 313MB,42411 个文件。调查期间,客户端重试上传了 564 次。

帖子13个小时27.6万阅读,Hacker News 200多赞。当天晚上,ZCode 发了情况说明道歉。但我把逆向报告和官方说明对着看完,发现这事真正值得琢磨的地方,根本不是"又一家公司偷数据"。

上传的到底是什么:你删掉的东西,Git都记得

先看那313MB里装了什么,这是整件事最吓人的部分:

内容
大小
占比
.git/lfs/
(大文件缓存)
196.1MB
56.8%
.git/objects/
(Git对象库)
102.2MB
29.6%
.git/logs/
(操作日志)
0.6MB
0.2%
源码和文档
46.2MB
13.4%

光 .git 目录就占了 86.6%。

外行人可能不明白,传Git历史为什么比传源码严重。因为你电脑里的工作目录,只是项目"此刻的样子";而 .git 是这个项目从第一天起的完整家谱写史记——

你上个礼拜提交后又删掉的那行 API 密钥,还在里面;你以为没人知道的未推送分支,分支名可能写着下个版本的机密功能代号,还在里面;.git/config 里的内网GitLab地址、主机名、仓库路径,全在里面。

传工作区文件,是拿走你桌面上摊开的纸。传整个Git历史,是连你碎掉扔掉、烧成灰的草稿一起端走。

加密不是在保护你,是在防你

更耐人寻味的是加密方式。

ZCode 用的是信封加密:本地拿一个对称密钥加密包,再用服务器在上传时下发的 RSA 公钥包住这个密钥,然后直传阿里云OSS。对应的RSA私钥,只存在Z.ai的云端。

ferstar 拿自己机器上所有私钥试了一遍,解不开。也就是说,这份313MB的密文躺在你自己硬盘上,你解不开,客户端自己也解不开,只有服务器能解。

他原话说得很到位:"一把只有服务器能用的钥匙,用途只有一个——保证服务器随时能读你的代码。"

这话听着像阴谋论,但技术上没毛病。如果上传快照真是为了帮你做"历史版本回退",那密钥本该你也持有一份,不然你回滚个什么?加密保护的是"传输过程不被第三方偷看",但这个密钥设计把数据的主人——你本人——划到了"第三方"那边。

最骚的是:设置里的开关,全是摆设

正常人遇到这事,第一反应是去设置里关掉。ferstar 把UI开关和代码逐一对照,结果:

"优化体验"开关(optimizeAgentExperienceEnabled):只管数据是否被拿去训练模型,快照照传

"仓库快照索引"开关(repoSnapshotIndexingEnabled):只管服务器端建不建索引,本地打包和上传照做

因为采集逻辑根本不在AI Agent的工具链里。有人从ZCode扒出过131KB的系统提示词和31个工具清单——里面没有任何上传、快照、遥测工具,一个字都没提阿里云和OSS。真正干这事的,是一个宿主层的sidecar进程:开机登录就无条件启动,每次你提问前、任务完成时都触发一次(实测单次会话触发62次),Agent自己都不知道它的存在。

所以你问AI"你会不会上传我的代码",它诚恳地告诉你不会——它没撒谎,它是真不知道。

删掉本地待传的包也没用,半小时内它重新打包了一份新的313MB,重试计数+1。

官方回应:解释了,但没完全解释

事情发酵后,ZCode 9月18日发了情况说明,每日经济新闻做了报道。官方说法是这样的:

问题出在"代码库索引"功能,用于支持会话检查点恢复、历史版本回退和 Repo Wiki(代码仓库知识库)。其中 Repo Wiki 在云端生成知识库页面时会触发仓库数据上传,页面生成完数据立即销毁、不留存;因为这个功能上线初期默认开启,影响了部分用户,现在已修复。并宣布:近期开源 ZCode 代码库、引入第三方评估机构审查,给全体用户补偿一次周额度重置。

态度可以,动作也对路。但拿这份说明去对逆向报告,有三个问题悬着:

第一,官方把上传归因于 Repo Wiki 这一个功能,但 ferstar 观察到的是登录即触发、每次提问都打包,范围远大于"生成Wiki页面时"。到底是单一功能越界,还是整条快照管线都在传,需要更细的说明。

第二,"云端用完即销毁"是句无法验证的承诺——私钥既然只在云端,数据到了云端发生过什么,用户没有任何技术手段核实。

第三,也是我最在意的:隐私政策、FAQ、更新日志里,此前只字未提会打包上传整个工作区和Git历史,只说了"会收集对话中提交的文本、文件和代码"。这是所有AI编程工具的标准话术,但它描述的范围和实际发生的事,差着一个数量级。

不是第一次了,但这次性质不一样

两个月前,xAI 的 Grok Build 也被发现默认上传完整Git提交历史,有个用户在home目录下跑,SSH密钥、密码管理器数据库、照片全进了上传路径,186轮对话全程在传。

但两件事看着像,性质不同。Grok 那次是:上传记录大大咧咧写在自己日志里,事后补了关闭开关,属于失控的默认设置。ZCode 这次的指纹更难看:只有服务器能解的加密、代码层面验证过关不掉的开关、删了还传564次、隐私政策全程沉默。

疏忽是"我家大门忘了锁",刻意是"我锁了门,但钥匙只有我有,还不告诉你有这扇门"。

你现在可以做的三件事

如果你在用 ZCode,或者任何闭源AI编程助手,下面是可直接照做的动作:

1. 物理掐断快照目录。 快照待传区在 ~/.zcode/v2/checkpoints(Mac/Linux)或 %USERPROFILE%\.zcode\v2\checkpoints(Windows)。让这个目录在内核层面不可写,它就传不了:

Linux:

命令
sudo chattr +i ~/.zcode/v2/checkpoints

Mac:

命令
chflags uchg ~/.zcode/v2/checkpoints

Windows:用 icacls 对该目录拒绝写入

代价是检查点回退功能用不了——一个本来就要靠上传你代码才能用的功能,不要也罢。聊天、补全、工具调用不受影响。

2. 看它到底在跟谁通信。 Mac 用 lsof -i -P | grep -i zcode,Windows 用资源监视器或防火墙看出站连接。凡是持续连着陌生对象存储域名的编程工具,都值得多问一句。

3. 最重要的一条:敏感仓库不要进闭源harness。 这点和模型开不开源没关系——GLM权重是开源的,但ZCode这个壳是闭源的,开源的是模型,不是套在模型外面那只手。商业项目、带密钥的仓库,老老实实用开源Agent接自托管端点;已经在ZCode里打开过敏感仓库的,去轮换一遍API密钥,删掉的密钥也算泄露。

这件事真正教会我们的一课

本地化大模型这两年最性感的叙事是:模型在自己显卡上跑,没人能关停你,没有按token计费。ZCode这一刀,把这个幻觉扎破了——

模型只是信任链的一环。模型外面那层运行时——桌面App、更新通道、宿主进程——同样在信任面上。一个云通话的壳子,套着本地跑的模型,那不叫本地。

以后评估任何AI编程工具,就问两个问题:它登录后在往外传什么?它存下来的东西,谁能解开?

不要看它怎么说,扒开看它怎么做。代码不会撒谎,开关会。

硅基聊斋编辑部

相关学习资料