💡 划重点

  • 官方命令行工具暗藏全量上传行为
  • 私钥与云凭证未经确认即外泄
  • 默认遥测直接绑定真实开发环境
  • 安全社区逆向证实非误报、可复现
  • xAI 沉默数日后悄然推出修复版

核心话题

北京时间 2026 年 7 月 14 日凌晨,安全工程师在逆向 xAI 官方发布的 Grok CLI 时发现,该工具在首次启动时会静默扫描用户当前工作目录及其所有子目录,将整个代码库、环境变量文件(如 .env)以及 ~/.ssh~/.aws 等目录下的密钥文件,未经任何脱敏处理完整上传至 xAI 服务器。上传行为没有任何进度提示、确认弹窗,也未在官方文档中说明。该行为被录屏取证并公开后,迅速引发开发者恐慌,因为大量用户已在本地开发机与 CI/CD 流水线中嵌入该 CLI 进行代码审查、生成与测试。

这一事件将 AI 工具链的信任危机推向顶点。这不是第三方恶意软件,而是由马斯克旗下 xAI 官方签名分发、通过 npm 和 Homebrew 正常渠道安装的“正规工具”。攻击面并非来自模型本身的幻觉或注入,而是来自产品设计层面的“默认过度采集”。它暴露了大模型应用从云端落地到开发者终端时,权限边界、数据最小化原则与知情同意几乎完全缺失。用户本应只是让 Grok 阅读某几个文件,结果却变成对自己整台机器的彻底“神识扫描”。

深层逻辑耐人寻味。xAI 一直以“追求真理”与“开源透明”示人,但 Grok CLI 的行为恰恰相反——闭源上传、0 提示、0 开关。这让人质疑其背后是否存在用开发者代码训练下一代模型的意图。尽管 xAI 后续声明称仅为“改进错误检测与上下文理解”,但这种行为已然触犯多国隐私法规,并可能使企业用户违反 SOC2、GDPR 甚至国防供应链合规。

技术细节

输入侧

Grok CLI 的入口是一个看似无害的 grok chatgrok review 命令。用户期望仅当前目录下的指定文件被读入会话。但逆向发现,CLI 在解析参数之前,会初始化一个名为 boot-telemetry 的模块。该模块通过 os.walk 递归遍历当前工作目录树,并额外硬编码检查 ~/.ssh~/.aws~/.config/gcloud,收集所有符合扩展名(.py.js.ts.env.pem.key.json 等)的文件内容。未对文件大小设限制,也未跳过 .git 目录中的对象。上传前使用 gzip 压缩并 Base64 编码,放入 HTTPS POST 请求的 inventory 字段。整个流程无 UI 动画,仅在调试日志(默认关闭)中存在一句 "syncing workspace context"

推理/执行侧

数据上传后,侧端逻辑被触发。xAI 后端将上传的完整仓库与当前请求进行“全上下文注入”。这意味着每次调用 grok review 时,模型上下文窗口不仅包含用户指定的代码片段,还潜在地包含整个仓库、历史环境变量和云凭证。这导致两个技术灾难:其一,模型看到私钥内容后,可能在后续生成建议中不经意泄露,比如“这里可以用你的 AWS 密钥配置 S3 客户端,密钥如下……”;其二,如果任何团队成员将 Grok CLI 连入 CI,那么私有仓库全量快照被传输,等于把知识产权和密钥打包送给 xAI 服务器。而且,由于 token 长度巨大,模型响应延迟与幻觉率显著上升,因为模型被大量无关上下文淹没。

输出/评测侧

此模式下,Grok 的输出中多次返回包含真实 API Key 的建议代码,甚至在错误日志中回显了私钥片段。安全研究员通过搭建蜜罐仓库并放置唯一标记的假密钥,在 Grok 的回复中捕获了该密钥,确认后端不仅是单纯存储,而且在推理过程中原样引用了这些敏感数据。这违反了最低权限原则,也让评测侧的安全评估完全失效——因为没有任何红线模型能阻止模型复述已经进入上下文窗口的真实密钥。泄漏风险从“可能”升级为“实测可复现”。

工程落地

对于已经或计划使用 AI CLI 工具的开发者,必须立刻调整工程实践:

  1. 严格隔离执行环境:将 Grok CLI 或任何 AI 终端工具运行在 Docker 容器或临时虚拟机内,工作目录只挂载需要分析的最小文件集,禁用宿主机 HOME 目录映射。使用 --read-only 根文件系统并设置网络白名单,防止工具遍历非目标路径。
  1. 密钥零落地 + 预提交扫描:彻底移除本地 .env 和密钥文件,改用 secrets manager 动态注入。在 git hooks 中添加 detect-secretstrufflehog 扫描,确保不留任何密钥明文。同时,对 AI 工具的网络请求进行代理拦截,监控是否出现大规模存量文件上传,推荐使用 mitmproxy 加自定义规则告警。
  1. 遥测熔断与版本锁定:在团队级 .grokrc 或环境变量中显式设置 TELEMETRY=0(如果存在该选项),否则直接通过防火墙屏蔽 CLI 发出的未知域名。锁定已知安全版本,订阅安全公告,并在 CI 中校验 CLI 二进制哈希,防止自动更新引入新的采集行为。

风险边界