ZCode 快照事件之后:开源能挽回多少信任
开发者 ferstar 逆向发现,智谱的编程工具 ZCode 会生成含完整 Git 历史的工作区快照,加密后直传阿里云 OSS,密钥封装用的私钥在云端。智谱回应称来自默认开启的代码库索引功能,道歉、删除数据、请第三方核查,三天后把整个产品以 Apache 2.0 开源并切断该链路。仍未回答的是:现在还有什么数据会离开本机,以及开源仓库为何没有保留事故之前的提交历史。
编辑标为重要,发布已满 30 天,从立即关注降到这一档。
本页目录11 节
记录
信号正文
#事情经过
9 月 18 日,开发者 ferstar 清理磁盘时注意到 ~/.zcode 目录占了不少空间。逆向客户端、分析网络请求之后,他发现智谱旗下的编程工具 ZCode 会生成本地工作区快照——不只是当前代码,还包括 .git 历史、Git LFS 缓存和 reflog——并且存在把加密快照上传到阿里云 OSS 的链路。
他分析的一份具体快照约 313MB、42,411 个文件,约 87% 来自 .git 目录;状态文件显示它经历过 564 次上传尝试,因超过大小限制一直停在本地、没有传成功。他随后用一个较小的公开仓库复现了上传。
加密不等于你持有钥匙
快照用 AES-256-CTR 加密,加密密钥再由服务端下发的 RSA 公钥封装,对应的私钥在云端。按他逆向出的链路,客户端先向 ZCode 服务端要 snapshot ID、RSA 公钥和 OSS 上传凭证,本地打包加密后直接把密文传到 OSS,绕过 ZCode 服务端——这也意味着审计和策略控制能力都受限。
这里的加密防的是第三方,不防厂商本身。
厂商的回应
智谱称问题来自代码库索引功能,它支撑本地索引、会话检查点、历史回退和 Repo Wiki;Repo Wiki 在云端生成时可能触发仓库数据上传。这项功能早期默认开启,相关数据在 Wiki 生成后销毁、没有用于模型训练,并就此道歉。
三天后智谱把 ZCode 整体开源,采用 Apache 2.0,包括桌面端、Web、后端、Agent CLI 和 Agent Runtime;v3.14.0 删除 Repo Wiki,并切断本地快照的生成与上传链路。智谱还请中国信通院和绿盟科技做安全核查,前者确认相关 OSS bucket 已是零数据。
仍然没有回答的
InfoQ 的报道提了三个问题,值得原样留下:
- 今天公开出来的 ZCode,还有哪些数据会离开本机?
- 为什么开源仓库没有保留事故之前的 Git 历史?
- 一款能读整个代码库、跑 Shell、连 MCP、调用插件、可能接触企业凭据的编程智能体,发生过数据边界争议之后,「代码开源加第三方核查」能在多大程度上重建信任?
本条依据 InfoQ 中文的报道;ferstar 的逆向分析原文未经本站单独核对。
可迁移的一点
把它和本站已发的 Kiro Crew 那条放在一起看。Kiro Crew 的防护——敏感路径拦截、凭据脱敏、签名审计日志——写在系统层,没有一条写在提示词里。ZCode 这次的问题不出在模型,而出在一个默认开启的产品功能:它在用户看不见的地方,替用户决定了哪些数据可以离开这台机器。
所以评估一款编程智能体,要问的不只是它能做什么,还有三件事:什么数据会离开本机;谁持有解密的钥匙;这个默认值是谁定的。
为什么是现在
为什么重要
#编程智能体读得到整个仓库、提交历史和可能的凭据,所以它的数据边界比它的能力更先决定能不能用。这次事件的每一环——默认开启、密钥在云端、直传绕过服务端——都不是模型的问题,而是产品设计的问题;而厂商用开源来回应,又把「开源能不能替代可验证的数据边界」这个问题摆到了桌面上。
背景
技术背景
#信封加密常见做法是用对称密钥(如 AES)加密数据、再用非对称公钥封装对称密钥;谁持有对应私钥,谁就能解密。私钥在服务端时,加密只防传输与存储环节的第三方。Git 的 reflog 与 LFS 缓存会保留已删除分支和已覆盖的提交,其中可能包含曾经提交又撤回的密钥。
关注人群
谁该关注
#下一步
学习路径
#- 先读《智能体安全与提示注入防御》:护栏要落在模型之外能强制执行的那一层
- 对照本站的 Kiro Crew:七项防护没有一条写在提示词里
- 在自己用的编程工具上检查一次:它的本地缓存目录有多大,里面有什么
- 读《人在回路的审查》:不可逆且对外的动作,应该在发生前被授权
- 把「什么数据离开本机、谁持有钥匙、默认值是谁定的」写进团队的工具评估清单
关系网络
在技术网络中的位置
#当前技术与相邻技术、技能和背景知识的连接,点击节点可继续探索。
延伸思考
后续问题
#- 你在用的编程工具,本地缓存里存了什么,哪些会离开这台机器?
- 加密上传时,解密的钥匙在谁手里?
- 代码开源之后,你怎么确认线上运行的就是公开的那份代码?
发布记录
收录于
#收录这条信号的技术简报,新的在前;最后一行是它那一周的周回顾。标签是它在那一期所在的栏目。
来源参考