夜雨聆风学习资料网

ARTICLE · 1110832

你给 Claude Code 装的插件,可能正在被“偷梁换柱”

你给 Claude Code 装的插件,可能正在被“偷梁换柱”

"

版本锁还在,墙已经没了——零点击,四大工具同时中招

—— 赛博单兵

上周我写 Claude Code 删掉 4.8 万个文件的时候说,那是 AI 手滑,防线可以配。这周要说的这件事不一样——不是手滑,是有人故意伸手,而且伸的正是你配置最规范的那个环节。

9 月 17 日,安全团队 Air Security 公开了一个漏洞,名字起得很直白:Plugin4Shell。

报告点名的是市面上最主流的四款 AI 编程工具:Claude Code、OpenAI Codex、GitHub Copilot、Gemini CLI——同一个设计错误,四家全犯。

中文互联网上关于这个漏洞的深度拆解,我搜了一圈(google 中文关键词 + 微信搜一搜)一篇都没看到。所以这篇把它讲透:漏洞怎么运作、为什么四大厂商犯的是同一个错、以及你今天能用三步自查有没有暴露。

📌 本文看点

01

版本锁怎么被一个 git 花招绕过

02

五步攻击链全拆解

03

三步自查清单

01

WHAT HAPPENED

先说人话:这个漏洞偷的是什么

要理解这个漏洞,得先知道 AI 编程工具的插件是怎么装到你电脑上的。

现在的 Claude Code、Codex 都有自己的插件市场——类似手机的应用商店。你装一个插件,市场会做一个安全动作:把这个插件当时的代码状态「锁」下来,精确到那一版。

以后不管插件作者怎么改代码,你装的永远是锁定的那个版本。这个机制叫版本锁(SHA pinning),是整个插件安全体系的承重墙。

它的存在是为了防一种情况:插件一开始是好人写的,后来作者跑路了、账号被盗了、或者作者自己变坏了,往代码里塞恶意程序。有了版本锁,锁住的那一版永远不变,新代码进不来。

Plugin4Shell 干的事情,就是让这堵承重墙看起来还在,实际上已经不在了。

打个比方。你担心家里钥匙被人偷配,就把唯一的一份锁进了保险柜,地址记得清清楚楚。小偷的做法不是撬保险柜——他把整条街上同样门牌号的房子都换成了自己家的门。你按地址走过去,用钥匙开门,门也开了,屋里也「对」——但那是小偷布置的屋子。

技术上这是一条 git 的冷知识:git 允许建一个「分支」,名字正好长成版本锁那串指纹的样子。而 git 在「分支名」和「版本指纹」撞名时,优先按分支名走。安全检查全程显示绿色,因为那串字符确实对得上——只是它指向的东西已经被人换了。

02

ATTACK CHAIN

案发经过:五步把恶意代码送进你的电脑

Air Security 在报告里把完整攻击链拆成了五步。我按顺序讲,你可以对照着看每一步为什么防不住。

第一步,种树。攻击者往一个正规插件市场提交一个真正干净的插件——功能正常、代码无害,顺利通过审查。这一步有多容易?研究者自己实测过——结果放在后面说。

第二步,等你上钩。各地用户正常安装这个插件。每一次安装都被版本锁锁在当时审查过的那一版上,看起来一切合规。

第三步,正常更新。攻击者发布一个例行更新,修修 bug、加加功能——依然干净。市场把版本锁推进到新的指纹。这一步的妙处在于:更新越勤快的插件越受欢迎,攻击者做的完全是好插件作者该做的事。

第四步,偷梁换柱。攻击者在自己控制的代码仓库里,建一个名字长得跟新版本指纹一模一样的「分支」,设为仓库默认。原版代码一个字都不用动。

第五步,自动上门。这是整个攻击最阴的地方:Claude Code 和 Codex 的插件后台自动更新是默认开启的。

版本锁一变,所有装过这个插件的机器在后台静默拉取新代码——拉到的是攻击者的分支。没有弹窗,没有确认,没有任何需要你点的东西。

研究者管它叫「零点击」——不需要用户任何手动确认的自动更新,就是攻击的传送带。

这不是孤例。同一批研究者有个三部曲:前作《The Story of Skills》里他们亲手上传了一个恶意 skill,看着它在市场里病毒式传播,触达超过 26000 个 agent;

姊妹攻击 SkillJacking 更狠,不种新插件,直接劫持已经在用的——925 个在用 skill 被连锅端,波及 13.4 万个 agent(数字均出自 Air Security 系列报告)。

三次攻击叠加说明一件事:插件作者的仓库本身,就是整条供应链最脆的一环。

时间线也值得看一眼。漏洞 5 月被发现,6 月按行业惯例先私下通报四家厂商,9 月中旬公开。

四家的反应拉开了差距:Anthropic 在 6 月 17 日就修复了(Claude Code 2.1.179);OpenAI 8 月修好(Codex 0.146.0);微软的 Copilot 截至我动笔(9 月 30 日)还没发补丁;

Google 更干脆——Gemini CLI 已经弃用,官方表态不修了,建议用户迁移到新的 Antigravity。

03

MY CHECK

我查了自己的机器

看完报告我第一件事就是查自己。结果如下。

我的 Claude Code 是 2.1.233,修复版本是 2.1.179——过了线。Codex 是 0.146.0,恰好就是修复版。本机装的插件来自 Anthropic 官方市场,插件源在 GitHub 上。

这里有个值得单独说一嘴的细节:这次的攻击手法在 GitHub 上行不通——GitHub 明确拒绝创建长得像版本指纹那样的分支名(报告原文背书;Bitbucket 和自建 git 允许),天然免疫。

会中招的是 Bitbucket 和自建 git 服务器这类允许这种命名的平台,而它们恰恰都是官方文档里列出的合法插件源。也就是说,「我从正规市场装的」不等于「我是安全的」——得看你那个插件背后挂在哪个 git 平台上。

还要说一个反直觉的结论:这个漏洞惩罚的恰恰是守规矩的人。随便乱装插件的人,本来就没指望安全体系保护他;反而是那些认真做审查、认真做版本锁管理的团队,把安全感建立在这堵墙上——而墙本身裂了。

「审查通过了、锁也写了,装进来的却是另一份代码——所有建立在版本锁之上的下游安全流程,继承的都是这个失败。」

∞

THE END

三步自查清单

拿走就能用,全程不超过十分钟。

第一步,查版本。Claude Code 跑 claude --version,2.1.179 以上安全;Codex 跑 codex --version,0.146.0 以上安全;

用 GitHub Copilot 的,目前没有补丁,盯着微软的更新公告;还在用 Gemini CLI 的,别等补丁了——官方已经弃用且不修,迁到 Antigravity 是唯一解。

第二步,查你装的插件挂在哪。打开插件市场看源仓库地址。域名是 github.com 的,这次这条攻击路径对它无效;

是 bitbucket.org 或者公司自建 git 的,把它当成暴露面来对待——尤其自建的,git 默认行为允许那类分支名,你中招的姿势和报告里一模一样。

第三步,掂量自动更新这把双刃剑。后台自动更新平时是好东西,这次是攻击的传送带。

我的做法不是一关了之——而是认知上把它当成「我的 agent 会定期接收并执行远端代码」这个事实来管理:能锁版本的锁版本,插件来源尽量收敛到 GitHub,重要的机器上插件清单定期过一眼。

最后说说这事对一人企业的分量。你的 AI 编程 agent 手里有你的全部代码、你的 API key、你的服务器凭据。插件被换,等于这些钥匙打包送人。

上一次 4.8 万个文件被删,好歹删的是你自己的;这一次,是别人往你的机器里放东西。手滑可以配防线,故意伸手的那只,只能靠你自己在门口拦。

评论区报一下你的工具和版本号,我帮你判断有没有暴露——尤其是拿这些工具接客户项目的机器。

END

我是赛博单兵,用 AI 编程 + 出海,帮普通人从手艺人变成设计生意的人。

如果你觉得今天这篇有收获,欢迎点赞、在看、转发三连,我们下篇见。

相关学习资料