ARTICLE · 1056363
AI 编程工具传走的不是源码,是你以为早删掉的那部分
删掉的东西,其实从来没走。
这周有个独立开发者清磁盘,看见主目录下一个隐藏文件夹占了七百多兆。点进去,是个 313 兆的加密文件,旁边躺着一份元数据,记着一个字段:上传失败 564 次。
五百六十四次。没有一次是他主动发起的。
那个包里一共 42411 个文件,其中 86.6% 不是源码,是 .git 目录。
事情发生在智谱的 AI 编程客户端 ZCode 上,9 月 18 日被开发者 ferstar 逆向拆了出来。这两天中文技术圈转的多是"静默上传"这类词,但真正让我坐不住的不是上传本身,是那 86.6%。
那个包里装的是什么
大多数人对"代码泄露"的想象,是有人拿到了我现在的工程文件。这个包麻烦得多。
.git 存的是项目的完整版本历史:每一次提交、每一个曾经存在又被删掉的文件、每一条没推到远端的分支。你在源码里早就删掉的数据库口令,在半年多前的某次提交里大概率还活着;图省事硬写在配置里、后来又改掉的测试密钥,也在里面。
所以它打包的不是"当前状态",是"整个过程"。承明科技 9 月 19 日发出的函件能佐证:完整源代码、含已删除提交的版本历史、数据库口令、接口密钥、云服务凭证,还有员工与用户的个人信息。
源码泄露还能重写,历史里埋着的凭证只能一个个去轮换。
还有一层:打包成 tar 时,包含 .git 的规则排在排除规则前面。历史是先被抓进来、再谈过滤的,而过滤压根没发生。
界面上那个开关,管的是另一件事
我看到第二份复现报告时格外难受。
9 月 18 日当天,另一位开发者在自己的机器上独立复现了同样的现象,并多做了一件事——查客户端自己的日志。日志里那个开关被记为关闭状态 1339 次,而快照在同一段时间里照写不误。
承明科技的说法更直接:他们处在隐私模式,从没打开过索引功能,数据照样被传走。厂商方面当日下午的对外说明把原因归到"代码库索引"上,说这功能上线初期默认为开启,用来支撑检查点恢复、版本回退和 Repo Wiki 页面。
这里有个典型错位:用户以为的"隐私开关",和真正控制上传的那个开关,不是同一个东西。前者管数据是否用于训练和服务端索引,后者是功能自带的采集链路。设置页上能看到的,往往只有前者。
所以"我关掉了隐私模式"这句话,在这件事里不构成保护。
加密在这里不是保护,是一道单向门
技术细节值得说清楚,因为它反直觉。
客户端先向服务端要上传凭证,服务端返回对象存储的签名和一把临时 RSA 公钥;本地生成对称密钥,用 AES-256-CTR 流式加密整个包,再用那把公钥把对称密钥包起来,直传到对象存储。
这是标准的信封加密,做得也算规范。问题出在方向:解开它需要的私钥,自始至终只在云端。
结果是那个 313 兆的文件你打不开,客户端也打不开,你没法自己验一遍里面有什么。外界能知道文件数和 .git 占比,靠的是那份明文清单——清单之外,你对被打包的内容既没有查看权,也没有删除权。
这三天走到了哪一步
时间线摆一下,方便判断现状:
9 月 18 日凌晨分析帖发出,当日下午厂商致歉,说明数据生成 Wiki 页面后立即销毁,承诺开源代码、引入第三方审查。
9 月 19 日晚,太原承明科技称 8 月 28 日至 9 月 14 日公司 6 个工作区被打包上传,单包体量到 391.94 兆,并指出客户端请求指向的运营主体注册在新加坡。
9 月 21 日,智谱宣布 ZCode 正式开源,绿盟科技与另一家通信行业研究机构完成合规审计,确认相关存储桶及数据对象已删除、处于云端零数据状态;v3.14.0 移除了 Repo Wiki 和本地仓库快照的上传链路,并承诺 MaaS 平台上线"数据内容不留存"。
v3.14.0 的更新日志里,这条修复写的是"Fixed an issue with abnormal uploads in the repository wiki",夹在十六条 bug 修复中间。
响应算快,开源和第三方审计也是实打实的动作。但把涉及用户核心资产的事记成一行 bug,这个处理方式比 bug 本身更值得记着。
现在能做的几件具体的事
不讲道理,只给能马上执行的动作:
把主目录下的隐藏目录过一遍。 macOS 和 Linux 上 du -sh ~/.zcode ~/.codex ~/.cursor ~/.claude 2>/dev/null,Windows 上用 PowerShell 看 $env:USERPROFILE 下的隐藏项。任何 AI 工具留下几百兆快照目录,都值得当场查清楚。
更新到 v3.14.0 或更高版本。 低版本里的上传链路还在。
别只用界面开关做判断。 想知道一个客户端在发什么,看出站连接比看设置页准。macOS 上 Little Snitch、LuLu 能给到出站域名白名单,Windows 自身的出站规则也能配。
把历史里出现过的凭证一律当成已经泄露。 数据库口令、接口密钥、云服务 access key,只要曾经进过提交,这次就按暴露处理去轮换。真要从历史里清掉,用 git filter-repo 或 BFG,清完还得强推并通知协作者。
敏感工程做物理隔离。 .gitignore 挡不住这种打包——它压根不读你的忽略规则。接私活、涉及甲方资料的项目,单独开一个系统账户或单独的机器,比任何配置都管用。
推己及人。 这十周内已有两家厂商的编程 Agent 被抓到打包整个仓库,上一家七十二小时内开源了代码。ZCode 不是孤例。
我改掉的一个判断习惯
以前我看一个 AI 工具靠不靠谱,就翻设置页有没有"隐私模式"。有,就放心用。
这次之后顺序反过来了:先看它往哪些域名发包、本地留了多大缓存、有没有看不懂的加密文件,设置页留到第二步。
功能默认开启、后台静默执行、加密后用户无法自证——这三件事凑在一起,就不是一次疏忽能解释的。你可以接受一个工具读你的文件,但那应该是你点过同意、看得见进度、随时能停的过程,而不是一个躺在隐藏目录里、连你自己都打不开的压缩包。
工具能不能干活,看评测就知道;工具会不会动你的东西,看出网行为才知道。这两件事我以前只做了前一件。
你平时怎么判断一个 AI 工具会不会动你的本地文件?
A. 看设置里有没有隐私开关B. 装完就一直用,从没查过C. 会看它连了哪些域名、本地留了什么
评论区报个字母。选 B 的朋友建议今晚花两分钟跑一下那条 du 命令,结果可能会让你意外。
上篇说好要聊 Jev 那类只做判断的小模型,那篇还在跑对比,下周三补上:同一份长任务,一组用通用大模型逐步生成,一组先用判断模型判成败再决定要不要继续,耗时和出错次数我都记下来了。
*文中技术细节来自开发者 ferstar 的逆向分析帖与第二位复现者的日志核对,时间线与处置进展来自厂商对外说明、承明科技函件及媒体公开报道。*
标签:#AI编程 #隐私合规 #ZCode #避坑指南 #开发者工具