深入ZCode:静默将你的整个Git历史上传至云端
内容提要
智谱AI编程工具ZCode被曝在用户登录后,静默将整个工作区打包加密上传至阿里云OSS,内容包括完整.git历史、LFS缓存和reflog,其中.git约占87%。加密公钥由服务器下发,私钥仅存云端,用户无法解密。UI开关无法关闭该行为,删除后会自动重打包。建议用文件系统不可变标志锁定checkpoints目录以阻止上传。
延伸解读
加密密钥的架构含义
文章指出,ZCode使用信封加密:内容用AES-256-CTR加密,对称密钥用RSA-OAEP-SHA256封装,而RSA公钥由服务器动态下发,私钥仅存云端。这意味着用户本地无法解密上传的密文,连客户端自身也不能。如果该功能旨在用户侧回滚或同步,密钥应像Git或Time Machine一样由用户掌控。密钥仅服务器可用,实质上确保了服务器可随时读取用户代码。
上传内容远超工作区
根据清单,上传包中.git目录占86.6%,包括LFS缓存、完整提交历史、reflog等。这不仅包含当前工作树,还包含历史提交中已删除的敏感信息(如API密钥)、未推送的本地分支名、内部GitLab主机名等。此外,全局ZCode配置文件也会被哈希并随快照上传。因此,即使代码本身不敏感,Git历史也可能泄露大量内部信息。
UI开关的误导性
文章通过逆向代码发现,设置中的“优化体验”开关仅控制数据是否用于模型训练,不影响快照捕获和上传;“仓库快照索引”开关仅控制服务器是否索引已上传的快照,本地打包和上传照常进行。捕获/上传边车在启动时无条件实例化,没有基于用户偏好的条件判断,只要登录且能获取有效JWT,该管道就永久活跃。
防御措施与权衡
由于删除后会自动重新打包,文章建议用文件系统不可变标志锁定checkpoints目录:macOS使用chflags uchg,Linux使用chattr +i。这会在内核层面阻止写入,使捕获逻辑无法生成上传文件。代价是“检查点回滚/时间线”功能将不可用,但正常聊天、自动补全和工具执行不受影响。恢复时移除标志即可。
Q&A
ZCode 被曝静默上传用户数据,具体上传了哪些内容?
ZCode 在用户登录后,会静默将整个工作区打包加密上传至阿里云 OSS,内容包括完整的 .git 历史、LFS 缓存、reflog 以及全局应用配置。其中 .git 目录约占 87%,具体包括 .git/lfs/(56.8%)、.git/objects/(29.6%)和 .git/logs/(0.2%)。
ZCode 上传的数据加密方式是什么?用户能解密吗?
ZCode 使用信封加密:内容用临时对称密钥通过 AES-256-CTR 加密,对称密钥再用服务器下发的 RSA 公钥通过 RSA-OAEP-SHA256 封装。私钥仅存于云端,用户本地无法解密,连 ZCode 客户端自己也不能解密。
ZCode 的 UI 设置里有关闭上传的开关吗?关闭后能阻止上传吗?
UI 中的“优化体验”开关只控制是否授权数据用于模型训练,“仓库快照索引”开关只控制服务器是否索引已上传的快照。两者均不能停止本地的打包和上传行为。只要用户登录,后台管道就会永久运行,没有 UI 设置可以关闭。
如何彻底阻止 ZCode 上传我的 Git 历史?
最有效的方法是在文件系统层面锁定 checkpoints 目录。macOS 上执行:rm -rf ~/.zcode/v2/checkpoints && mkdir -p ~/.zcode/v2/checkpoints && chflags uchg ~/.zcode/v2/checkpoints;Linux 上执行:rm -rf ~/.zcode/v2/checkpoints && mkdir -p ~/.zcode/v2/checkpoints && sudo chattr +i ~/.zcode/v2/checkpoints。这样内核会拒绝写入,上传管道因无本地文件而无法发送。
锁定 checkpoints 目录后,ZCode 的哪些功能会受影响?
锁定后,ZCode 的“检查点回滚/时间线”UI 功能将无法使用(该功能原本就依赖上传代码)。但正常的聊天、自动补全和工具执行不受影响。日志中出现的 I/O 错误可忽略。
ZCode 的隐私政策是否提到了上传整个工作区和 Git 历史?
没有。隐私政策仅提到收集“对话中提交的文本、文件和代码”,这是为 LLM 提供上下文的标准做法。整个政策、FAQ 和更新日志中均未提及静默打包上传整个工作区和完整 Git 历史。