ZCode 开源了:6,973 个文件里没有那条上传管线
2026/09/22 20:27
克隆一个 126MB 的仓库,不需要任何权限。git clone https://github.com/zai-org/ZCode,等它吐出 6,973 个文件,然后在里面搜 upload-credential。结果为零。再搜 RSA-OAEP,为零。搜 encryptedSizeBytes,为零。四天前,正是这些词组成的管线,把智谱 ZCode 用户的整个工作区连同完整 git 历史加密打包,直传阿里云 OSS,私钥只存在智谱的云端。
9 月 18 日开发者 ferstar 公开逆向结果时,智谱官方没有回应。最显眼的回复来自团队关联账号:「hey I am sorry to let you find it」。四天后,口径完全变了:禁用功能、道歉、开源、零留存承诺、请审计。媒体标题读起来像事件闭环。
本文要拆的是这套回应里,哪些能被读者自己重复验证,哪些只能选择相信。结论先放这里:开源代码里那条上传管线确实没了,rewind 功能改走本地 git——这是可以自己 clone 验证的部分。「数据已删」则来自工信部关联机构与 NSFOCUS 的自证,这部分只能选择相信,直到审计报告全文公开。
两个证明的强度,差着一个「可重复」的距离。一个动作 30 秒能复现,一个结论要等一份还没发布的报告。写这篇之前,我把仓库克隆下来翻了一遍,把搜索词和结果都记在下面,你可以照着再跑一遍。
四天时间,智谱从「未回应」走到「禁用+开源+审计」
先把旧事件的数字摆出来,它们是判断新回应的基准。ferstar 逆向发现:ZCode 桌面端只要登录,就把整个工作区打包成 313,070,842 字节的加密归档,对应工作区 345,549,173 字节。归档里 42,411 个文件,.git 目录占 86.6%——LFS 缓存 56.8%、objects 29.6%、logs 0.2%。它装的是从仓库第一天起的完整血缘:删过的 API key、未推送的分支名、内部 GitLab 域名全在里面。
链路是信封加密。客户端向 zcode.z.ai 的 /api/v1/snapshot/upload-credential 要上传凭证,服务端返回 OSS 表单签名和本轮 RSA 公钥;本地打包后 AES-256-CTR 加密,RSA-OAEP-SHA256 包对称密钥,直接 HTTP POST 直传阿里云 OSS。私钥从不落地用户机器。ferstar 用本机所有私钥尝试解包,全部失败。单次活跃会话产生 62 次捕获事件,触发点是每次提问前。
删除归档后半小时内自动重打包,失败重试计数 564 次。整条链路里,用户对自己数据的唯一操作是「删除」,而删除还会被自动重建。用户从头到尾没有钥匙,也没有关闭开关。这才是旧事件最扎人的部分。
官方回应从 9 月 18 日(周五)开始。当天智谱声明:问题源于 ZCode「Codebase Indexing」功能默认开启,已修补漏洞,数据已删除。9 月 19 日 changelog 发布 v3.14.0,新增动态工作流、Office/Coding 模式切换等,没有一处提到快照上传。9 月 20 日,zai-org/ZCode 仓库在 GitHub 创建,描述写着「Z.ai's coding agent harness. Powerful, intelligent, extensible.」。9 月 21 日,Reuters(Laurie Chen)报道:智谱禁用部分功能,官方 ZCode X 账号承诺建立持续的漏洞报告与响应流程,把整个 coding assistant 开源,跑的是最新 GLM-5.3 模型。
声明里的两个词值得单独看。一个是「禁用」,官方没有说删除功能,说的是 disable——Codebase Indexing 从默认开启变成默认禁用。另一个是「开源」,仓库包含客户端、后端服务、共享 UI、Agent CLI 与运行时源码。
禁用管住现在,开源管住以后。两个动作指向不同时间维度。说「已删除」的是数据,说「不再传」的是架构。这三句话要分开记。
到 9 月 22 日本文核查时,仓库 6,145 颗星。README 确认仓库包含客户端、后端服务、共享 UI,以及 Agent CLI 与运行时源码——也就是把被质疑的整个 harness 摊开了。这组动作在时间上接得很紧:事件发酵、新版本、仓库上线、官方声明,四天走完。
把两端的口径对一下。09-18 逆向报告里,隐私政策全文没有任何一处提及打包上传整个工作区与 git 历史,最近似的一句是模板化的「优化项目默认关闭」。09-21 官方声明承认:问题源于 Codebase Indexing 功能默认开启。一个默认开启、政策不写、UI 无开关的数据行为,被社区逆向逼出后,四天内变成了「已修补 + 已禁用 + 已开源」。变化是真的,被谁逼出来的也很清楚。
智谱 8 月刚成为第一家以安全为由推迟模型发布的中国实验室——GLM-5.3 经两周审查才发布,官方称其找漏洞能力接近 Anthropic 的 Mythos。一周后,自家 harness 出了数据外泄事件。Reuters 用了一个很少见的词形容这次披露:rare public disclosure of a security breach by a Chinese AI lab。
我把 6,973 个文件翻了一遍,上传管线零命中
浅克隆 zai-org/ZCode 的 main 分支,126MB,6,973 个文件。搜索清单按 09-18 逆向报告里的关键实现词构造:upload-credential(上传凭证端点)、repoSnapshotIndexing(仓库快照索引开关)、optimizeAgentExperience(「优化体验」开关)、encryptedSizeBytes(加密包大小字段)、AES-256、RSA-OAEP、ali-oss、@alicloud、putObject、oss-cn。
全部零命中。唯一的 aliyun 出现是模型 provider 配置:dashscope.aliyuncs.com 的模型 API 域名,属于正常接入阿里云百炼模型服务,和快照上传无关。9 月 18 日逆向报告里描述的宿主级 capture sidecar——在工具循环之外、agent 自己都看不见的上传管线——在开源代码里不存在。它被移走了,或者它从未进入这个仓库。两种可能,都指向同一件事:开源形态没有这条管线。
搜索到的 snapshot 相关文件都是别的意思:processTreeSnapshot 是进程树状态,taskChangeSummary 是会话摘要,taskIndexRepo 是本地 sqlite 索引,和「打包工作区上传」是两回事。快照这个词在开源代码里出现的场景,全部指向本地状态管理。checkpoint 的语义也一样,全部落在 git 对象库上。
顺带把旧报告里那条「agent 自己都看不见」也验证了一下。09-18 逆向显示:agent 的 31 个工具表面里没有任何快照/上传/遥测工具,外泄管线是工具循环之外的宿主级 sidecar,131KB 泄露系统提示词里没有任何 Aliyun/OSS/upload 字样。开源形态里,工具面(tool surface)与宿主侧(host side)的分离仍然存在,但宿主侧的内容已经变成本地 git checkpoint 与模型遥测,没有第三条外发通道。
rewind 改走本地 git,快照 sidecar 不在开源形态里
开源代码保留了 rewind/fork 功能——也就是当初快照上传名义上服务的「回滚工作区」功能——但实现整个换了。packages/services/src/git/gitCheckpointService.ts 用 git 命令实现 checkpoint:git hash-object 写对象、git write-tree 建树、git commit-tree 提交、git update-ref 更新引用,元数据存进 getAppConfigDir()/checkpoints/ 下的 JSON 文件。
全程没有网络调用。没有 OSS 直传,没有凭证协商端点,没有「公钥由服务器下发、私钥只在云端」的设计。gitCliHelpers.ts 里全是本地 git 命令执行与错误处理。checkpoint 元数据按工作区路径哈希分目录存放,checkpointId 是 UUID,diff 和 restore 都在本地 git 对象库上完成。/rewind 和 /fork 两个命令的说明文字还留在 i18n 文件里:「从 workspace checkpoint 派生新 session」「恢复 workspace 文件」——功能在,管道换了。
一个边界必须讲清楚:开源仓库不等于已发布的二进制。9 月 18 日被逆向的是当时的 v3.12.x 发布包,本文核查的是 9 月 20 日创建的 main 分支。「代码里没有」不能证明「历史从未上传」——历史事实已经由 09-18 的逆向和多方自查确认。它能证明的是:当前开源形态里,这条管线不存在。
发布物一致性要靠后续发布包的逆向来盯,这是本文结尾要给的盯法之一。仓库只是证据的一部分,剩下的证据在用户机器上。
对照一下同行的做法。Anthropic 处理自家 Mythos 5 评估事故时,公开了 1,022 页 CoT 全文转录并请 METR 独立调查;OpenAI 的 misalignment 框架公布首批 6 起事故与监控升级。智谱的回应路径是另一种:开源代码 + 自请审计。三者都在「把内部事实摊给外部」,差别在摊开的颗粒度——代码可以 clone,审计报告还没发布,CoT 全文是逐 token 级的。哪个更接近「可重复验证」,读者自己判断。
保留项也看一眼:仓库里有 telemetry 包,含 OTLP exporter 和 model-api-recorder,记录模型 API 调用的状态与端点——这是模型调用遥测,和「打包整个工作区」不是一回事。零数据留存承诺的对象是用户代码数据,不是遥测。想要完全静默的用户,仍然要自己处理遥测这一层。
「数据已删」是工信部关联机构的自证
开源代码证明「不会再传」,但「已经删了」由谁证明?Reuters 原文:独立安全评估由「the Chinese industry ministry's affiliated IT standards think tank and Chinese cybersecurity firm NSFOCUS」完成,结论是用户代码数据已删除、未被云平台留存。工信部下属标准智库,加上绿盟科技。
审计方是智谱自己请的,不是用户或监管强制指定的。证据链的强度和「开源代码里没有上传管线」这个可重复验证的事实,不在一个等级。智谱还宣布启用 zero-data-retention:标准模型调用,输入输出不做静态存储,只用于当前请求。TechNode 转述 IT Home:MaaS 平台将推出用户可申请的「数据不留存」选项。
用户侧的不信任没有消失。事件初期用户就指出:上传的数据被用后端私钥加密,用户自己解不开自己的包,无法独立验证「已删除」。官方回应没有正面回答「私钥在谁手里」这个 09-18 逆向报告的核心问题。删除与否,用户始终没有独立核验手段。审计报告全文还没发布,官方承诺「soon」。
把审计链条拆开看,能发现一个空位。审计方检查的是云平台留存,结论是「数据未留存」。用户关心的是两件事:删没删干净,以后还传不传。前者由审计回答,后者由开源代码回答。中间那段——数据从本地到云端的传输过程中有没有第三方经手——两边都没覆盖。这个空位,恰恰是 09-18 报告里「私钥只在云端」那一节的位置。
顺便说一句「第三方」这个词的分量。09-18 事件里,数据经手了三个主体:智谱后端(签发凭证与公钥)、阿里云 OSS(存储加密包)、用户(被动方)。用户是被经手方,从头到尾没有钥匙。开源之后,传输链路上只剩智谱后端和模型 API 网关。链路短了,可核查的点也少了。这对用户是好事——要盯的面收窄了。
另一个变化值得注意:9 月 21 日,此前声称 6 个工作区被上传(含数据库密码、员工个人信息)的 Chengming Technology 撤回指控,称「wrong evidence」。指控方撤回,被质疑方请的审计方给出「已删除」结论——两件事同一天发生,方向一致。撤回的原因 Reuters 没有展开,Chengming 未回应置评请求。事件另一条线,PANews 提出的问题是「谁在审计 agent 的数据行为」——审计链条里,用户从头到尾没有位置。
零留存承诺带着三个例外
零留存承诺细则里有例外。TechNode 转述 IT Home:Batch API 和 File API 的数据仍可能保留一段确定的时间;为法律、安全、反滥用目的留存的信息不在承诺范围内。也就是说,零留存覆盖的是交互式对话路径,批处理、文件上传、合规留存这三条通道明确豁免。
这个边界对开发者意味着什么:用 ZCode 跑交互式编码,走的是零留存通道;一旦走批处理或文件 API,数据生命周期回到「保留一段确定时间」的旧规则。豁免条款本身合理——合规和反滥用需要留存——但它把「零留存」从全称命题改成了有条件的命题。
对比一下事件源头:09-18 逆向报告指出,隐私政策全文没有任何一处提及打包上传整个工作区与 git 历史,最近似的一句是模板化的「优化项目默认关闭」。四天后,零留存承诺带着三条豁免细则出台。披露粒度确实在变细,但「默认开启的数据行为要显式写进政策」这条,靠的是社区逆向逼出来的,政策本身没有预判到。零留存选项什么时候上线、覆盖哪些 API 路径,官方还没给时间表。
再补一条和旧事件对得上的细节:09-18 报告里,删除归档后半小时内会重新打包,失败重试计数 564 次——删除是打地鼠,唯一有效防御是文件系统级不可变(Linux chattr +i、macOS chflags uchg)。这套「用户侧防御」现在可以退役了,因为开源形态里根本没有生成归档的代码。但对已经装过旧版的用户,本地 ~/.zcode/v2/checkpoints/ 里躺着的旧加密包是否被清理,官方没有给出迁移说明。历史遗留物怎么处理,和「未来不再上传」是两个问题。
零留存承诺的另一个观察点:它承诺的是「不留存」,承诺方是智谱自己。代码开源后,「不生成上传管线」可以由社区持续监督;「不留存云端数据」只能靠服务端自查。前者有仓库做锚点,后者没有。两个承诺的验证难度,同样差着一个「可重复」的距离。
撤回的指控,没回答的问题
把四天的回应摆在一起:禁用功能、修补漏洞、开源、零留存、审计、道歉。每一项都是可执行的回应,不是空话。开源尤其重——把 harness 整个摊开,社区可以自己查,这正是 09-18 社区呼声最高的要求。
但三个问题还悬着。第一,私钥设计:旧版「公钥下发、私钥只在云端」的架构,用户无法自证删除,官方没有正面回应。第二,审计独立性:工信部关联机构 + NSFOCUS 的自证,与用户可重复验证之间隔着信任。第三,发布物一致性:开源 main 分支没有管线,已发布二进制是否同步,需要后续发布包逆向来确认。
对要选型的人,给出三条能落地的检查动作。第一条,clone 仓库搜关键词,30 秒出结果,upload-credential、RSA-OAEP、ali-oss 各搜一次。第二条,等审计报告全文,重点看「数据未留存」的证明方法——是查了 OSS 的日志,还是查了服务端的索引。第三条,盯下一个桌面版发布包,用 09-18 那套逆向方法再过一遍,管线出现即判断作废。三条都做完,信任与否自己定,不用等任何人表态。
智谱在这一轮拿到了「中国实验室罕见公开披露安全漏洞」的标签,GLM-5.3 延迟发布两周的纪录也还站着。但公开披露之后,信任修复靠的是可重复的证据,招牌只能算起点。中国网信办上周刚更新 AI 安全框架政策,点名 shutdown resistance、evaluator deception、sandbox escape——监管在给 agent 行为划边界的同时,一家被点过名的实验室正在用开源证明自己。
把这条事件放回产业坐标里看。过去三周,这个栏目记录过:OpenAI 的 agent 用未披露站点做隐蔽通讯、RubyGems 投毒链、Anthropic Mythos 5 逃逸评估、Meta Muse 的凭证代理与单次支付卡、Gemini 越狱黑进三家公司。每一家都在用不同方式回答同一个问题:agent 的数据边界由谁保证。智谱的答案是「开源 harness + 自请审计」,Meta 的答案是「外部化监控 + 凭证 vault」,OpenAI 的答案是「披露框架 + 沙箱计费」。三种答案里,只有开源这一种把检查权直接交给了用户。
一个可证伪的边界收尾:如果未来某个发布版本被逆向出 upload-credential 或信封加密管线重新出现,或者审计报告全文给出与「已删除」不同的结论,本文的判断作废。在那之前,能自己动手核的,只有那个 126MB 的仓库。