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

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-17 11:18:10
美国承认了,很多人以为美国不介入台海是还在犹豫。错了!真相是,他们早就做好了算术题:打不赢,也赔不起

美国承认了,很多人以为美国不介入台海是还在犹豫。错了!真相是,他们早就做好了算术题:打不赢,也赔不起

扶苏聊历史
2026-10-12 13:53:05
懂王鸠摩智为什么必须死

懂王鸠摩智为什么必须死

黔有虎
2026-10-15 11:02:13
东风 - 26 紧急拉动!解放军 6 大海域同步亮剑,美日等 9 国近 6 万人军演压境,具备围台封锁潜力?

东风 - 26 紧急拉动!解放军 6 大海域同步亮剑,美日等 9 国近 6 万人军演压境,具备围台封锁潜力?

林杰论事
2026-10-17 01:20:31
张本智和接受日媒采访:下次再战中国队,日本胜出的可能性也很高

张本智和接受日媒采访:下次再战中国队,日本胜出的可能性也很高

失宠的小野猪
2026-10-17 17:05:50
未来3到5年,找工作将消失?不是没岗位,而是雇佣关系正在崩塌

未来3到5年,找工作将消失?不是没岗位,而是雇佣关系正在崩塌

时尚的弄潮
2026-10-17 06:51:10
特斯拉“起飞”了,中国飞行汽车飞到哪了?

特斯拉“起飞”了,中国飞行汽车飞到哪了?

财联社
2026-10-16 22:38:10
在上海,工龄将近37年,个人账户存了66万多,退休金能拿到多少?堪称退休人员中的“天花板”级别!

在上海,工龄将近37年,个人账户存了66万多,退休金能拿到多少?堪称退休人员中的“天花板”级别!

乐天果果
2026-10-17 15:37:27
台媒:沈伯洋立场大反转被嘲“撒谎又双标”

台媒:沈伯洋立场大反转被嘲“撒谎又双标”

参考消息
2026-10-17 14:32:29
粟裕没当上元帅的真实原因:除了毛主席,高层几乎没人主动提他

粟裕没当上元帅的真实原因:除了毛主席,高层几乎没人主动提他

鱼破笙啊
2026-10-13 20:20:25
平胸龅牙塌鼻,长得难看却火遍全国,这5位女星究竟凭啥能大火?

平胸龅牙塌鼻,长得难看却火遍全国,这5位女星究竟凭啥能大火?

琴琴有氧运动
2026-10-16 15:08:37
林良铭留国安有戏!续约谈判薪资并非大问题,而是一项关键指标

林良铭留国安有戏!续约谈判薪资并非大问题,而是一项关键指标

体坛鉴春秋
2026-10-17 15:18:58
台海战争爆发,西方可冻结3.2万亿中国资产,但中国手里也有王炸

台海战争爆发,西方可冻结3.2万亿中国资产,但中国手里也有王炸

黄大姐
2026-10-09 16:30:07
邹市明与冉莹颖一起到辽宁大孤山问道,邹市明满头白发有点憔悴

邹市明与冉莹颖一起到辽宁大孤山问道,邹市明满头白发有点憔悴

陈意小可爱
2026-10-17 05:33:15
五口之家,埃里克森社媒宣布喜得第三子

五口之家,埃里克森社媒宣布喜得第三子

懂球帝
2026-10-17 05:15:45
很好奇,居民医保一年400元,职工医保一年4000多,到底差在哪?

很好奇,居民医保一年400元,职工医保一年4000多,到底差在哪?

云居历史
2026-10-15 00:27:22
全是一群“工具人”!杨鸣一针见血:中国男篮凭什么赢日本?

全是一群“工具人”!杨鸣一针见血:中国男篮凭什么赢日本?

曹老师评球
2026-10-17 17:10:05
知情人士:乌克兰已耗尽美国提供的“爱国者”拦截弹库存,普京:俄方将回应乌克兰袭击俄罗斯炼油厂,“他们本应该好好想想后果”

知情人士:乌克兰已耗尽美国提供的“爱国者”拦截弹库存,普京:俄方将回应乌克兰袭击俄罗斯炼油厂,“他们本应该好好想想后果”

政知新媒体
2026-10-16 13:48:41
发现中国一个奇怪的现象:只要有公婆帮扶的家庭,儿媳都忙着回公婆家;而公婆不帮的家庭,儿媳早已断联!

发现中国一个奇怪的现象:只要有公婆帮扶的家庭,儿媳都忙着回公婆家;而公婆不帮的家庭,儿媳早已断联!

心理观察局
2026-08-01 07:10:30
特型演员古月弥留之际,全身发青呼吸困难,看到医生后:我不行了

特型演员古月弥留之际,全身发青呼吸困难,看到医生后:我不行了

田螺姑娘说历史
2026-09-30 18:16:11
2026-10-17 19:08:49
摸鱼算法
摸鱼算法
致力于用最前沿的AI技术,换取更多发呆时间的三十岁青年。
250文章数 74关注度
往期回顾 全部

科技要闻

刘煜辉:99%的黄金分析师报告一钱不值

头条要闻

泽连斯基警告:若战败 2000万名乌克兰难民将涌入欧洲

头条要闻

泽连斯基警告:若战败 2000万名乌克兰难民将涌入欧洲

体育要闻

高级货,真高级

娱乐要闻

黄子韬儿子国籍争议,遭知名演员点名

财经要闻

新一轮大跌源头,找到了!

汽车要闻

特斯拉会飞?全新Roadster亮相

态度原创

艺术
游戏
旅游
教育
手机

艺术要闻

书法界公认的顶级行书,曾入选小学课本,苏轼、赵孟頫都曾学它!

爆乳紧身衣丰满诱人开机甲!Muv-Luv新情报10.22公布

旅游要闻

港星汤镇业来泰州看苏超啦!求推荐泰州吃喝玩乐攻略

教育要闻

妈妈看演唱会儿女态度两极:真正该反思的是家庭教育方式

手机要闻

为什么不建议加价买iPhone Duo?五点原因,望周知!

无障碍浏览 进入关怀版