Grok Build CLI 默认将整个 Git 仓库上传至 xAI 存储
2026 年 7 月的一份网络层拆解显示,xAI 的 Grok Build CLI 默认会把被跟踪的整个仓库及完整提交历史上传到 xAI 云存储——而且关闭「用于训练」的选项也无法阻止它。
这是什么?
2026 年 7 月 12 日,一位以 cereblab 名义发表的研究者发布了对 xAI 的 Grok Build 编程 CLI(版本 0.2.93)的网络层拆解,The Hacker News 于 7 月 14 日进行了报道。这不是一次远程利用,而是一处由默认行为导致的数据暴露:Grok Build 会把被跟踪的整个 Git 仓库及其完整提交历史上传到 xAI 运营的 Google Cloud Storage 存储桶,而不仅仅是任务所需的文件。这些抓包证据表明了代码的传输、被接收与存储;它们并不主张 xAI 用其进行了训练,也不主张有员工阅读过。
本站读者应当关注它,因为它具体地体现了一个更广泛的问题:云端编程智能体并非「本地优先」,而多数开发者以为能保护自己的那个设置——「不用于训练」的开关——所管辖的其实是另一回事。
工作原理
任何云端编程智能体都必须把部分源代码发送给远程模型才能工作;这一通道是预期之内的。问题在于离开机器的内容范围,以及走的是哪条通道。
研究者对该 CLI 进行了插桩,并区分了两条通道。在一个由模型从未打开过的文件组成、大小为 12 GB 的测试仓库上,发往 /v1/responses 的「模型轮次」流量约为 192 KB,而一条独立的、发往 /v1/storage 的存储通道则搬运了约 5.10 GiB——模型所需与实际上传之间约有 27,800 倍的差距。上传以 73 个约 75 MB 的分块进行,每个都返回 HTTP 200,其体量随仓库总大小变化。目标存储桶 grok-code-session-traces 在二进制文件以及一个预置的 metadata.json 中均被写明。
为证明该上传是不加区分的,研究者放置了一个从未被读取的诱饵文件(src/_probe/never_read_canary.txt),带有唯一标记,并明确指示智能体不要打开它;随后他从被截获的请求中克隆出 Git 包,原样恢复出该诱饵文件以及仓库的完整历史。在另一个无关的仓库上重现了相同结果。
另一条更简单的路径涉及机密:当 Grok 在任务中读取某个文件时,其内容会进入「模型轮次」,一个被跟踪的 .env 未经脱敏便随之发出(其中是放置的伪造 API_KEY 与 DB_PASSWORD 值),并同样进入一个准备上传存储的 session_state 归档。
关键在于:多数开发者会去点的那个设置毫无作用。在「Improve the model」关闭的情况下,Grok 仍然上传了仓库,而服务器的 /v1/settings 响应依旧返回 trace_upload_enabled: true。该开关管辖的是你的数据是否用于训练模型——而非你的代码是否离开机器。这是两个不同的控制项,而只有其中一个向用户开放。
为何重要
一个仓库远不止其当前的工作区。它可能包含专有代码、内部 URL、客户数据,以及那些已从工作区移除但仍留在提交历史中的凭据。上传被跟踪的整个仓库及其历史,是比只发送任务打开的少数文件宽得多的边界。在研究者本人的跨工具对比中,Claude Code 与 Codex 没有发送任何仓库包,Gemini 在空闲测试中也没有发送;Grok Build 是异类。它们仍然都是会传输所打开文件的云端工具——因此「仅本地」对任何编程智能体而言都是错误的心智模型——但对整个工作区的批量收集在此处是 Grok Build 特有的。
防御
先轮换已暴露的凭据。 如果你用过该工具,请轮换 Grok 可能发送过的一切:它读取过的内容、任何被跟踪文件中的内容,以及 Git 包所携带历史中的内容——包括曾经提交后又删除的机密。事后删除文件并不能把它从历史中移除。
使用真正的数据控制项,而非训练开关。 对 Grok 个人订阅者,xAI 声明的控制方式是在 CLI 中运行 /privacy 以关闭保留并删除已同步的数据;采用「零数据保留」(ZDR)的企业团队被描述为从未存储过代码或轨迹数据。请自行验证其行为,而不要依赖一个并不管辖数据外泄的训练开关。
让机密远离被跟踪的文件与历史。 使用机密管理器与环境变量注入,而非提交 .env;在首次提交前把机密加入 .gitignore;并扫描与清理历史中已提交的凭据。
把智能体的网络出站视作一条边界。 尽可能在网络层监控编程智能体实际发送的内容,优先选择只传输任务所需文件的工具,并牢记:一条被服务器标志位关闭的收集路径,无需更新客户端即可被重新开启。
状态
| 项目 | 参考 | 备注 |
|---|---|---|
| 披露 | cereblab 网络层拆解,2026-07-12 | Grok Build CLI 0.2.93;仓库+历史上传至 grok-code-session-traces |
| 报道 | The Hacker News,2026-07-14 | 印证通道拆分、诱饵恢复与未脱敏的 .env |
| 厂商回应 | xAI / @SpaceXAI / 马斯克,于 X | 2026-07-13 服务器端关闭上传;个人用户用 /privacy;企业用 ZDR;承诺删除但未获独立验证 |
| 潜伏代码 | 对 0.2.99 构建的分析 | 上传代码据称仍在二进制中,被服务器标志位拦住——无需更新即可重新开启 |
| 归类 | 数据暴露 / 隐私 | 非 CVE;抓包显示的是传输与存储,而非训练 |
持久的教训是治理层面的:一个「不要用我的数据训练」的开关,并不等于保证你的代码留在你的机器上。对任何云端编程智能体,都应把仓库出站当作一个独立的控制面,让凭据远离被跟踪的历史,并亲自核实究竟有什么离开了机器。
Sources
- → https://thehackernews.com/2026/07/grok-build-uploads-entire-git.html
- → https://gist.github.com/cereblab/dc9a40bc26120f4540e4e09b75ffb547
- → https://github.com/cereblab/grok-build-exfil-repro/blob/main/COMPARISON.md
- → https://www.theregister.com/ai-and-ml/2026/07/14/musk-promises-purge-after-grok-build-caught-sending-entire-repos-to-the-cloud/