网易首页 > 网易号 > 正文 申请入驻

40位SHA被同名分支顶掉,四个AI编程代理装错了代码

0
分享至

一个插件市场审核了某个提交,你的编程代理装完报告"安装成功",实际跑的却是另一个提交的代码。唯一的痕迹是 git 抛出的一句警告:refname is ambiguous(引用名有歧义)。


这就是 Plugin4Shell。它由 Air Security 的 Or Nevo、Dor Granat 和 Niv Hoffman 于 2026 年 9 月 17 日公开,波及 Claude Code、Codex、GitHub Copilot 和 Gemini CLI 的插件安装器。Air 把根因称为"少了一次检查":代理检出了被固定的提交,却从没验证自己真的落在了那个提交上。

一串 40 位的十六进制字符,看起来只能指向一个东西。事实并非如此——分支可以叫这个名字,而攻击用的正是这一点。

安装器到底跑了什么

Air 的报告中给出了命令。Claude Code、Codex 和 Copilot 走的是:先 git clone,再 git checkout 那个提交号。Gemini CLI 则是先浅克隆,再 git fetch origin,最后 git checkout FETCH_HEAD。

攻击链条是这样的:

  • 先发布一个无害插件,通过审核,市场把提交 aaa… 固定下来,用户装的就是这个被审核的版本。
  • 再推一个无害更新,市场重新固定到 bbb…。
  • 创建一个名为 bbb… 的分支,指向恶意代码,并把它设为仓库的默认分支。被审核的那个提交仍留在仓库里,没被动过。
  • 固定值变化触发后台插件更新,git 把这个名字解析成了分支,代码在没有任何提示的情况下被执行。

Gemini CLI 的变体只是把第四步换成了默认分支名叫 FETCH_HEAD。固定值还在,只是压在它上面的名字指向了别处。

为什么分支赢了

git 对同一串字符有两种读法,取决于命令。

git rev-parse 走的是 object-name.c 里的 get_oid_basic。当输入恰好是 40 位十六进制时,它返回那个对象 ID。即使存在同名引用,它也只是打印警告,仍然返回对象——提交赢。

git checkout 走的是 builtin/checkout.c 里的 setup_new_branch_info_and_source_tree。它解析参数后,检查 refs/heads/ 下是否存在同名引用。如果存在,就用分支的提交替换掉那个提交,并切换到该分支——分支赢。

git 自己的提示文本甚至写着,这类引用"在你只指定 40 位十六进制时会被忽略"。这句话对版本查找成立,对检出并不成立。同样的 40 个字符,两个答案:rev-parse 拿到提交,checkout 拿到分支。

分支还必须是默认分支,原因在于 git clone 的工作方式。克隆只为远端的默认分支创建本地分支,其他分支都以 refs/remotes/origin/ 下的远程跟踪引用形式存在,checkout 找不到同名本地分支,就会退回提交。Air 确认,非默认分支无法完成这次攻击。

Gemini CLI 那条路径以同样的方式失败,只是名字不同。FETCH_HEAD 通常是 git fetch 写在 .git/ 里的一个文件,记录刚取回的内容。如果克隆的默认分支就叫 FETCH_HEAD,同名本地分支存在,checkout 会优先选它,取回的固定提交永远到不了磁盘。换个引用名并不是防御手段,真正有效的是在检出之后检查落地的到底是什么。

影响范围比标题小

GitHub 会拦截这种分支名。其文档称不允许看起来像 Git 对象 ID 的名字,即 40 位 0-9 和 A-F 组成的字符串。一位 GitHub 发言人告诉 The Register,这"确保所报告的漏洞无法在 GitHub 上被利用"。GitLab 在推送时也有类似检查。

其他托管方没有这道防线。Air 称 Bitbucket 和自建 git 服务器接受 SHA 形状的分支名。Claude Code 的文档把 GitLab、Bitbucket、GitHub Enterprise Server 或其他 git 托管方列为可以托管插件市场的地方。

FETCH_HEAD 是否被覆盖并不明确。The Hacker News 指出,GitHub 的规则"没有明确拦截这个名字"。

零点击取决于自动更新。Air 称 Claude Code 和 Codex 默认在后台更新已安装插件。Anthropic 的文档口径更窄:对第三方市场,后台自动更新处于关闭状态,直到用户或管理员开启。The Hacker News 对 Anthropic 和 GitHub 文档的解读一致:只有各代理自带的市场默认开启,外部市场则是关闭或可选。

目前还没有 CVE。截至 9 月 18 日,The Hacker News 没有发现任何 CVE,四家厂商也没有发布公告,没有迹象显示该漏洞已在真实攻击中被使用。

所以现实中的目标群体是:使用自建或 Bitbucket 市场、开着自动更新的团队,或者任何手动从这类市场更新插件的人。这比标题暗示的范围小,但这群人恰恰最可能运营私有市场。

还有一个问题悬着。The Hacker News 指出,没有人说明更新代理时,是会移除已经被掉包的插件,还是只拦截未来的掉包。

修复方案与各家的进度

Air 建议的检查只有一行,在检出之后运行:test "$(git rev-parse HEAD)" = "$PIN" || exit 1。它比对落地的东西和获批的东西,不管 git 怎么理解那个名字。

OpenAI 的补丁 PR #34644"Verify Git plugin SHA checkouts"于 2026 年 7 月 22 日合并,在 Codex 里做了同样的事。其描述写道:"当远端的默认分支同名时,Git 可能把请求的提交 SHA 解释为分支名。"它在检出后解析 HEAD,不匹配就拒绝该来源。该修复随 Codex 0.146.0 发布。

各家现状:Gemini CLI 已被弃用但仍在运行。Google 于 2026 年 6 月 18 日停止向 Google AI Pro、Ultra 和免费个人账户提供它,它仍可通过付费 API 密钥以及 Gemini Code Assist 标准版或企业版使用,而这些安装就是漏洞的留存处。Google 引导用户转向 Antigravity,据 TNW 报道,它没有可被绕过的插件固定机制。

如果你同时跑多个代理,就更新每一个 CLI。在终端里:claude --version 看是否从 2.1.179 起修复,codex --version 看是否从 0.146.0 起修复,然后 claude update、npm install -g @openai/codex@latest。Codex 如果不是用 npm 装的,就按原来的方式更新。Copilot 的插件源留在 GitHub 上,那里推不了 SHA 命名的分支。Gemini CLI 方面,GitHub 的规则没有明确覆盖 FETCH_HEAD 分支,如果还在用就迁走。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
日本网友:福原爱穿透视装出镜看着真让人难受 她以前可是国民妹妹

日本网友:福原爱穿透视装出镜看着真让人难受 她以前可是国民妹妹

劲爆体坛
2026-10-18 07:59:06
轰动全国的“91大神”庭审细节曝光,炸翻无数人

轰动全国的“91大神”庭审细节曝光,炸翻无数人

鸣金网
2026-10-18 14:17:30
外资撤了品牌就变味?汉堡缩水、星巴克换配乐,消费者失去了啥?

外资撤了品牌就变味?汉堡缩水、星巴克换配乐,消费者失去了啥?

浯江孤舟
2026-10-18 21:48:45
尊界刹车事件,三部门还没出结论,舆论就已经反转了!

尊界刹车事件,三部门还没出结论,舆论就已经反转了!

葱哥说
2026-10-18 21:43:54
WTA最新排名公布:郑钦文再升1位创2026新高,小花施晗首进前200

WTA最新排名公布:郑钦文再升1位创2026新高,小花施晗首进前200

全景体育V
2026-10-19 09:12:23
牛逼!刚刚公布:GDP增速4.6%,人均收入大涨5.3%

牛逼!刚刚公布:GDP增速4.6%,人均收入大涨5.3%

说财猫
2026-10-19 11:00:27
个人是养老第一责任人?!

个人是养老第一责任人?!

News脑洞
2026-10-19 09:49:49
压榨百姓换不来国富:国家真正的底气,永远来自亿万普通人

压榨百姓换不来国富:国家真正的底气,永远来自亿万普通人

天气观察站
2026-10-19 06:35:08
40岁物理学博士被“非升即走!连续四年申请基金全失败,被批“不是主流研究”,可就在离开那年,他出了成果、发了顶刊

40岁物理学博士被“非升即走!连续四年申请基金全失败,被批“不是主流研究”,可就在离开那年,他出了成果、发了顶刊

学术眺望
2026-10-19 08:45:03
网传社保新规11月1日实施,自愿放弃社保无效,网络炸锅...

网传社保新规11月1日实施,自愿放弃社保无效,网络炸锅...

慧翔百科
2026-10-19 08:43:01
苹果首次公布折叠屏iPhone Duo电池容量:4883mAh 由两块电池组成

苹果首次公布折叠屏iPhone Duo电池容量:4883mAh 由两块电池组成

cnBeta.COM
2026-10-19 01:09:03
中科院对15个省研究后发现,江浙沪人群体内的化学物质浓度包揽前三名

中科院对15个省研究后发现,江浙沪人群体内的化学物质浓度包揽前三名

西虹市闲话
2026-10-17 11:23:23
我认为:如果当初中国不改革开放,今天仍是全球最落后的国家之一

我认为:如果当初中国不改革开放,今天仍是全球最落后的国家之一

麓谷隐士
2026-10-19 00:05:04
特斯拉这台被夸上天的飞行汽车,座舱后面塞了两个“定时炸弹”

特斯拉这台被夸上天的飞行汽车,座舱后面塞了两个“定时炸弹”

不掉线电波
2026-10-18 22:54:55
中国留学生旭日旗事件!栽的不只陈宇昕!被架在火上烤的是他全家

中国留学生旭日旗事件!栽的不只陈宇昕!被架在火上烤的是他全家

牛锅巴小钒
2026-10-19 07:59:05
乒乓球亚锦赛今天开打,10月19日央视CCTV5,CCTV5+节目单

乒乓球亚锦赛今天开打,10月19日央视CCTV5,CCTV5+节目单

小齐艰难度日
2026-10-19 07:22:22
北上广落榜!中国驻军密度最高的4座城,每一座都是“国门命门”

北上广落榜!中国驻军密度最高的4座城,每一座都是“国门命门”

纪史行者
2026-10-19 01:40:05
中国游客去土耳其玩滑翔伞起飞失败,从1200米的悬崖滚了下去,全身多处受伤,所幸挂在树上得救,当事人:发生在自己身上才觉得后怕

中国游客去土耳其玩滑翔伞起飞失败,从1200米的悬崖滚了下去,全身多处受伤,所幸挂在树上得救,当事人:发生在自己身上才觉得后怕

扬子晚报
2026-10-19 07:48:19
男子为戒烟,每天存下40元!9个月后烟钱摆满一床,给妻子买了折叠手机;妻子:不在乎钱在乎丈夫身体

男子为戒烟,每天存下40元!9个月后烟钱摆满一床,给妻子买了折叠手机;妻子:不在乎钱在乎丈夫身体

都市快报橙柿互动
2026-10-18 23:06:49
泽连斯基称若乌“被要求”举行战时选举他将竞选连任

泽连斯基称若乌“被要求”举行战时选举他将竞选连任

环球网资讯
2026-10-19 07:36:40
2026-10-19 13:00:49
摸鱼算法
摸鱼算法
致力于用最前沿的AI技术,换取更多发呆时间的三十岁青年。
171文章数 75关注度
往期回顾 全部

科技要闻

王晟:近千亿资金涌入后 具身智能开始退烧

头条要闻

女局长被举报包养未成年 遭"仙人跳"敲诈19万后免职

头条要闻

女局长被举报包养未成年 遭"仙人跳"敲诈19万后免职

体育要闻

从NBA退役10年后,他真去警局上班了

娱乐要闻

演员许君聪近况曝光 婚恋成谜让人唏嘘

财经要闻

三季度GDP,同比增长4.5%

汽车要闻

不知道二代海鸥多好玩? 上赛道跑两圈 很过瘾的

态度原创

艺术
教育
亲子
时尚
本地

艺术要闻

17幅 国外画家的静物与人物油画

教育要闻

日常英语:社交媒体随手点赞可能会让人误会

亲子要闻

潮州月子中心现在靠谱的机构多吗?

重阳寻香:一炉香,一枚囊,她们以手传香

本地新闻

因新荣记出圈,这座浙东小城才是吃货天堂

无障碍浏览 进入关怀版