大数跨境

ZCode在后台上传了你整个仓库和 Git 历史,7 款 AI 编码工具逐项对照

ZCode在后台上传了你整个仓库和 Git 历史,7 款 AI 编码工具逐项对照 AI安全工坊
2026-09-18
4
导读:你用的 AI 编码工具,把你的代码放在哪了?ZCode 事件后我翻了 7 家的文档V2EX 上今天有个帖子,标题问的是怎么看待 ZCode 静默上传的操作,有没有说法。

 

你用的 AI 编码工具,把你的代码放在哪了?ZCode 事件后我翻了 7 家的文档

V2EX 上今天有个帖子,标题问的是怎么看待 ZCode 静默上传的操作,有没有说法。

帖子底下有条回复更值得看。有人说,AI 读代码和上传代码没什么区别,反正它干活也得把代码发出去。

这句话问到了点上。今天全网都在喊卸载,我想先把这个问题答清楚,因为它决定了你明天还敢不敢用手里那个工具,不管它叫 ZCode、Cursor、Claude Code 还是 Trae。

先把边界说死。我没装 ZCode,没做复现。这篇文章的事实来自三处:博主 ferstar 的逆向记录,GitHub 上一位用户的独立复现,V2EX 上另一位用户在最新版 v3.12.3 上的复现。然后我把 ZCode、Cursor、Claude Code、Trae、Qoder、Copilot 六家的隐私政策和官方文档逐页翻了一遍。截至 9 月 18 日 17:37,智谱没有回应,GitHub issue 没有维护者回复,最新版本还是 9 月 17 日的 v3.12.3。官方一旦回应,下面关于「无回应」的部分会变,其余不会。


ZCode 这次传的是什么

博主是清磁盘时发现 ~/.zcode 占了 700 多 MB 才顺藤摸下去的。v2/checkpoints/ 目录里躺着一个 313MB 的 .enc 文件,旁边的状态文件写着:workspaceSizeBytes 345,549,173,kind 是 baseline,failureCount 564。翻译一下:客户端把他一个商业项目的整个工作区打了包,标记为全量快照,上传失败了 564 次,一直在重试。

密文打不开,但打包时生成的文件清单是明文。42,411 个文件里,.git 目录占了 86.6%:

内容
大小
占比
里面有什么
.git/lfs/
196.1 MB
56.8%
所有拉取过的大文件和二进制资源
.git/objects/
102.2 MB
29.6%
完整提交历史
.git/logs/
0.6 MB
0.2%
reflog,含没推远端的本地分支操作
源码与文档
46.2 MB
13.4%
src、配置、内部文档

上传链路他从 app.asar 里逆出来了。我按他的记录重画一遍:

sequenceDiagram     participant C as ZCode 客户端     participant Z as zcode.z.ai     participant O as 阿里云 OSS     C->>Z: 要一张上传凭证     Z-->>C: 快照 ID + RSA 公钥 + OSS 表单签名     C->>C: 整个工作区打 tar.gz,AES 加密,密钥再用公钥包一层     C->>O: 表单直传密文,不经过智谱业务服务器     O->>Z: 回调登记:这个用户的这份快照已入库触发点有两个:每次你发 prompt 之前,以及一个任务结束、系统标记要更新仓库 wiki 的时候。博主的会话日志里,单次会话最多触发了 62 次。

GitHub issue #707 的复现者补了一个细节:普通工作区文件有 1MB 的单文件上限,.git/ 下的文件不受这个限制。这一条目前只有他一个人报告。

上面这些都是行为描述,下面按离机范围、密钥归属、开关作用、政策披露四个变量逐个看。


变量一:托运,还是随身

回到那条 V2EX 回复。AI 干活确实要把代码发出去,但「发出去」有两种。

随身:你问一个问题,工具从仓库里挑出相关的几个文件、几百行,随请求发给模型,用完即弃。这是推理必需的,所有工具都这么干。

托运:不管你问什么,先把整个仓库连同几年的提交历史打成一箱,寄到云端仓库存着。

ZCode 这次是托运。它还不只托运你现在打开的项目:另一份清单叫 repo_snapshot_extra_manifest,把你的全局配置文件跨工作区一起带上。

托运和随身的差别落在历史上,当前代码两种方式都会碰到。.git/objects 里有你三年前提交过、后来删掉的那个 API key;.git/logs 里有你还没推远端的分支名,也就是没发布的功能计划;.git/config 里有你内网 GitLab 的主机名和仓库路径。这些东西,随身模式一辈子碰不到。

这种事今年七月已经发生过一次。xAI 的 Grok Build 被安全研究员 cereblab 抓到把整个 git bundle 传到 Google Cloud Storage:一个 12GB 的仓库,模型实际只需要 192KB 上下文,客户端上传了 5.10GiB。后来马斯克承诺删数据并开源。开源之后大家发现上传代码还在源码里,只是服务端加了一个开关把它关了。

六家里谁在托运,谁在随身,文档里能查到的部分我放在最后那张表里。这里先说一句:Claude Code 的 checkpoint 也存文件快照,托运这个动作本身不构成问题。差别出在下一个变量,也就是那份被托运走的快照,它的解密钥匙到底在谁手里。


变量二:钥匙在谁手里

寄存柜有两种。一种钥匙给你,你随时能开;一种钥匙留在柜台,只有柜台能开。

ZCode 的加密是标准的信封加密:文件内容用随机对称密钥走 AES-256-CTR,对称密钥再用 RSA-OAEP 包一层。问题在那把 RSA 公钥的来源。它是服务端在发凭证的时候动态下发的,私钥从来没到过你的机器。博主拿本地所有私钥去解那个信封,全部失败。

也就是说,那个躺在你硬盘上的 313MB,你打不开,ZCode 客户端自己也打不开,只有智谱后端能开。

对比一下 Cursor 的写法。它的数据使用页(9 月 3 日更新)写的是:文件用客户端生成的唯一密钥加密,密钥只在单次请求期间存在于服务器,缓存内容临时,不持久化。钥匙是你这边生成的,请求结束就作废。

Claude Code 更简单:checkpoint 是本地文件快照,随会话存在你机器上,只记录 Claude 自己用编辑工具改过的文件,默认 30 天清理。没有上传这一步,也就没有钥匙的问题。

博主在文章里给了一个判断标准,我觉得比任何道德定性都有用:如果这个功能真是给用户做回滚或跨设备同步的,解密钥匙理应在用户手里,Git 和 Time Machine 都是这么设计的。一把只有服务端能用的钥匙,用途只有一个,就是让服务端能读。

这一条是推断,我把它标出来,判断留给你,后面几个变量都是文档里能直接查到的。


变量三:开关管的是什么

ZCode 设置里有两个看起来相关的开关,博主对照代码查了它们各自管什么:

开关
你以为它管
代码里它实际管
优化体验(optimizeAgentExperienceEnabled)
关掉遥测 / 数据收集
只管你的数据是否授权用于训练。快照照打,上传照传
仓库快照索引(repoSnapshotIndexingEnabled)
关掉快照
只管服务端是否对已上传的快照建索引。本地打包和上传不受影响

打包上传这个后台组件是启动时无条件实例化的,代码里没有读任何用户偏好,唯一门槛是能拿到一个有效的登录 token。issue #707 的复现者把 repoSnapshotIndexingEnabled 设成 false 之后,上传照旧。

博主删掉那个 313MB 的包,半小时后它重新打了一个,重试计数从 564 变成 565。

这个坑不是 ZCode 独有的。开关名字和开关实际管的东西对不上,在其他工具的文档里也有,只是程度不同:

如果你用的是 Cursor:Privacy Mode 管的是「不用于训练」和「零数据保留」,它不阻止你的代码上下文经 Cursor 服务器发给模型。这是文档原文的意思,不是缺陷,但你得知道它不管传输。

如果你用的是 Trae:隐私模式管的是对话内容不用于分析和训练。代码库索引这个功能,文档写的是「临时上传仓库文件计算 embedding,算完永久删除明文」,隐私模式不控制这一步,文档也没说索引能不能关。

如果你用的是 Copilot 个人版:GitHub 官方博客 3 月 25 日发的通知,从 4 月 24 日起,Free、Pro、Pro+ 的交互数据默认用于训练,包括输入、输出、代码片段和上下文,要自己去设置里关。Business 和 Enterprise 不受影响。

开关每家都有,要看的是它管到训练、索引、传输里的哪一层,这一点文档里通常写得到。


变量四:政策写没写

我把 ZCode 的隐私政策(6 月 15 日版,运营主体是一家新加坡公司 JINGSHENG HENGXING TECHNOLOGY)从头翻到尾。收集范围写的是「对话中提交的文本、文件、配置参数、shell 命令」,加设备信息和埋点。全文没有 workspace、repository、snapshot、checkpoint、git 这几个词,没有提阿里云或任何对象存储,「优化计划默认关闭,未主动加入前不用于训练」。

官方文档我也翻了。导航里二十多个页面,没有 checkpoint、时间线、快照或数据隐私专页。Repo Wiki 那页写的是「ZCode 把经过安全规则过滤、按需读取的代码上下文发给你选的模型服务」,产物存本地。Edit History 那页只讲怎么改消息、怎么撤销文件变更,不讲存哪。

官方材料里找不到「整仓上传」这件事,一处都没有。

其他几家在这个变量上的分数不一样。Cursor 有独立的数据使用页,写到了缓存、密钥和第三方模型商的保留期。Claude Code 的 checkpoint 文档写了存哪、留多久、怎么调。Trae 写了索引会临时上传明文。Qoder 的政策提到用了第三方「代码库数据存储」服务,服务器在美国、新加坡、日本,改进用途的数据最长留五年,有 Share & Improve 开关。Copilot 的留存期在 Trust Center 里按访问表面分了几套口径,页面是动态加载的,我没能抓到原文,这里不引具体天数。

写了不代表你会满意。写了至少能拿它对照实际行为。ZCode 这里连对照的起点都没有,隐私政策和官方文档里找不到任何一句能和这次的行为对上。


一张表,四个问题

把四个变量摆在一起:

工具
离机范围
钥匙在谁手里
开关管到哪
政策写没写
ZCode
整仓 + .git 全历史 + 全局配置,每次 prompt 前
服务端,用户不可解
两个开关都不管上传
Cursor
请求相关上下文 + 索引(存 embedding,不存原码)
客户端生成,请求期有效
Privacy Mode 管训练与保留,不管传输
有,09-03 更新
Claude Code
checkpoint 存本地,只含 Claude 改过的文件
不涉及
本地留存 30 天可调
Trae
仓库留本地;索引时临时上传明文,算完删
文档未说
隐私模式管训练,不管索引
Qoder
政策提第三方代码库存储,范围未细说
文档未说
Share & Improve 管训练
有,05-12 更新,留存最长 5 年
Copilot
输入、输出、代码片段与上下文
不涉及
个人版 04-24 起默认训练,需手动退出
有,留存期按表面分口径,本文不引天数
Grok Build(07 前例)
整 git bundle
服务端
服务端开关
事后开源

表里「文档未说」的格子,我查过,文档里确实没有。这几个格子本身就是信息。

决策规则只有一条:托运可以接受,前提是钥匙在你手里、开关能关、文档写了。四项缺一项,就按这份代码已经不在自己控制范围内来处理,先把历史里出现过的密钥轮换掉。

flowchart TB     Q["它把你的代码怎么了?"] --> A{"随身还是托运?"}     A -->|只发当前任务相关片段| OK1["随身:所有工具都这样,看变量三即可"]     A -->|整仓 / 全历史打包| B{"钥匙在谁手里?"}     B -->|本地或客户端生成| C{"开关能关上传吗?"}     B -->|只在服务端| STOP["假设代码已离开你的控制"]     C -->|能| D{"政策写了吗?"}     C -->|不能 / 开关只管训练| STOP     D -->|写了| OK2["可接受,按文档留存期管理"]     D -->|没写| STOP

今天就能做的三件事

装过 ZCode 的,跑这三条:


   
   
   
   
    
   
   
   
   # 1. 看有没有已打包的快照
ls -la ~/.zcode/v2/checkpoints/

# 2. 有 .enc 文件就锁目录(macOS;Linux 用 sudo chattr +i)
rm -rf ~/.zcode/v2/checkpoints && mkdir -p ~/.zcode/v2/checkpoints && chflags uchg ~/.zcode/v2/checkpoints

# 3. 验证:应该报 Operation not permitted
touch ~/.zcode/v2/checkpoints/test

副作用是 checkpoint 回滚和时间线功能不可用;对话、补全、工具调用不受影响。想恢复用 chflags nouchg

锁完目录之后还有一件事。如果你的 .git 历史里出现过任何 key、token、内网地址,按已泄露处理,轮换掉。密文你打不开,没法确认里面没有。

没装 ZCode 的,下次引入任何 AI 编码工具之前,先问四个问题,答案要能在文档里指出来:

问题
在哪找答案
找不到怎么办
checkpoint / 索引存在哪?
官方文档的 checkpoint、indexing、data use 页
视为「存在云端」
上传的内容谁能解?
隐私政策的加密与第三方存储条款
视为「服务方能解」
隐私开关管到哪一层?
设置项说明 + 文档里对该开关的定义
视为「只管训练,不管传输」
政策有没有写整仓 / 历史上传?
隐私政策全文搜 repository、snapshot、workspace
视为「未披露」

回到开头那条回复,AI 读代码和上传代码,有区别吗?

有。AI 读代码是干活必需的。要看的是它读完之后,那份东西放在哪、谁能开、你能不能叫停,这些有没有白纸黑字。

博主是清磁盘时才发现的。你也可以现在打开终端,看一眼自己那个工具的数据目录,~/.zcode~/.cursor~/.claude 这类路径,先弄清里面存了什么。


来源与边界

  • ferstar:扒一扒 ZCode 静默上传全量 Git 历史的骚操作,2026-09-18 02:00 发布。上传链路、清单占比、开关分析、防御命令均以该记录为准。
  • zai-org/feedback Issue #707,2026-09-18 06:50 UTC,独立复现,含 1MB 上限不适用于 .git 的补充;截至本文写作无维护者回复。
  • V2EX #1242997:在 v3.12.3.7463 上复现;V2EX #1242973:Windows 与 macOS 双平台复现。
  • ZCode 隐私政策(2026-06-15 版)、Repo Wiki 文档、Edit History 文档、Changelog。
  • Cursor 数据使用说明(2026-09-03 更新)、Claude Code Checkpointing 文档、Trae 隐私模式文档、Qoder 隐私政策(2026-05-12 更新)。Copilot 训练政策引自 GitHub 官方博客 2026-03-25;留存期未能抓到 Trust Center 原文,正文不引具体天数。
  • Grok Build 前例:虎嗅 2026-07-17 转述安全研究员 cereblab 的测试。

本文没有在任何环境复现 ZCode 的上传行为,「钥匙只在服务端」一条为博主逆向所得的单源技术结论。文中对 ZCode 之外各工具的描述均来自其公开文档,文档未写明的项如实标注「文档未说」。截至 2026-09-18 17:37,智谱与 ZCode 团队未对此事作出公开回应

 


【声明】内容源于网络
0
0
AI安全工坊
专注 AI 安全技术研究与实践,分享前沿资讯、实战案例、工具资源,打造专业、开放的 AI 安全技术交流工坊。
内容 86
粉丝 0
AI安全工坊 专注 AI 安全技术研究与实践,分享前沿资讯、实战案例、工具资源,打造专业、开放的 AI 安全技术交流工坊。
总阅读5.7k
粉丝0
内容86