夜雨聆风学习资料网

ARTICLE · 1038139

你的 AI 编码助手,可能正把整个 git 历史悄悄传回云端——5 个没人告诉你的坑

你的 AI 编码助手,可能正把整个 git 历史悄悄传回云端——5 个没人告诉你的坑

先讲清楚一件事:下面这个发现,不是我的实验,也不是我逆向的。 它来自一个网名 ferstar 的安全研究员,2026 年 9 月 18 日发布的取证报告,研究对象是 ZCode——智谱 Z.ai 官方出品的 AI 编码桌面应用。我只是把那份报告、相关的跟进分析和社区讨论重新整理成一个"开发者能带走的坑清单"。

为什么值得你停下来?你可能也装了一两个 AI 编码助手。它们读你的代码上下文才能干活,这个大家都认。但这次扒出来的不是"偷看打开的文件",而是——

只要你登录着,它就静默地把你的整个工作区打包加密,传回云端,里面装着完整 git 历史。而那个加密的文件,你自己都解不开。

一个清理磁盘的人,翻出 313MB 神秘加密包

ferstar 的出发点很朴素:清理磁盘。他的 ~/.zcode 目录占了 700 多 MB。这是 ZCode 的数据根目录,正常理解就是会话记录、日志、缓存。

结果他发现结构不对——在 v2/checkpoints/ 里,躺着一个 313MB 的 .enc 加密文件,旁边是状态元数据:

{
"workspacePath""/Users/ferstar/myprojects/<一个商业项目>",
"lastCompressedSize": {
"encryptedSizeBytes"313070842,
"workspaceSizeBytes"345549173
  },
"kind""baseline",
"failureCount"564
}

翻译:客户端扫描了他正在做的一个商业项目,排除 node_modules 之类的依赖,把剩下的 345MB 打成 313MB 加密归档,标着 baseline(全量快照),然后记了 564 次上传失败,一直卡在本地等重试。

他的仓库共 10GB,去掉依赖,这 345MB 几乎全是核心知识产权——被打包好、加密好、准备发出去了,只是碰巧上传一直失败才被他撞见。日志里没有明确上传地址,他就拆开客户端 app.asar 反编译,把整条上传链路还原了出来。

坑一:你以为"只发对话上下文",其实打包的是整个仓库

多数 AI 编码助手传的是"当前对话相关上下文",隐私政策里"收集对话中提交的文本、文件、代码"就是这意思。但 ZCode 这次不是——它的打包清单(manifest)本地明文保存,扒开一看,打的是整个工作区。拿一个 42,411 文件快照拆分:

内容
大小
占比
包含
.git/lfs/
196.1 MB
56.8%
LFS 缓存,所有大文件
.git/objects/
102.2 MB
29.6%
完整 commit 历史对象库
.git/logs/
0.6 MB
0.2%
reflogs,未推送的分支痕迹
源码和文档
46.2 MB
13.4%
src/
、配置、内部文档

光是 .git 一个目录就占载荷的 86.6%。 这里要敲黑板:git 对象库不是"当前工作区快照",是这仓库从第一天起每一行的完整家谱。意味着——你在后面 commit 里"删掉"的 API key 和密钥,历史版本还在 .git/objects/ 里被一起打包;你没推送的本地分支名会暴露未发布的产品计划;.git/config 里的内网 GitLab 主机名、仓库路径,全在里面。

你上传的不是"你正在看的文件",是几年来的工程史

坑二:你以为"关闭设置了就停",其实 UI 开关管不住上传管道

遇到这种事第一反应是去设置里找开关。ferstar 把界面选项和代码逐一对了一遍,发现你看到的开关和真正决定是否上传的开关是两回事

界面开关
你以为控制
实际控制
Optimize Experience
关遥测/数据收集
**只控制"是否授权用于模型训练"**。快照采集上传照跑
Repo Snapshot Indexing
关快照功能
**只控制"服务器是否对快照建索引"**。本地打包上传照跑

看宿主组装代码更直白:采集/上传的 sidecar 在启动时无条件实例化,没有任何基于用户偏好的 gating 判断,唯一要求是 tokenProvider 能给个有效 JWT。只要你登录着,这条后台管道永远活着,没有任何界面设置能关掉它。 采集在每次发 prompt 前、以及带 repo-wiki-update 标记的任务完成时触发——一个活跃会话最多产生过 62 次采集事件。

坑三:你以为"反正加密了",可你自己都解不开

如果它老实说"帮你把代码备份到云端",逻辑至少自洽——但它没有。更绝的是加密层。ZCode 用标准信封加密:

  • 内容用临时对称密钥走 AES-256-CTR 加密;
  • 对称密钥再用 RSA-OAEP-SHA256 公钥包起来。

问题在公钥:它是服务器协商上传凭证时现场下发的,对应私钥从没碰过你的机器。 ferstar 用本地所有私钥去解那个信封,全失败——意料之中。

躺在自己磁盘上的 313MB 密文,你打不开,客户端自己也打不开,只有 Z.ai 后端有钥匙。作者的原话翻译过来是:一把只有服务器能用的钥匙,唯一作用就是确保服务器想读你代码时随时能读。

这为什么是最大的红旗?如果真是给用户做回滚、做跨设备同步,钥匙该像 Git 或 Time Machine 那样留在本地。 一把专门存云端的钥匙,结合代码审计推测,服务的方向更像是让厂商能读数据,而不是让用户拿回数据。

坑四:你以为"删掉就完了",它会重新打包(打地鼠)

ferstar 第一次删掉那个卡住的加密包,结果半个小时内又冒出个全新的 313MB 归档,重试计数从 564 跳到 565。上传器一看文件没了就再打一个。手动删除 = 打地鼠,你删不过一个会自动重新生成的采集器。

治疗它的方式是文件系统层:把 checkpoints 目录内核层面设为不可写,采集逻辑一写磁盘就被挡掉,没有本地产物就没东西可传。

macOS:

rm -rf ~/.zcode/v2/checkpoints
mkdir -p ~/.zcode/v2/checkpoints
chflags uchg ~/.zcode/v2/checkpoints
touch ~/.zcode/v2/checkpoints/test# 应输出 Operation not permitted

Linux:

rm -rf ~/.zcode/v2/checkpoints
mkdir -p ~/.zcode/v2/checkpoints
sudo chattr +i ~/.zcode/v2/checkpoints
touch ~/.zcode/v2/checkpoints/test# 应输出 Operation not permitted

代价:那个本就要"上传你代码才能用"的 checkpoint 回滚界面会失效。正常聊天、补全、工具执行不受影响。恢复就 chflags nouchg(macOS)或 sudo chattr -i(Linux)。

坑五:你以为"隐私政策会说",可它一个字都没提

ZCode 的隐私政策和所有 AI 编码工具一样标准:"收集对话中提交的文本、文件和代码。"——这是给 LLM 喂上下文的常规披露。但 整份政策、FAQ、changelog 翻遍,找不到任何一句提"会把整个工作区和完整 git 历史打包上传"。 最接近的只是一句模板式的"优化项目默认关闭,未经同意不用输入做训练"——讲的是训练,不是上传快照。

背景是,ZCode 2026 年 7 月发布,正好在 Claude Code 隐藏遥测争议之后,Z.ai 把"开源权重"作为差异化卖点。据 tokenstead 的跟进报道,曾有高管在 X 上被问"ZCode 会不会包含任何形式的隐藏数据收集",回应是"不会包含网站列出范围之外的任何东西"。而工作区快照上传,并不在 ZCode 官网列出的功能里。截至报告发布,Z.ai 官方未回应。

一个更扎心的点:模型开源 ≠ 工具开源

这次讨论最常见的误区:以为 ZCode 开源,因为 GLM 开源。 不是。GLM 的权重开源,但 ZCode 这个桌面应用(harness)闭源。这件事对开发者的冲击,比"它上传数据"还大一分——因为最让人后背发凉的,从来不是"它做了什么",而是"你永远没法亲眼确认它做了什么"。

权重开源,说明你能在自家机器跑这个模型;工具闭源,意味着它在你机器上到底干了什么,你没法审计、没法验证,只能选择信或不信——信任,是闭源 harness 的面子;而它背后那台你看不见的采集器,是你替它还的信用利息。 安全研究员 Petri Kuittinen(自己的 agent 是开源的)那句话被转烂了:**"我的建议一直是:别信任闭源 AI harness。"**

社区怎么反应

传播很快。ferstar 的帖子 13 小时 27.6 万浏览,一条中文提醒("先别用 ZCode……还是尽可能用开源 agent")也带起 6.38 万浏览。讨论分成两派:一派说 agent 调用工具时上传代码片段本来就常见;另一派反驳——上传"片段"和上传"完整仓库 + 全部历史 + 加密到只有厂商能读"是两回事,前者是授权内操作,后者是未经同意的整体外泄。甚至今天已经有人做出防御工具 Mr-Grimwig/zcode-block-upload,拦截整包上传、改动前自动备份、可一键开启。从事故到社区工具,不到三天。

给你能带走的 5 条检查清单

不管你用不用 ZCode,下面 5 条对所有 AI 编码助手都适用——因为你装这类工具时,都不知道它对你的磁盘做了什么:

  1. 登录后它到底传什么、什么触发它传? 别只看"收集对话文本"那句。问清楚:传的是上下文片段还是整个工作区?包不包含完整 git 历史?
  2. 关上"数据采集"开关真的停了吗? 很多工具的开关只管训练授权/建索引,不管采集上传。别被界面错觉骗了。
  3. 它存的东西谁能解开? 如果加密,钥匙在哪?服务器下发公钥 + 私钥只存云端,你就要想清楚"它随时能读你代码"这件事。
  4. 删了会不会重新生成? 删一个加密包它还自动重建,不是偶发同步,是打地鼠。真到这步,用 chattr +i / chflags uchg 从内核层挡住。
  5. 它开源吗? 权重开源 ≠ 工具开源。闭源 harness 你无法审计它在机器上做什么——要么接受信任前提去用,要么换你能读源码的。

收尾

写这篇不是骂哪个产品。它给所有用 AI 编码工具的人一个提醒:**"本地运行的模型"和"本地运行的工具"不是一回事。** 模型在本地跑得好好的,不代表包住它的壳、桌面应用、更新管道也是本地的。

你装一个 AI 编码助手,等于给一个闭源程序开了你整个仓库历史、密钥、内网信息的门。这个门开着,你至少得知道它开着——知道它传了什么、谁有钥匙、能不能关。工具的信任,不靠"它是大厂""它开源了权重",靠你能不能读它的代码、验它的行为、关它的上传。

在这个人人都在把"本地跑模型"当卖点的时代,别把"模型本地"误当成"一切本地"。 你能掌控模型的权重,不等于你能掌控包住它的那层壳。真正该握在自己手里的,不是模型的权重大小,而是数据到底给了谁、谁能读、你能不能随时叫停。

如果上车之前,你能先问一句"你往云端传什么、谁有钥匙、我能不能关掉"——这篇没白看。

相关学习资料