针钉死了,盘上却不是那一版:我怎么验收 Agent 供应链
大家好,我是珂抖屁。
公开披露里有一件事,把我这几个月对「插件市场 + SHA 钉死」的安全感拆掉了:针看起来钉死了,盘上检出的代码,却可以不是那一版。
披露方叫它 Plugin4Shell。口径很硬——主流 coding agent 的插件安装路径里,市场按 commit SHA 钉住「审过的版本」,客户端去 checkout,却不核对工作树最终 HEAD 是否真等于钉死值。叠上默认自动更新,已装的「可信插件」可以在后台被换成恶意内容。涉及点名的四家:Claude Code、Codex、GitHub Copilot、Gemini CLI。
上一篇我写过给 Skill 上安全闸——那是自己怎么装、怎么限权。这篇换刀口:事故已经摆在桌上,我怎么验收供应链,而不是再转发一遍恐吓帖。
事故结构:钉死失效在客户端,不在市场 PPT
我关心的不是「又一个 RCE 名字」,是结构。
公开技术写清了两条路径,大意是:
•多数客户端:git checkout <40位SHA>。攻击者若控制插件仓库,可建一个同名分支当默认分支;git 在「同名分支 vs 对象 ID」冲突时优先走 ref,工作树落到恶意内容,安装仍报「对上了钉死 SHA」。
•Gemini CLI 一侧写法不同:先 fetch 正确对象,再 checkout FETCH_HEAD;默认分支若叫 FETCH_HEAD,真正落地的仍可能是攻击者内容。
闭合方式在披露里被写成一行诚实检查:checkout 之后用 rev-parse HEAD(或等价)核对落地提交,不等于钉死值就中止。缺的是落地后核对,不是又一份「我们钉了」的声明。
零点击从哪来?公开说法是:Claude Code / Codex 一类对已装插件默认后台更新。市场改钉、上游换心,用户不必再点一次「安装」。你以为自己半年前审过,盘上跑的可能是昨夜的自动升级产物。
补丁进度:我按「以官方公告为准」记
披露时间线(公开博文口径,约 2026 年 5–9 月)大致是:实验室发现 → 协调披露 → Anthropic / OpenAI 一侧给出已修版本号口径;Copilot 一侧公开说法是尚未见厂商补丁;Gemini CLI 一侧公开说法是产品已弃用、不修,建议迁到不受该钉死路径影响的替代产品。
具体版本号、是否覆盖「已在盘上被换过的插件」、各厂 release notes 写不写安全项——以官方公告与发行说明为准。我这里不替任何人背书「你升级完就安全」。
还要注意一层公开争议:GitHub 拒绝 40 位十六进制形分支名,所以「同名分支」在纯 GitHub 默认目录上被部分报道方认为难打出。披露方反驳的是:市场后端不只有 GitHub,Bitbucket / 自建 git 等仍可叫那种分支名,且厂商文档里这些后端并不罕见。对我这种一人公司,翻译成人话是——别把「我只用官方默认市场」当成全球免疫证明;也别把「某宿主禁了某种分支名」当成客户端已经修好。
公开检索里,到发稿前我没看到统一 CVE 编号;叙事多半靠披露名 Plugin4Shell。没有 CVE,不等于没有洞,只等于你更难用传统漏洞库刷安全感。
我怎么验收:五步,验收的是「落地」,不是「故事」

验收单元:盘上 HEAD == 钉死 SHA
事故验收和日常装 Skill 的闸门不完全一样。闸门问「要不要装」;验收问「盘上跑的,是不是你以为钉死的那一版」。
1. 先列已装插件 / 技能清单 哪些来自市场、钉的是哪条 SHA、上次自动更新是什么时候。清单都没有,后面的核对无从谈起。
2. 抽检:对关键插件做落地核对 进插件目录(或等价缓存),看 git rev-parse HEAD(或厂商提供的校验命令)是否等于市场钉死值。不一致——先当事故,再查是不是合法升级。公开修复建议的核心也是这一行;我验收时就验这一行,不验宣传页。
3. 自动更新改成「可观测」 关得掉就关;关不掉至少要:升级日志可见、升级后 diff 可看、异常版本能回滚。零点击叙事里最刺的是「你不在场时它自己换」。验收自动更新,比验收「我当初点过同意」更重要。
4. 分客户端记账,不混成一句「四家都中招所以我躺平」 已有补丁口径的,升级并复核落地 HEAD。公开称未修或不修的,缩小插件面、迁替代入口、或把高权限活挪出该客户端。一人公司没安全团队,但有「这台机器还跑不跑生产密钥」的选择权。
5. 把「供应链事故」写进复盘模板 下次再看到「SHA 钉死 / 市场审核 / 官方推荐」,第一反应不是转发,是问:checkout 之后谁核对?核对失败谁报警?已装实例谁扫一遍?
这五步里,没有「装一个扫描器就结束」。扫描器挡明文危险模式;挡不住「钉死看起来对、工作树已经被换」——那是 Plugin4Shell 这类洞专门打的脸。
和「给 Skill 加限制」差在哪
加限制,是你主动收紧权限、沙箱、来源白名单。 供应链验收,是假设你已经按正确流程做过事——审过、钉过、装过——系统仍可能把另一坨代码交到你手上。
一个是门禁,一个是事故后的对账。门禁要继续做;对账不能省。公开讨论里更早还有技能故事、劫持一类铺垫:先证明装进去不难,再证明钉死不可靠。Plugin4Shell 是这条链上的硬伤披露。你不需要接受披露方每一个受害规模数字,也能接受结构结论:分发层比模型层更先成为战场;验收单元是「落地提交」,不是「市场说钉了」。
我自己的判断
我会继续用 coding agent,也会继续装少数真有用的插件。但我改默认假设:
钉死若无落地核对,只是心理安慰。 供应链安全从来不缺 PPT,缺的是 checkout 之后那一行诚实。
一人公司能做的验收很土:清单、抽检 HEAD、控更新、分客户端处置、复盘模板留一栏「对账没有」。土,但比等下一次零点击新闻再吓一跳便宜。
下一波若再爆,我赌大概率还是「某个信任边界少验了一步」,而不是「某个模型突然变笨」。验收供应链,就是把那少的一步补回自己的习惯里。