AI DAILY / 2026-09-18
ZCode 静默上传 Git 历史:Z.ai 桌面编码代理曝隐私问题
ZCode, the GLM coding agent, silently uploads your Git history
全文中文翻译 · AI 生成,仅供学习交流
ZCode,这个 GLM 编程代理(coding agent),悄悄上传你的 Git 历史
2026 年 9 月 18 日,自称 ferstar 的开发者发了一篇 ZCode 的逆向工程分析。ZCode 是 Z.ai 出品的 AI 编程桌面应用,Z.ai 总部在北京,也是 GLM 系列开源权重模型(open-weight models)的出品方。这些模型在本地 AI 圈的各种本地主机上跑,包括本站一直在追踪的 GLM-5.3-Flash。
这一发现比多数隐私丑闻更难看。应用只要登录着,就会悄悄把整个工作区(workspace)打包起来,里面有完整的 .git 历史、LFS(Large File Storage,大文件存储)资源缓存、引用日志(reflogs)和全局应用配置。打包完加密,然后上传到阿里云 OSS(Object Storage Service,对象存储服务)。
研究者本人抓到的结果是,一个 313MB 的加密压缩包,来自一个 345MB 的商业工作区,42,411 个文件。调查期间日志里记了 564 次失败的上传尝试。
你在本地跑 GLM 的时候,发布权重的公司跟开发者拿来跑这些权重的运行时(runtime),其实是两回事。帖子下面的反应显示,这种混淆是真实存在的。好几个评论者看到 GLM 是开源的就以为 ZCode 也是开源的。不是的。权重是开源的,外壳(harness)是闭源的。而且这外壳是 Z.ai 给自家模型配的,号称首方集成(first-party integration),第三方编辑器都比不了。
故事几个小时内在中英文两个圈子里同时传开。ferstar 的帖子拿下 276,000 多浏览,FeiZ 的中文警告帖(「暂时禁用 ZCode……尽量还是多用开源代理(agent)」)又添了 63,800。引用最多的一条回复来自 Petri Kuittinen,他自己的 AI 代理是开源的,还附带安全文档。他说的原话是:「我的建议一直是,以后也会是,不要信任闭源的 AI 外壳。」
把一个可疑目录升级成新闻的关键细节,是加密密钥。ZCode 用的是信封加密(envelope encryption),载荷(payload)由一把对称密钥(symmetric key)来加密,这把对称密钥又被一个 RSA-OAEP 公钥(public key)包裹。公钥由服务器在上传凭证协商时下发给客户端。相应的私钥只存在于 Z.ai 的云端。ferstar 试遍了本机上每一把私钥去解包那个压缩包,全部失败。那 313MB 密文静静躺在用户自己的硬盘上,用户解不开,ZCode 客户端自己也解不开。
ferstar 在帖子里的结论是:「一把只有服务器能用的密钥,存在的唯一目的就是确保服务器随时都能读你的代码。」
被打包的内容
打包清单(manifest)以明文形式存储在本地,而且非常具体。对于一个 42,411 个文件的快照:
| Content | Size | Share |
|------------------------|-----------|--------|
| .git/lfs/ | 196.1 MB | 56.8% |
| .git/objects/ | 102.2 MB | 29.6% |
| .git/logs/ | 0.6 MB | 0.2% |
| Source code and docs | 46.2 MB | 13.4% |仅 .git 目录就占载荷的 86.6%。
一次 42,411 个文件快照的载荷拆分:.git 目录占加密压缩包的 86.6%。
这事儿很关键,因为 git 对象存储(object store)不是工作树(working tree)的快照,它是仓库从第一天起的完整谱系。后来 commit 里删掉的 API 密钥就在里面。没推送(unpushed)出去、泄露未发布产品计划的分支名就在里面。来自 .git/config 的内部主机名和仓库路径也在里面。一个被截获的压缩包,是数年的工程历史,不只是你当时打开的那几个文件。
上传流水线
从客户端的 app.asar 重建出来的上传流水线是这样的。客户端先向 zcode.z.ai 请求凭证,服务器返回 OSS 表单签名(form signatures)、一个对象键(object key)、一个大小上限,外加每轮(per-round)一个 RSA 公钥。客户端把工作区打成 tar.gz,用 AES-256-CTR 加密,包好对称密钥,然后把压缩包直接 POST 到阿里云 OSS。OSS 再回调(callback)到 Z.ai 的后端注册这个快照。测试期间,运行中的客户端跟 zcode.z.ai 和两个阿里云 OSS 节点都保持着长连接。
重建出的 ZCode 快照上传流程:从协调器(coordinator)获取凭证,本地打包与加密,直接表单 POST 到阿里云 OSS,回调注册。由 ferstar 从客户端 app.asar 重建。
开关挡不住它
最自然的反应就是去翻设置。ferstar 把 UI 开关跟代码做了交叉对照。
- 「Optimize Experience」(optimizeAgentExperienceEnabled)只控制数据是否被授权用于模型训练。快照捕获与上传照常进行。
- 「Repo Snapshot Indexing」(repoSnapshotIndexingEnabled)只控制服务器是否对已上传的快照建立索引。本地打包与上传照常进行。
宿主(host)在启动时无条件实例化那个捕获伴生进程(capture sidecar),不受用户偏好约束。唯一的要求是令牌提供者(token provider)能产出一个有效的 JWT(JSON Web Token)。会话日志显示,单个活跃会话里出现了 62 个捕获事件,每次提示(prompt)发出之前和任务完成时都会触发。
第二个来源也印证了这套机制。OrcaPromptVault 是一个公开的 AI 外壳提示词收录库,里面保存了 ZCode 的一个 131KB 系统提示和一个 31 项工具的工具面(tool surface)。checkpoint/rewind 功能接进了系统提示,模板「Workspace rewind applied. rewindId, checkpointId, strategy, restoredFiles」出现了五次。这是快照流水线在用户侧露出来的那个尖儿,也就是文件系统锁要禁掉的特性。
代理的完整工具面里没有任何快照、上传或遥测工具。数据外传(exfiltration)流水线不是一项代理工具,它是一个宿主层面(host-level)的伴生进程,在工具循环(tool loop)之外实例化。所以没有任何权限设置能拦住它,也所以代理本身对此一无所知。131KB 被截获的指令里,没有任何地方提到阿里云、OSS、上传或者隐私。
这次捕获还补了一个 ferstar 没提到的细节。ZCode 自带一个 ReadSessionContext 工具,可以按会话 ID 按需读取其他已持久化的 ZCode 会话。再叠上宿主层面的快照伴生进程,会话内容既被本地持久化,又被云端截走。
泄露的系统提示中的 checkpoint 模板(出现五次)以及代理的 31 项工具面,其中不包含任何快照、上传或遥测工具。
隐私政策没有提及这一点
ZCode 的隐私政策说该工具会收集「对话期间提交的文本、文件和代码」,这是每个 AI 编程工具都会写的标准推理上下文披露。ferstar 翻遍了政策、FAQ 和更新日志(changelog),没找到任何一处提到打包和上传整个工作区及 git 历史的内容。最接近的一条,也只是说优化程序默认关闭的模板话。
让事情更糟的背景
ZCode 于 2026 年 7 月发布,发布宣传全靠信任撑着。在 Claude Code 隐藏遥测(hidden-telemetry)争议(译注:此前 Anthropic 的 Claude Code 被指控在用户不知情的情况下回传遥测数据)过去几周之后,Z.ai 把自家外壳定位成对标 Anthropic Claude Code 的替代品,拿「开源权重」当卖点,号称能规避 kill-switch 问题(译注:指厂商可以远程关闭模型能力)。有 Z.ai 高管在 X 上被问到 ZCode 会不会带「任何形式的间谍软件」时,回答说公司不会去实现「ZCode 网站上所列内容之外的任何东西」。
工作区快照功能并未列在 ZCode 网站上。
Z.ai 于 2026 年 1 月在港交所上市。截至发稿时,公司官方 X 账号还没对 ferstar 的帖子做出回应。最显眼的一条回复来自一个跟 ZCode 团队沾边的账号,内容是「嘿,很抱歉让你发现了它」。这读起来更像是在确认这套机制,而不是反驳。ferstar 的推文 13 个小时内拿下 276,000 浏览,V2EX 和 HN(译注:Hacker News,知名技术社区)相关频道上的讨论帖基本沿一条线分裂。代理在工具调用时上传代码片段是常有的事,前提是征得同意。这事儿是一整个仓库加上它的全部历史,没征得同意,还加密成只有厂商能读。
真正有效的防御
删掉待传的压缩包没用。客户端半小时内就重新打包出一个新的 313MB 压缩包,重试计数器往上跳。真正管用的修法在文件系统层面。让 checkpoints 目录在内核层面不可写。
Linux:
rm -rf ~/.zcode/v2/checkpoints
mkdir -p ~/.zcode/v2/checkpoints
sudo chattr +i ~/.zcode/v2/checkpointsmacOS:
rm -rf ~/.zcode/v2/checkpoints
mkdir -p ~/.zcode/v2/checkpoints
chflags uchg ~/.zcode/v2/checkpoints代价是 checkpoint 回滚 UI 不再能用,而这个功能本来就是要求上传你的代码才能工作。聊天、自动补全和工具调用照常工作。用 chattr -i 或 chflags nouchg 可以恢复。
对「本地」的含义
在本地跑开源权重模型才是真正的卖点。你的模型,你的硬件,没有按 token 计费,厂商也不能远程关停。ZCode 这事儿把这一点从模型层又往前推了一步。模型周围的运行时,外壳、桌面应用、更新流水线,也都是信任面(trust surface)的一部分。一个被持续往云端打电话的外壳包裹起来的本地运行模型,不算真正的本地。
由此引出两项检查,适用这个领域里的每一个外壳,不只是 ZCode。运行时在你登录时会传输什么,谁能解密它所存储的内容。Tokenstead 追踪代理外壳及其遥测行为,就是为了这个。如果 Z.ai 给出修复、披露变更或声明,本文会持续更新。