Plugin4Shell 四款编程 Agent 的 SHA 锁定为何形同虚设
Air Security 2026 年 9 月披露 Plugin4Shell:Git 把 commit SHA 解析成同名分支,插件自动更新会在零点击下换成恶意代码。对照 Claude Code、Codex、Copilot、Gemini CLI 补丁状态。

2026 年 9 月 17 日起,The Hacker News、The Register 与 Air Security 集中披露 Plugin4Shell:Claude Code、OpenAI Codex、GitHub Copilot、Google Gemini CLI 在「把插件 pin 到某次 commit」时,没有验证 checkout 后的 HEAD 是否真的落在该 commit。攻击者若控制插件源仓库,可创建与 40 位 SHA 同名的分支或 tag,配合默认开启的插件自动更新,实现零点击 RCE。截至 9 月 18 日,公开渠道仍未分配 CVE,四家里两家已修、一家不修、一家无补丁。
Git 如何把「精确 SHA」变成「可漂移 ref」
OpenAI 在 Codex 0.146.0 的修复说明里写得很直白:Git 有时会把请求的 commit SHA 当作分支名解析。Marketplace 记录的是「审核过的 commit hash」,Agent 本地执行 git checkout <hash> 后若不跑 git rev-parse HEAD 比对,磁盘上的代码可以是另一套 tree。
Air 的研究员 2026 年 5 月已在四款 Agent 上跑通 PoC,6 月协调披露。THN 9 月 18 日复现了底层 Git 行为,并确认默认 catalog 里大量插件仍指向 GitHub 仓库,供应链面没有因「官方 marketplace」而消失。
这与仓库级 GitSpawn 不同:GitSpawn 利用 .git/config 里的 core.fsmonitor;Plugin4Shell 利用的是已安装插件的更新通道,受害者甚至不需要打开陌生 zip。
四家 Agent 补丁矩阵(2026-09-20 公开信息)
| Agent | 修复版本(Air/厂商) | 未升级时的动作 |
|---|---|---|
| Claude Code | ≥ 2.1.179 | claude update,见专项升级文 |
| Codex | ≥ 0.146.0 | npm update -g @openai/codex |
| GitHub Copilot | 无 Agent 侧补丁(Air) | 减插件面、关自动更新 |
| Gemini CLI | 不修复(产品退役) | 迁 Antigravity |
Anthropic 2.1.179 的 release notes 未突出安全条目,Air 是主要公开来源;Copilot 侧 Microsoft 称 GitHub 禁止创建「形似 SHA」的分支名,但 Copilot 仍可从 Bitbucket、GitLab 等 marketplace 装插件,向量未关。
为什么 marketplace 扫描挡不住
Registry 只能看到「发布时 pin 的 hash」,看不到你本机 checkout 之后 HEAD 落在哪。验证必须在 Agent 客户端完成:checkout 后立即 git rev-parse HEAD 与 lockfile 比对,不匹配则拒绝加载并告警。WPS/dev.to 9 月 19 日转述 Air 时强调,这是 client-side gap,不是再加一层云端扫描能替代的。
企业若已做 不可信仓库 intake,应把「已装插件列表 + pin 哈希 + 自动更新策略」并进同一 onboarding:Plugin4Shell 不需要用户再 clone 一次恶意 repo。
个人开发者今天先做三件事
查版本:Claude Code ≥ 2.1.179,Codex ≥ 0.146.0(与 CVE-2026-19592 GitSpawn 清单 一并核对,别只升一次停在一个中间版)。
Copilot / 未迁走的 Gemini CLI:假设暴露,删不用的插件,并关闭 marketplace 插件自动更新(同批 608 文详述)。
团队 CI:禁止 Agent 在 PR 里静默升级 marketplace pin,变更走人工 review。