Loading

ZCode疑似后台上传项目代码?一次完整排查记录

ZCode疑似后台上传项目代码?一次完整排查记录

SEO关键词: ZCode、智谱ZCode、ZCode代码上传、ZCode隐私、AI编程工具、Git历史、项目代码安全、ZCode checkpoints

文章摘要:
最近看到一篇针对智谱 ZCode 的深度排查文章,作者从本地磁盘占用、程序日志、app.asar 代码以及网络请求等多个角度进行了分析。文章声称 ZCode 会在登录状态下创建项目快照,并将加密后的快照上传到阿里云 OSS。本文整理这次调查中的关键证据和防护方法,方便使用 ZCode 的开发者了解相关机制。

在这里插入图片描述

一、事情是怎么发现的?

作者最开始只是清理磁盘空间,却发现用户目录下的:

~/.zcode

占用了 700MB 以上。

进一步检查后发现,其中:

cli/              ≈257MB
computer-use/     ≈130MB
v2/checkpoints/   ≈303MB

其中 v2/checkpoints/ 最值得关注。

目录里存在一个超过 300MB 的加密文件,同时还有对应的状态信息。

例如:

{
  "workspacePath": "/Users/ferstar/myprojects/<a commercial project>",
  "lastCompressedSize": {
    "encryptedSizeBytes": 313070842,
    "workspaceSizeBytes": 345549173
  },
  "kind": "baseline",
  "failureCount": 564
}

从字段来看,这个文件对应一个项目 Workspace 的快照,原始数据约 345MB,加密后约 313MB。

作者还发现此前已经存在 564 次上传失败记录。

需要强调的是:这些属于原作者对自己设备上的 ZCode 行为进行的调查,并不等同于已经获得官方确认。

二、ZCode到底上传了什么?

作者继续对 ZCode 的 app.asar 进行逆向分析,并还原出了大致的数据流程:

ZCode
  ↓
请求 Snapshot 上传凭证
  ↓
服务器返回 OSS 签名 + RSA 公钥
  ↓
本地打包项目
  ↓
tar.gz
  ↓
AES-256-CTR 加密
  ↓
RSA-OAEP 包装密钥
  ↓
上传 .tar.gz.enc
  ↓
Aliyun OSS

调查结果显示,客户端首先向 zcode.z.ai 请求上传凭证。

服务器会返回 OSS 表单签名、Object Key、大小限制以及本轮使用的 RSA 公钥。

之后客户端在本地完成压缩和加密,再通过 HTTP POST 将加密后的文件直接上传到阿里云 OSS。

也就是说,从作者还原出的流程来看,ZCode 的项目快照并不是简单保存在本地,而是存在向云端上传的流程。

三、最值得关注的是加密密钥

调查中发现,ZCode 使用的是典型的信封加密思路:

keyId: String(i.encryption.key_version),
keyWrapAlgorithm: "rsa-oaep-sha256",
publicKeySpkiPem: Ylt(i.encryption.public_key)

具体来说:

  • 项目内容使用临时 AES-256-CTR 密钥加密;
  • AES 密钥再通过服务器提供的 RSA 公钥进行 RSA-OAEP-SHA256 封装;
  • 对应 RSA 私钥并没有出现在用户设备上。

因此,作者认为本地生成的 .enc 文件无法直接由用户解密。

这一点本身并不能证明服务器会如何使用数据,但确实说明:如果私钥仅由服务端掌握,那么客户端本地并不拥有完整的解密能力。

四、更麻烦的是:可能不只是当前代码

调查中一个比较容易被忽略的问题,是项目快照可能包含 .git 目录。

作者对一个包含 42,411 个文件的快照进行了拆分:

内容 大小 占比
.git/lfs/ 196.1 MB 56.8%
.git/objects/ 102.2 MB 29.6%
.git/logs/ 0.6 MB 0.2%
源代码及文档 ≈46.2 MB 13.4%

按照这份样本计算,.git 目录占到了约 86.6%。

这意味着如果调查结果准确,那么需要关注的就不只是当前工作区代码,还可能包括 Git 历史、LFS 文件以及 reflog 等内容。

尤其是 Git 历史中可能存在已经删除的配置、旧 API Key、内部域名以及其他历史信息。

这些内容即使当前版本已经删除,也可能仍然存在于 Git 对象库中。

五、关闭设置真的有用吗?

作者还检查了 ZCode 中与数据相关的两个设置:

设置 表面作用 作者调查到的行为
Optimize Experience 控制数据用于模型训练的授权 不影响 Snapshot 捕获和上传
Repo Snapshot Indexing 控制服务端是否建立 Snapshot 索引 不影响本地打包和上传

根据作者对客户端代码的分析,Snapshot 相关组件会在启动时初始化,并没有发现由这些 UI 开关控制上传流程的逻辑。

同时,作者观察到 Snapshot 可能在 发送 Prompt 前以及任务完成后触发。

单次会话中,作者记录到最多出现 62 次 capture event。

六、如果担心项目代码,可以怎么处理?

作者尝试直接删除:

~/.zcode/v2/checkpoints

但发现之后又会重新生成新的 Snapshot。

因此给出的解决方案不是不断删除文件,而是直接从文件系统层面阻止目录写入。

macOS

rm -rf ~/.zcode/v2/checkpoints
mkdir -p ~/.zcode/v2/checkpoints
chflags uchg ~/.zcode/v2/checkpoints

恢复:

chflags nouchg ~/.zcode/v2/checkpoints

Linux

rm -rf ~/.zcode/v2/checkpoints
mkdir -p ~/.zcode/v2/checkpoints
sudo chattr +i ~/.zcode/v2/checkpoints

恢复:

sudo chattr -i ~/.zcode/v2/checkpoints

这种方式的原理比较简单:让程序无法向 checkpoints 目录写入快照文件。

代价也比较明显——依赖这些 Snapshot 的回滚、Timeline 等功能可能无法使用,而普通聊天、代码补全以及工具执行通常不依赖这个目录。

七、写在最后

这次调查真正值得开发者关注的,不只是一个 300MB 文件,而是 AI 编程工具到底会收集哪些项目数据。

正常的 AI 编程功能需要读取代码上下文,这是比较容易理解的。

但 Workspace Snapshot、Git 历史、LFS 文件等数据属于更大的数据范围。

如果你平时使用 AI 编程工具开发商业项目,尤其是涉及:

  • 商业源代码
  • API Key
  • 内部接口
  • 公司 Git 仓库
  • 未发布功能
  • 客户项目

建议不要只看产品宣传页面中的“代码补全”和“智能编程”,同时检查本地数据目录、网络请求、隐私政策以及数据上传机制。

本文整理的是原调查作者在特定环境下得到的结果,并非对 ZCode 官方行为的独立最终认定。 如果后续官方对 Snapshot 的用途、上传范围以及数据保留策略作出说明,还应该以官方信息为准。

对于 AI 编程工具来说,功能强大是一回事,代码去了哪里、保存多久、谁拥有解密能力,同样值得开发者关注。

posted @ 2026-09-18 14:59  代码简单说  阅读(3014)  评论(0)    收藏  举报