您的编码智能体在您输入之前就运行了 git —— 而命令由仓库决定
Manifold Security 于 2026 年 9 月 1 日披露了涉及七款命令行编码智能体的八项缺陷:收到的仓库自带的 git 配置指定了一个程序,智能体在启动时于沙箱之外执行它。
这是什么?
2026 年 9 月 1 日,Manifold Security 发布了 GitSpawn:涉及七款命令行 AI 编码智能体的八项发现。在这些场景中,别人发送给您的仓库可以指定一条命令,由智能体在您的机器上执行。截至发布时仍有四项未修复,且已在当前版本上重新确认。The Hacker News 次日进行了报道,并指出 OpenAI 当天也就 Codex 中同一类缺陷发布了三份自有公告,分别归功于三个互不相关的研究团队。
受影响的产品并非小众。Claude Code、OpenAI Codex、Cursor CLI、goose、Qwen Code、Grok Build 与 Hermes Agent —— 其中开源项目累计接近五十万 GitHub star,而仅 Claude Code 一项,按 Manifold 引用的 npm API 数据,月下载量就超过 7700 万次。
值得注意的是:这一切都与模型无关。没有提示词,没有注入,没有越狱。问题出在智能体尚未说出任何一句话之前就已派生的子进程。
工作原理
任何命令行编码智能体在打开一个目录时都会收集上下文:当前分支、哪些文件被修改、哪些路径被跟踪。它们都借助 git 来完成这件事 —— 在部分智能体上发生于启动阶段,早于工作区信任提示;在其中一款上,甚至早于用户完成身份认证。
问题在于这些调用继承了什么。
智能体在 ./received-project 中启动
│
├─ 派生: git status --porcelain=2 --branch
│ (或 git diff --name-only HEAD —— 选哪条并不重要)
│
├─ git 在回答前刷新索引
│
├─ 该刷新过程会查阅 core.fsmonitor
│ ……而 git 从 ./received-project/.git/config 读取它
│
└─ 这个值是一个"程序"。git 会执行它。
→ 以用户身份执行
→ 位于智能体沙箱之外
→ 没有审批提示,屏幕上不留痕迹
core.fsmonitor 是面向大型仓库的一项正当性能设置:git 不再逐一检查每个文件,而是询问一个辅助程序有哪些变更。这是有文档记载的既定行为,并且从仓库自身的配置文件中读取。正如 Cobalt 在去年 12 月的一篇红队文章中所写,这属于功能滥用而非漏洞 —— 是 git 的灵活性与现代 IDE 自动化的交汇点。Manifold 还确认了 Claude Code 中的第二条路径,经由一条审查命令触发,依赖的是同类型的另一个配置键;在该问题尚未修复期间,研究人员刻意未公开该键名。
投递方式是使此事仍可控的约束条件。克隆一个恶意 URL 不会产生任何后果。 git clone、fetch 和 pull 都不会携带仓库的本地配置。仓库必须以文件形式送达,且 .git 目录已在其中 —— 一个共享的 .zip、一个同步文件夹、一个共享网盘、一个 U 盘。而这恰恰是同事之间传递项目、顾问向客户交付成果的常见方式。
示例提示
在让智能体打开以文件形式收到的目录之前,可以交给它的一段防御性提示。它检查配置而不是信任配置,恶意取值已做屏蔽处理——重点是该设置的形态,而非可用的载荷。
# Defensive check — before opening a repo you RECEIVED as files
Read ./received-project/.git/config. Do not open the folder with an agent yet.
List every key whose value is a program:
core.fsmonitor, core.hooksPath, filter.*.clean, filter.*.process, attr.tree
For each, report the key, its value, and whether that path is executable.
Never run a value you find. A hostile entry looks like:
[core]
fsmonitor = [REDACTED payload path]
Then re-check with a config-stripped call:
git -c core.fsmonitor=false status --porcelain
注意它不做什么:它从不执行找到的取值,最后一次调用剥离了仓库自身的配置而不是读取它。这正是业界要求厂商在 harness 内部落实的不变量。
为什么重要
影响范围是开发者账户,而非智能体会话。攻击者代码以用户权限执行:SSH 密钥、环境中的云凭据、shell 配置中的令牌、磁盘上的每一个仓库。智能体的权限模型从未见到这次调用,因为发起调用的正是智能体自身的代码。
有三点结构性问题值得记取。
沙箱从来就不在这条路径上。 业界已在审批提示与工具沙箱上投入了大量工程资源,针对的是模型决定采取的动作。而此处的一切发生在模型被联系之前。仅覆盖模型发起动作的控制措施,会让运行框架自身的子进程处于无防护状态。
信任提示来得太晚。 在 Claude Code 与 Hermes Agent 上,载荷在工作区信任提示被接受之前即已执行;在 Qwen Code 上,早于身份认证;在 Grok Build 上,在第一次按键时触发。在上下文收集之后才弹出的信任对话框只是装饰。
这是一类已知问题的重新发现。 Sonar 已于 2026 年 4 月报告过同一执行点,并在数年前于 Visual Studio Code 与 JetBrains 系列 IDE 中发现过同样的信任对话框绕过。Anthropic 曾在 2.0.34(2025 年 11 月)中调整启动顺序以关闭该问题;而 Manifold 发现同样的启动行为在 2.1.193(2026 年 6 月)中再次出现。当修复手段是调整执行顺序而非确立不变式时,回归是可预期的结果。
Manifold 的八份报告中有五份被标记为其他研究人员独立提交的重复项,其中一份与他们同日提交。多个团队正在同时收敛于这一攻击面。
防御措施
若您以文件形式收到仓库 —— 即任何并非通过 git clone 获得的内容:
- 在用智能体打开该目录之前,先检查
.git/config。留意core.fsmonitor、core.hooksPath,以及与 clean 或 process 过滤器并存的attr.tree—— 任何取值为程序的设置项。 - 直接检查可疑仓库:
git config --get core.fsmonitor。 - 审计您的全局配置:
git config --global --list | grep fsmonitor。 - 默认关闭该设置:
git config --global core.fsmonitor false。您失去的只是一项绝大多数仓库从未需要的性能优化。 - 优先使用克隆而非解压。若对方发来压缩包,可先推送到远端再克隆,或删除
.git后重新初始化。
若您开发智能体产品 —— Manifold 与 OpenAI 共同推荐的修复方案:
- 在每一次后台调用中剥离仓库配置,例如
git -c core.fsmonitor=false status。应对传入的配置键采用白名单,而非对已知键采用黑名单,因为core.fsmonitor并非唯一的执行汇聚点。 - 将上下文收集移至工作区信任提示之后,并将该顺序视为受测试保障的不变式,而非一次性修补 —— 这一具体顺序此前已经回归过一次。
- 让后台子进程运行在与模型发起的工具调用相同的沙箱内。当前这种分离状态 —— 运行框架自身的调用逃逸出边界 —— 正是根本原因。
在组织层面:固定并跟踪智能体版本(低于修复版本的安装仍处于暴露状态,无论厂商已发布什么),并在威胁模型中将”用智能体打开一个收到的目录”视为一次执行事件,而非一次读取。
状态
| 智能体 | 报告时间 | Manifold 9 月 1 日复测时状态 | 参考 |
|---|---|---|---|
| goose | 2026-07-13 | 已修复,1.44.0 | CVE-2026-72718,CVSS 4.0 基础分 7.0 |
Claude Code(core.fsmonitor) | 2026-06-26 | 已修复,2.1.196 | 厂商未发布公告 |
| Claude Code(审查路径) | 2026-07-15 | 未修复 —— 在 2.1.252 上确认 | 配置键由研究人员保留未公开 |
| OpenAI Codex | 2026-07-20 | 已修复 —— CLI 0.131.0,Desktop 26.519.x | CVE-2026-19592 及另外两项 |
| Cursor CLI | 2026-07-08 | 已修复 | 被判为更早报告的重复项 |
| Qwen Code | 2026-07-07 | 未修复 —— 在 0.22.3 上确认 | 已被阿里巴巴 SRC 受理 |
| Grok Build | 2026-07-14 | 未修复 —— 在 1.0.13 上确认 | 更早的报告被以”仅供参考”关闭 |
| Hermes Agent | 2026-07-20 | 未修复 —— 在 0.21.0 上确认 | CVE-2026-71963,由 VulnCheck 分配 |
| 在野利用 | — | 无来源报告在野利用;截至 2026-09-02,上述编号均未列入 CISA KEV 目录 | — |
上述版本、日期与披露结果均依据 Manifold Security 与 The Hacker News 在所链接文章中的报道。Manifold 表示,在其未点名的其他智能体中也发现了相同模式,并同时保留了可直接使用的仓库样本与 Claude Code 的第二个配置键。请核对您实际安装的版本,而不要假定厂商补丁已经到达您手中。
Sources
- → https://www.manifold.security/blog/ai-coding-agents-git-hijack
- → https://thehackernews.com/2026/09/malicious-git-configs-can-make-claude.html
- → https://github.com/aaif-goose/goose/security/advisories/GHSA-r5pp-p5r8-466r
- → https://www.sonarsource.com/blog/claude-arbitrary-code-execution/
- → https://www.cobalt.io/blog/red-team-technique-exploiting-git-fsmonitor-for-initial-access