<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ZCode 被曝后台上传工作区快照：包含完整 Git 历史]]></title><description><![CDATA[<p dir="auto">近日，有开发者在排查 <strong>ZCode</strong> 本地磁盘占用时，发现了一个值得关注的数据安全问题：</p>
<blockquote>
<p dir="auto">ZCode 疑似会在登录状态下自动创建工作区快照，并将其加密后上传至云端。快照中不仅可能包含当前项目源码，还可能包含完整的 <code>.git</code> 目录、Git 历史、LFS 缓存以及部分应用配置。</p>
</blockquote>
<p dir="auto">需要说明的是：<strong>以下内容主要来自开发者对 ZCode 客户端、日志及本地文件的逆向分析和实测，并非 ZCode 官方针对该事件发布的说明。</strong></p>
<h2>事情是怎么发现的？</h2>
<p dir="auto">开发者最初只是发现：</p>
<pre><code class="language-text">~/.zcode
</code></pre>
<p dir="auto">目录占用了 700MB 以上空间。</p>
<p dir="auto">进一步检查后，在：</p>
<pre><code class="language-text">~/.zcode/v2/checkpoints/
</code></pre>
<p dir="auto">发现了一个体积超过 <strong>300MB</strong> 的加密文件。</p>
<p dir="auto">相关状态信息表明，这个文件属于：</p>
<pre><code class="language-text">baseline
</code></pre>
<p dir="auto">也就是一次完整的工作区基线快照。</p>
<p dir="auto">原作者测试中的工作区有效内容大约 345MB，加密压缩后的文件约 313MB。</p>
<p dir="auto">而且由于上传失败，这个文件一直保存在 <code>pending</code> 状态并持续重试。</p>
<hr />
<h2>上传流程是怎样的？</h2>
<p dir="auto">通过分析 ZCode 客户端代码和网络连接，作者还原出的流程大致为：</p>
<pre><code class="language-text">本地工作区
    ↓
tar.gz 打包
    ↓
AES-256-CTR 加密
    ↓
RSA-OAEP 加密 AES 密钥
    ↓
获取云端上传凭证
    ↓
上传至阿里云 OSS
</code></pre>
<p dir="auto">客户端首先向 ZCode 服务端申请上传凭证。</p>
<p dir="auto">服务端返回包括：</p>
<ul>
<li>Snapshot ID</li>
<li>RSA 公钥</li>
<li>OSS 上传凭证</li>
<li>Object Key</li>
<li>文件大小限制</li>
<li>Callback 信息</li>
</ul>
<p dir="auto">随后客户端在本地完成压缩和加密，再直接上传到 OSS。</p>
<p dir="auto">也就是说，大文件本身并不一定经过 ZCode 的业务服务器中转。</p>
<hr />
<h2>一个值得关注的问题：解密密钥在服务端</h2>
<p dir="auto">根据原作者逆向分析，工作区文件使用随机生成的 AES 密钥加密。</p>
<p dir="auto">随后 AES 密钥再使用：</p>
<pre><code class="language-text">RSA-OAEP-SHA256
</code></pre>
<p dir="auto">进行封装。</p>
<p dir="auto">关键在于：</p>
<p dir="auto"><strong>RSA 公钥由服务端动态下发，对应私钥并不保存在用户电脑上。</strong></p>
<p dir="auto">因此，本地生成的加密快照用户自己实际上无法直接解密。</p>
<p dir="auto">这种设计本身并不能证明数据被人工查看，但至少意味着：</p>
<p dir="auto"><strong>快照并不是一种只有用户自己才能解密的“零知识备份”。</strong></p>
<p dir="auto">服务端掌握相应解密能力。</p>
<hr />
<h1>快照里包含什么？</h1>
<p dir="auto">这部分可能才是开发者最需要关注的。</p>
<p dir="auto">作者检查快照生成过程中留下的 Manifest 文件后发现，其中包含 <strong>4 万多个文件</strong>。</p>
<p dir="auto">其测试项目的大致组成如下：</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>内容</th>
<th style="text-align:right">占比</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>.git/lfs/</code></td>
<td style="text-align:right">约 56.8%</td>
</tr>
<tr>
<td><code>.git/objects/</code></td>
<td style="text-align:right">约 29.6%</td>
</tr>
<tr>
<td><code>.git/logs/</code></td>
<td style="text-align:right">约 0.2%</td>
</tr>
<tr>
<td>当前源码、配置和文档</td>
<td style="text-align:right">约 13.4%</td>
</tr>
</tbody>
</table>
<p dir="auto">也就是说：</p>
<p dir="auto"><strong><code>.git</code> 目录占整个快照体积约 86.6%。</strong></p>
<p dir="auto">这和单纯上传“当前代码上下文”是两个完全不同的概念。</p>
<hr />
<h2>为什么 <code>.git</code> 被上传值得关注？</h2>
<p dir="auto"><code>.git</code> 并不只是一些 Git 配置文件。</p>
<p dir="auto">例如：</p>
<pre><code class="language-text">.git/objects/
</code></pre>
<p dir="auto">里面可能包含项目历史中的：</p>
<ul>
<li>Commit</li>
<li>Tree</li>
<li>Blob</li>
<li>历史文件版本</li>
</ul>
<p dir="auto">这意味着即使某个敏感文件已经从当前工作区删除，只要它曾经提交进 Git，相关内容仍有可能存在于 Git Objects 中。</p>
<p dir="auto">另外：</p>
<pre><code class="language-text">.git/logs/
</code></pre>
<p dir="auto">可能保存 reflog 信息。</p>
<p dir="auto">而：</p>
<pre><code class="language-text">.git/config
</code></pre>
<p dir="auto">则可能暴露：</p>
<ul>
<li>内部 GitLab/Gitea 地址</li>
<li>Repository URL</li>
<li>内网域名</li>
<li>项目路径</li>
</ul>
<p dir="auto">对于公司内部项目而言，这些信息显然比“当前正在编辑的几个文件”敏感得多。</p>
<hr />
<h1>关闭「优化体验」有没有用？</h1>
<p dir="auto">根据原作者对客户端代码的分析：</p>
<p dir="auto"><strong>没有。</strong></p>
<p dir="auto">ZCode 中与数据相关的一些设置，并不等于“禁止工作区快照上传”。</p>
<p dir="auto">例如：</p>
<h3>优化体验</h3>
<p dir="auto">主要控制用户内容是否被用于产品或模型训练优化。</p>
<p dir="auto">它和工作区 Snapshot 上传不是同一套逻辑。</p>
<h3>仓库快照索引</h3>
<p dir="auto">看起来像是控制快照，但作者分析认为：</p>
<p dir="auto">它控制的更接近于：</p>
<pre><code class="language-text">快照上传以后是否建立索引
</code></pre>
<p dir="auto">而不是：</p>
<pre><code class="language-text">是否生成和上传快照
</code></pre>
<p dir="auto">作者在客户端代码中发现，负责 Snapshot 的 Sidecar 会在程序启动时初始化。</p>
<p dir="auto">主要前提是：</p>
<pre><code class="language-text">用户已经登录
</code></pre>
<p dir="auto">并能够获取有效 Token。</p>
<hr />
<h1>什么时候会创建快照？</h1>
<p dir="auto">根据日志和代码分析，至少存在类似：</p>
<pre><code class="language-text">captureBeforePrompt
</code></pre>
<p dir="auto">这样的触发点。</p>
<p dir="auto">也就是说：</p>
<p dir="auto"><strong>在发送 Prompt 之前可能创建 Snapshot。</strong></p>
<p dir="auto">任务结束后也可能触发相关仓库快照操作。</p>
<p dir="auto">原作者观察到，一个比较活跃的会话可能产生多次 Snapshot 捕获行为。</p>
<p dir="auto">因此它并不一定只是：</p>
<pre><code class="language-text">第一次打开项目 → 上传一次
</code></pre>
<p dir="auto">而可能伴随项目使用持续发生。</p>
<hr />
<h1>官方隐私政策怎么写？</h1>
<p dir="auto">ZCode 当前隐私政策确实说明，在使用 AI 辅助功能时可能收集用户在对话过程中提交的：</p>
<ul>
<li>文本</li>
<li>文件</li>
<li>图片</li>
<li>音视频</li>
<li>配置参数</li>
<li>Shell 命令</li>
<li>代码</li>
</ul>
<p dir="auto">这对于 AI Coding 工具来说并不意外。</p>
<p dir="auto">因为模型想理解代码，本身就必须获得一定的代码上下文。</p>
<p dir="auto">但需要区分两个概念：</p>
<pre><code class="language-text">为了完成当前 Prompt 提交必要上下文
</code></pre>
<p dir="auto">和：</p>
<pre><code class="language-text">自动打包整个 Workspace + 完整 Git 历史
</code></pre>
<p dir="auto">两者的数据范围差异非常大。</p>
<p dir="auto">截至原作者调查时，其认为官方文档及隐私说明没有非常明确地向用户解释：</p>
<blockquote>
<p dir="auto">Workspace Snapshot 是否会包含整个 <code>.git</code> 历史，以及这一机制具体如何上传和保存。</p>
</blockquote>
<p dir="auto">这也是此次争议最大的地方之一。</p>
<hr />
<h1>Linux 用户如何检查？</h1>
<p dir="auto">如果安装了 ZCode，可以先查看：</p>
<pre><code class="language-bash">du -sh ~/.zcode
</code></pre>
<p dir="auto">然后：</p>
<pre><code class="language-bash">du -sh ~/.zcode/v2/checkpoints
</code></pre>
<p dir="auto">继续检查：</p>
<pre><code class="language-bash">find ~/.zcode/v2/checkpoints -type f -ls
</code></pre>
<p dir="auto">如果发现大量：</p>
<pre><code class="language-text">.enc
</code></pre>
<p dir="auto">文件或者体积异常大的 Snapshot 文件，就值得进一步检查。</p>
<hr />
<h1>如何阻止 Snapshot 写入？</h1>
<p dir="auto">原作者提供了一种比较直接的方法：</p>
<p dir="auto"><strong>从文件系统层阻止 ZCode 写入 checkpoints 目录。</strong></p>
<p dir="auto">Linux：</p>
<pre><code class="language-bash">rm -rf ~/.zcode/v2/checkpoints
mkdir -p ~/.zcode/v2/checkpoints

sudo chattr +i ~/.zcode/v2/checkpoints
</code></pre>
<p dir="auto">验证：</p>
<pre><code class="language-bash">touch ~/.zcode/v2/checkpoints/test
</code></pre>
<p dir="auto">正常情况下会看到类似：</p>
<pre><code class="language-text">Operation not permitted
</code></pre>
<p dir="auto">这意味着目录已经被设置为 Immutable。</p>
<p dir="auto">应用程序无法继续往里面创建 Snapshot。</p>
<hr />
<h2>Linux 如何恢复？</h2>
<p dir="auto">执行：</p>
<pre><code class="language-bash">sudo chattr -i ~/.zcode/v2/checkpoints
</code></pre>
<p dir="auto">即可解除锁定。</p>
<hr />
<h1>macOS</h1>
<p dir="auto">macOS 可以使用：</p>
<pre><code class="language-bash">rm -rf ~/.zcode/v2/checkpoints
mkdir -p ~/.zcode/v2/checkpoints

chflags uchg ~/.zcode/v2/checkpoints
</code></pre>
<p dir="auto">解除：</p>
<pre><code class="language-bash">chflags nouchg ~/.zcode/v2/checkpoints
</code></pre>
<hr />
<h1>会不会影响 ZCode 正常使用？</h1>
<p dir="auto">按照原作者测试：</p>
<p dir="auto">代码补全、AI 对话、工具调用等主要功能仍可以正常使用。</p>
<p dir="auto">但是与 Snapshot 相关的：</p>
<pre><code class="language-text">Checkpoint / Timeline / 回滚
</code></pre>
<p dir="auto">等能力可能无法正常工作。</p>
<p dir="auto">所以是否采用这种方式，需要根据自己的使用场景决定。</p>
<hr />
<h1>最值得关注的其实不是「AI 会不会读取代码」</h1>
<p dir="auto">现在使用 Cursor、Claude Code、Codex、ZCode 等 AI Coding 工具，让模型读取部分源码本身并不奇怪。</p>
<p dir="auto">否则模型也没办法帮你改代码。</p>
<p dir="auto">真正需要关注的是：</p>
<h3>1. 上传范围</h3>
<p dir="auto">读取当前任务相关代码，和上传整个 Git Repository 的历史，是完全不同的数据范围。</p>
<p dir="auto">尤其：</p>
<pre><code class="language-text">.git/objects
.git/lfs
.git/logs
.git/config
</code></pre>
<p dir="auto">可能包含大量当前工作区里已经不存在的信息。</p>
<h3>2. 用户是否充分知情</h3>
<p dir="auto">如果存在完整仓库 Snapshot，那么应该明确告诉用户：</p>
<pre><code class="language-text">上传什么
什么时候上传
为什么上传
保存多久
能否关闭
谁能够解密
</code></pre>
<p dir="auto">而不是让用户自己通过几百 MB 的缓存文件才发现。</p>
<h3>3. 企业源码风险</h3>
<p dir="auto">对于个人开源项目影响可能相对有限。</p>
<p dir="auto">但如果你使用 AI Coding 工具打开的是：</p>
<ul>
<li>公司商业源码</li>
<li>尚未发布的产品</li>
<li>内网项目</li>
<li>客户代码</li>
<li>NDA 项目</li>
<li>带有历史密钥的 Git 仓库</li>
</ul>
<p dir="auto">那么就应该特别关注 AI Coding 工具到底会扫描和上传哪些内容。</p>
<hr />
<h1>建议</h1>
<p dir="auto">如果正在使用 ZCode 处理商业项目，可以先自行检查：</p>
<pre><code class="language-bash">~/.zcode/v2/checkpoints/
</code></pre>
<p dir="auto">目录。</p>
<p dir="auto">同时建议所有使用 AI Coding 工具的开发者都养成一个习惯：</p>
<p dir="auto"><strong>不要只关心「AI 会读取哪些代码」，还应该关心「客户端到底会向外发送哪些文件」。</strong></p>
<p dir="auto">对于企业项目尤其如此。</p>
<p dir="auto">AI Coding 确实越来越好用，但：</p>
<blockquote>
<p dir="auto">AI 可以理解代码，并不意味着所有历史代码都应该默认离开开发者的电脑。</p>
</blockquote>
<p dir="auto">在官方进一步解释 Snapshot 的用途、范围、保存期限以及关闭机制之前，对于包含商业源码、密钥历史和内部仓库信息的项目，谨慎一些并没有坏处。</p>
<hr />
<p dir="auto"><strong>来源说明：</strong></p>
<p dir="auto">本文根据 ferstar 于 2026 年 9 月 18 日发布的《扒一扒 ZCode 静默上传全量 Git 历史的骚操作》进行整理，并结合 ZCode 当前公开隐私政策重新组织内容。</p>
<p dir="auto">原文属于开发者个人逆向分析及实测结果，相关行为的具体设计目的及服务端数据处理方式，仍应以 ZCode 官方后续说明为准。</p>
]]></description><link>https://jike.info/topic/58567/zcode-被曝后台上传工作区快照-包含完整-git-历史</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 17:16:17 GMT</lastBuildDate><atom:link href="https://jike.info/topic/58567.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 18 Sep 2026 08:38:00 GMT</pubDate><ttl>60</ttl></channel></rss>