<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SHA Pinning on Codexer</title><link>https://codexer.com/tags/sha-pinning/</link><description>Recent content in SHA Pinning on Codexer</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 30 Sep 2026 07:40:00 +0800</lastBuildDate><atom:link href="https://codexer.com/tags/sha-pinning/index.xml" rel="self" type="application/rss+xml"/><item><title>你锁定了插件的 commit，它却还是被换掉了：Plugin4Shell 零点击攻击拆解</title><link>https://codexer.com/posts/2026-09-30-plugin4shell-codex-sha-pinning-bypass/</link><pubDate>Wed, 30 Sep 2026 07:40:00 +0800</pubDate><guid>https://codexer.com/posts/2026-09-30-plugin4shell-codex-sha-pinning-bypass/</guid><description>&lt;h2 id="一个不需要你动手的替换"&gt;一个不需要你动手的替换&lt;/h2&gt;
&lt;p&gt;设想一个很守规矩的开发者。&lt;/p&gt;
&lt;p&gt;他没有装来路不明的插件，只从官方市场里挑经过审核的那几个；他也没有关闭版本锁定，插件被钉在一个具体 commit 上，这是市场给出的安全承诺。安装那天他看过 diff，没有可疑的网络请求，没有读 &lt;code&gt;~/.ssh&lt;/code&gt; 的代码，一切正常。&lt;/p&gt;
&lt;p&gt;然后某一天，那台机器上运行的代码已经不是他审核过的那一份了。&lt;/p&gt;
&lt;p&gt;他没有点过任何链接，没有确认过任何弹窗，也没有重新安装任何东西。恶意代码是在后台自己进来的。&lt;/p&gt;
&lt;p&gt;2026 年 9 月中旬，安全公司 Air Security 公开披露了这个漏洞，取名 Plugin4Shell，沿用 Log4Shell 那套命名习惯。受影响的不是一个工具，而是四个主流的命令行编码 Agent：Anthropic 的 Claude Code、OpenAI 的 Codex、微软的 GitHub Copilot，以及谷歌的 Gemini CLI。披露时还没有分配 CVE 编号。&lt;/p&gt;
&lt;p&gt;这条消息最让人不舒服的地方不在于漏洞本身有多精巧，而在于它精准打击的是最有安全意识的用户：那些老老实实只用审核过的插件、老老实实让版本锁定生效的人。他们的防线之所以失效，是因为这把锁从一开始就没有真正锁在任何东西上。&lt;/p&gt;
&lt;h2 id="插件的-sha-锁承诺的到底是什么"&gt;插件的 SHA 锁，承诺的到底是什么&lt;/h2&gt;
&lt;p&gt;要理解这次的失效，得先看清版本锁定的设计意图。&lt;/p&gt;
&lt;p&gt;一个插件市场存在的前提是：市场上架的东西和人实际跑的东西是同一份代码。为了维持这个前提，市场会让每个插件钉在一个 commit hash 上，那串 40 位的十六进制字符代表代码库在某一刻的精确快照。它是不可变的，你审核的时候看的是它，别人后来往仓库里推新提交也改不动它。&lt;/p&gt;
&lt;p&gt;这串 hash 承担两个功能。往未来看，它是自动更新的起点，Agent 只从这个锚点往后取新版本。往过去看，它是回滚的坐标，出问题了可以退回到那个确认过的时间点。&lt;/p&gt;
&lt;p&gt;听起来很稳。但这次披露揭开的正是：这个承诺在客户端的实现里缺了最后一环。&lt;/p&gt;
&lt;p&gt;Air Security 的说法很直白：Agent 会签出市场钉住的那个 commit，但从不验证它是否真的落在了那里。攻击者一旦控制插件仓库，就能让这次签出解析到恶意代码，而 pin 从表面看依然完好无损。&lt;/p&gt;
&lt;p&gt;一句话总结就是，请求发对了，结果是错的，中间没有一句断言。&lt;/p&gt;
&lt;h2 id="一个-git-的歧义吃掉了整把锁"&gt;一个 git 的歧义，吃掉了整把锁&lt;/h2&gt;
&lt;p&gt;漏洞的根子在 git 自己的引用解析规则上。&lt;/p&gt;
&lt;p&gt;git 的 ref（分支、标签）和 object id（commit hash）本来是两个不同的命名空间。但当同一个名字既是合法的 ref、又是合法的 object id 时，git 在解析时会优先把 ref 拿出来用，只在日志里留一句 &lt;code&gt;refname is ambiguous&lt;/code&gt; 的警告。对机器来说这是提示，对人类来说这是一个隐藏了很久的地雷。&lt;/p&gt;</description></item></channel></rss>