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

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.

相关推荐
热点推荐
小菲筱梅带小儿子飞湾湾,8个月宝宝好可爱,箖箖又高又帅,篮球打的好

小菲筱梅带小儿子飞湾湾,8个月宝宝好可爱,箖箖又高又帅,篮球打的好

星星没有你亮
2026-10-17 13:39:27
张闻天从总负责人到省委书记,毛主席随后定了一条规矩

张闻天从总负责人到省委书记,毛主席随后定了一条规矩

溯闻
2026-10-11 15:50:08
41岁了,一年2亿欧,说不要就不要,现在联赛捧出来了,账该算了

41岁了,一年2亿欧,说不要就不要,现在联赛捧出来了,账该算了

江启
2026-10-17 19:14:05
大战一触即发!解放军封海仅一天,双航母实弹出动,美日坐立难安

大战一触即发!解放军封海仅一天,双航母实弹出动,美日坐立难安

面包夹知识
2026-10-16 16:08:14
紧急提醒!10月18日北京大批公交有变!出门一定要看好

紧急提醒!10月18日北京大批公交有变!出门一定要看好

黑哥讲现代史
2026-10-18 10:44:19
美国承认了,很多人以为美国不介入台海是还在犹豫。错了!真相是,他们早就做好了算术题:打不赢,也赔不起

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

扶苏聊历史
2026-10-12 13:53:05
这13个草书字,我只认出3个,能100%认识的,您是真有两把刷子!

这13个草书字,我只认出3个,能100%认识的,您是真有两把刷子!

书画相约
2026-10-18 11:06:21
刚去查了张本宇的底,有些话憋了挺久,原来当年他全家改国籍,真不全是为了钱,更多是没路走了

刚去查了张本宇的底,有些话憋了挺久,原来当年他全家改国籍,真不全是为了钱,更多是没路走了

冰雨落花h
2026-10-15 20:29:12
长大后才后知后觉郑渊洁童话的含金量,全是细糠!

长大后才后知后觉郑渊洁童话的含金量,全是细糠!

夜深爱杂谈
2026-10-18 11:47:29
大势不可逆:深圳为何只能一路向西?深中通道彻底锁发展方向

大势不可逆:深圳为何只能一路向西?深中通道彻底锁发展方向

记录生活日常阿蜴
2026-10-18 10:59:08
出轨女子第二波聊天记录曝光,虎狼之词惊呆吃瓜网友,她嫌丢人开始批量投诉了

出轨女子第二波聊天记录曝光,虎狼之词惊呆吃瓜网友,她嫌丢人开始批量投诉了

汉史趣闻
2026-09-01 17:55:01
上强度了,菲律宾海军战机飞越黄岩岛,中国军舰紧急起飞战机应对

上强度了,菲律宾海军战机飞越黄岩岛,中国军舰紧急起飞战机应对

爱迷彩的老虎
2026-10-17 18:11:57
官方:前NBA球员、CBA外援索恩-梅克正式加盟香港金牛

官方:前NBA球员、CBA外援索恩-梅克正式加盟香港金牛

懂球帝
2026-10-18 12:31:06
中国怎么不揍菲律宾?原因很简单:每年都得送2000多亿

中国怎么不揍菲律宾?原因很简单:每年都得送2000多亿

余鴡搞笑段子
2026-10-06 19:50:43
所谓文明,说到底就是政治的文明

所谓文明,说到底就是政治的文明

尚曦读史
2026-10-16 19:20:25
害死300多名战友!俄首席通信官叛变,充当内线从内部瓦解部队

害死300多名战友!俄首席通信官叛变,充当内线从内部瓦解部队

至死不渝的爱情
2026-10-17 17:59:59
因为“真有人用”,所以取消了所有福利?这波操作太真实了

因为“真有人用”,所以取消了所有福利?这波操作太真实了

夜深爱杂谈
2026-10-03 20:30:57
最新试验:每天60克花生连吃4个月,核磁共振拍下惊人一幕!

最新试验:每天60克花生连吃4个月,核磁共振拍下惊人一幕!

徐德文科学频道
2026-10-17 20:03:01
武网决赛黑马对决!冠军带走奖励:1000积分+66.5万美元+创历史

武网决赛黑马对决!冠军带走奖励:1000积分+66.5万美元+创历史

林子说事
2026-10-18 10:45:11
《伟大的长征》临时变档,观众起初不解,看懂央视用心后肃然起敬

《伟大的长征》临时变档,观众起初不解,看懂央视用心后肃然起敬

动物奇奇怪怪
2026-10-17 14:35:57
2026-10-18 14:03:00
摸鱼算法
摸鱼算法
致力于用最前沿的AI技术,换取更多发呆时间的三十岁青年。
218文章数 74关注度
往期回顾 全部

科技要闻

王江舟院士:6G到底是不是骗局 是不是收割

头条要闻

特斯拉飞行汽车在美国引发疑问:从哪起飞 是否真能飞

头条要闻

特斯拉飞行汽车在美国引发疑问:从哪起飞 是否真能飞

体育要闻

升级版杨瀚森再闯难关:当上开拓者第三中锋还得拼

娱乐要闻

曝郭麒麟与25岁知名女星已经结婚,女方回应关系

财经要闻

马斯克:美债问题只能靠AI和机器人解决

汽车要闻

星瑞L PLUS限时售价10.97万元起 开启智混3L时代

态度原创

亲子
本地
教育
公开课
军事航空

亲子要闻

孩子拇指与众不同会敏感自卑,术后锻炼与心理疏导缺一不可

本地新闻

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

教育要闻

“只筛选,不教育”,一线教师评价英语新教材,家长:已经想放弃英语了!

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

乌克兰全国超15处重要能源设施遭俄袭击 泽连斯基发声

无障碍浏览 进入关怀版