Plugin4Shell:绕过 SHA 锁定,让自动更新变成远程代码执行
AIR Security(2026 年 9 月 17 日)发现一个零点击漏洞,使可信插件更新能在 Claude Code、Codex、Copilot 和 Gemini CLI 中悄然替换为恶意代码。
这是什么?
2026 年 9 月 17-18 日,AIR Security 的研究员 Or Nevo、Dor Granat 与 Niv Hoffman 发布了 Plugin4Shell:一个存在于四款主流 AI 编程智能体插件安装逻辑中的零点击远程代码执行漏洞,涉及 Claude Code(Anthropic)、Codex(OpenAI)、GitHub Copilot(Microsoft)和 Gemini CLI(Google)。该漏洞于 2026 年 5 月被发现,2026 年 6 月披露给相关厂商,因此本次公开发布遵循了标准的、超过 90 天的负责任披露期限。AIR Security 将其称为首批针对 AI 智能体生态系统本身的供应链漏洞之一。
该漏洞与模型权重或提示词无关,针对的是 **SHA 锁定(SHA-pinning)**机制——这四款智能体的插件市场均采用的做法:将已安装的扩展固定在审核人员批准的确切提交哈希上,目的正是防止后续未经审核的更新悄然改变实际安装的内容。
工作原理
这四款智能体在同一个底层校验环节上失效,具体表现为两种不同的方式,二者都源于 git checkout 解析名称的方式。
对于 Claude Code、Codex 和 GitHub Copilot,智能体按 40 位提交哈希检出插件,但从不确认最终得到的工作树是否真的对应该提交。而 Git 在分支名与提交哈希同名时,会优先选择分支引用。攻击者只要掌控插件所在仓库,就能创建一个与被批准哈希同名的分支,将其指向完全不同的代码,并将其设为仓库的默认分支——此后检出操作会悄然解析到这个恶意分支,而在任何审计插件市场条目的人看来,锁定机制依然”生效”。
Gemini CLI 则通过自身的路径打破了同样的保证:它将锁定的提交拉取到 FETCH_HEAD,但检出操作可能被重定向到与该名称同名的分支,而不是实际拉取到的对象,从而使锁定形同虚设。
整条攻击链完全不需要受害者交互:(1)攻击者发布一个通过市场审核、被正常锁定的无害插件;(2)用户安装该插件;(3)攻击者发布一次看似例行的更新,市场随之将锁定更新到新的提交;(4)攻击者创建一个同名分支指向恶意代码,并将其设为默认分支;(5)每台安装设备的后台自动更新——这是 Claude Code 和 Codex 的默认行为——重新执行这段有缺陷的检出逻辑,在无人点击任何东西的情况下拉取攻击者的代码。
示例提示
在编码智能体应用插件更新之前,可以交给它的一段防御性提示。它在检出后重新核对锁定的提交哈希,而不是信任插件市场的列表信息,恶意分支已做屏蔽处理——重点是需要发现的不一致,而非可用的攻击配置。
# Defensive check — before an agent applies a plugin update
For each installed plugin, report: pinned commit hash, the hash actually
checked out (git rev-parse HEAD), and the default branch of its repository.
Flag any plugin where:
- the checked-out HEAD differs from the pinned hash
- a branch name equals a 40-char commit hash, e.g. [branch named like a hash]
- the update came in through background auto-update with no review
Do not install, update, or run anything. Output the verification table only.
为何重要
编程智能体的插件市场继承了软件包仓库的信任模型,但真正的校验点却设在了错误的位置:正如 AIR Security 所言,锁定是在智能体内部被解析的,因此市场侧的任何检查都无法替代正确的实现——修复必须落在智能体本身的二进制程序里。如果没有机制在检出时重新校验锁定,一个”通过了审核”的插件只会给人一种虚假的持久安全感。由于更新是自动且悄无声息地生效的,暴露范围覆盖了每一台运行受影响智能体且安装了插件的机器,而不仅仅是主动选择升级的用户。此外,编程智能体在本地运行时通常拥有较高权限——文件系统访问、命令执行、环境中的凭据——因此以这种方式被替换的代码,继承的是与智能体任何其他操作同等的影响范围。
防御
- 尽快更新已有补丁的版本:Claude Code 2.1.179(2026 年 6 月)与 Codex 0.146.0(2026 年 8 月 12 日)均已修复底层检出缺陷。
- GitHub Copilot 截至发布时仍无补丁——应将已安装的 Copilot 插件视为未经验证,在微软发布补丁前避免安装来自不熟悉发布者的新插件。
- Gemini CLI 已被弃用,且不计划修复;Google 建议用户迁移至 Antigravity,该产品不使用同样的市场级 SHA 锁定机制。
- 在智能体支持的情况下,关闭插件的后台自动更新,并在应用更新前手动重新审查插件。
- 如果你为任何智能体框架维护自己的插件或扩展锁定机制,务必在检出后校验实际检出树的提交哈希,而不只是确认检出命令引用了正确的锁定值——并拒绝任何分支名与你所依赖的提交哈希发生冲突的仓库。
- 将插件市场视为软件供应链的一部分:对其施加与 npm 或 PyPI 依赖同等严格的仓库锁定与来源审查(签名提交、受保护分支、不允许攻击者可重命名的默认分支)。
Status
| 项目 | 详情 |
|---|---|
| 主要来源 | AIR Security,《Plugin4Shell》,发布于 2026 年 9 月 17-18 日 |
| 研究人员 | Or Nevo、Dor Granat、Niv Hoffman(AIR Security) |
| 发现 → 披露 → 发布 | 2026 年 5 月 → 2026 年 6 月 → 2026 年 9 月 |
| 受影响产品 | Claude Code(Anthropic)、Codex(OpenAI)、GitHub Copilot(Microsoft)、Gemini CLI(Google) |
| Anthropic | 已修复 —— Claude Code 2.1.179(2026 年 6 月) |
| OpenAI | 已修复 —— Codex 0.146.0(2026 年 8 月 12 日) |
| Microsoft | 截至发布时尚未修复 |
| 不计划修复 —— Gemini CLI 已弃用,建议迁移至 Antigravity |