承諾鎖定卻沒鎖定:Plugin4Shell 零點擊擊穿 AI 編碼代理供應鏈
資安公司 Air 公開 Plugin4Shell:一個能在 Claude Code、Codex、Copilot 與 Gemini CLI 中默默把 SHA 鎖定插件換成惡意版本的零點擊 RCE。Anthropic 與 OpenAI 六月已修補;Microsoft 與 Google 則沒有。本文解析這個 git ref 歧義攻擊的原理、誰暴露在風險中、以及本週該做什麼。
2026 年 9 月 17 日,一家名為 Air(air.security)的資安新創發表了他們從五月起就握在手裡的研究:一條完整可運作、零點擊遠端程式碼執行(RCE)攻擊鏈——命名為 Plugin4Shell——一次打穿目前部署最廣的四款 AI 編碼代理:Anthropic 的 Claude Code、OpenAI 的 Codex、GitHub Copilot,以及 Google 的 Gemini CLI。這是 AI 代理生態系第一個真正意義上的原生供應鏈漏洞:不是模型的缺陷、不是提示注入,而是底下分發層的破口——那些讓外掛程式送達數百萬台開發者機器的市集(marketplace)。
簡短版令人不安。業界抵禦插件被竄改的標準作法是 SHA pinning(SHA 鎖定):審查某個 commit 上的程式碼、把那個確切的 commit hash 鎖定下來,然後相信被鎖定的快照從此就是實際執行的東西。Plugin4Shell 讓代理去 checkout 被鎖定的 commit,卻從不 驗證 工作目錄裡實際落地的就是那個 commit。少了一行斷言(assertion)——而每一家一線實驗室都這樣出貨了。
究竟是什麼壞了
每一款受影響的代理安裝市集插件的方式,都是複製插件的 git 儲存庫、然後 checkout 市集鎖定的 hash:
git clone <plugin repo> ./
git checkout aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
訣竅在這裡。git 自己的 git check-ref-format 完全接受一個由 40 個十六進位字元組成的分支名稱——正是 commit SHA 的形狀——而部分程式碼託管服務也允許,最明顯的是 Bitbucket 與自架 git 伺服器。於是,控制插件上游儲存庫的攻擊者可以:
- 植入 — 發布一個真正無害的插件,鎖定在 commit
aaa…aaa。它通過審查。 - 擴散 — 數千個代理安裝它,每一個都鎖定在
aaa…aaa。 - 版本推進 — 發布一次例行、依然無害的更新;市集重新鎖定到新 commit
bbb…bbb。 - 抽地毯 — 建立一個名為
bbb…bbb的分支、把它設成儲存庫的預設分支、並指向惡意程式碼。原本被鎖定的 commit 可以原封不動。 - 自動更新觸發 RCE — 鎖定值的變動觸發所有代理的背景自動更新。因為 git 在同名情況下優先解析 ref 而非物件 ID(只印一句
refname is ambiguous警告),checkout 靜默落在攻擊者的分支上。沒有提示、沒有點擊。
最後一步正是它成為零點擊的原因:Claude Code 與 Codex 的插件自動更新預設開啟,所以置換會觸及早已安裝並信任該插件的機器。攻擊者不需要說服任何人安裝新東西——只需要那個無害插件已經在那裡。
Gemini CLI 的變體更難看。它用 git clone --depth 1 複製、git fetch origin <sha>、再 git checkout FETCH_HEAD。但 git checkout FETCH_HEAD 會去讀名為 FETCH_HEAD 的分支(若存在且為預設分支)——被 fetch 下來的 commit 靜默遭到丟棄。而且 GitHub 禁止 hash 形狀分支名的規則,並未明確擋住 FETCH_HEAD 這個名字,所以從 GitHub 安裝在此未必能自救。
一個漏洞、四家廠商、三種答案
Air 在 2026 年 5 月發現漏洞、對四款代理都建出可用的概念驗證,並於六月依協調揭露程序通報各家。回應矩陣本身就是新聞:
| 代理 | 廠商 | 狀態 |
|---|---|---|
| Claude Code | Anthropic | 已修補於 2.1.179(2026-06-17 確認) |
| Codex | OpenAI | 已修補於 0.146.0(2026-08-12 驗證) |
| GitHub Copilot | Microsoft | 截至揭露時未修補 |
| Gemini CLI | 不會修——CLI 已棄用;用戶被建議遷移到 Antigravity |
The Register 引述 OpenAI 自己的公開修補說明描述了同一個底層問題:git「可能把請求的 commit SHA 解讀為分支名」,使插件來源「具現出與鎖定不同的 commit」。The Hacker News 在本地獨立重現了這個 git 行為,並指出截至 9 月 18 日沒有 CVE 編號、四家廠商也沒人發布資安通告。Anthropic 的 2.1.179 版本說明甚至沒提到這個修補——「已修好」的說法來自 Air。
好奇的話,修法一行就夠,每個代理第一天就該出貨這行斷言:
test "$(git rev-parse HEAD)" = "<pinned-sha>" || abort
它必須檢查解析後的 HEAD——不是被請求的 ref——而且必須在代理內部執行,因為鎖定是在客戶端解析的。沒有任何市集能強制執行它對外宣稱的保證。這個不對稱才是真正的發現:市集可以透過只允許拒絕 SHA 形狀名稱的託管服務(實際上等於 GitHub 限定)來鈍化分支名變體,但這會禁掉代理官方支援的主機——Anthropic 自己的文件就列 Bitbucket 與自架 git 為有效市集後端——而且對 Gemini CLI 的變體毫無作用。
誰真正暴露在風險中
Air 先前研究的數字讓爆炸半徑有了輪廓。在《The Story of Skills》中,團隊植入了一個通過資安掃描器的惡意 skill,觸及約 26,000 個代理。在《SkillJacking》中,他們顯示已有 925 個使用中的 skill 被從維護者手中劫走,影響 134,000 個代理——手法只是接管背後的儲存庫。Plugin4Shell 正是把這類接管轉化為靜默程式碼執行的機制——整條攻擊鏈已端到端被證實。
暴露面不限於亂裝插件的人。那些把每件事都做對的組織——審查插件、鎖定到已審查的 commit、信任市集——照樣繼承這個失敗,因為壞掉的正是鎖定本身。被置換的插件以使用者的完整權限執行:檔案、已存憑證、以及所有他們登得進的系統。
The Hacker News 在 9 月 18 日檢查預設市集後補了有用的細節:Anthropic 社群目錄、以及 Claude Code 與 Copilot 的預設目錄中,每個插件都指向 GitHub 儲存庫——而 GitHub 拒絕 hash 形狀的分支與標籤名稱。同時,自動更新只在代理內建、GitHub 托管的市集預設開啟。所以只從預設 GitHub 目錄安裝的開發者,大致不受分支名變體影響。風險集中在非預設市集與非 GitHub 主機——Bitbucket、自架 git——而這些是受支援的正式組態,不是邊緣案例。
為什麼這件事超出補丁佇列的層次
三件事讓 Plugin4Shell 不只是四個產品團隊的倒楣一週。
這是等級錯誤,不是實作失誤。 同一個缺失的驗證,靜靜躺在四家競爭實驗室各自打造的代理裡。這是年輕的代理生態系繼承 git 語義卻未完整稽核的設計模式失敗。此後任何打造插件系統的代理框架,都應把「驗證 checkout 等於鎖定值」視為基本功——每一場資安審查都該指名檢查這一項。
修補模型本身壞了。 沒有 CVE、沒有廠商通告、六月就默默修好卻壓到九月才揭露、四家中兩家選擇不修。學會靠 CVE feed 分流風險的企業,這次什麼都沒得分流。如果代理供應鏈漏洞未來都這樣揭露,防禦者需要新工具——廠商也該明白「我們棄用了」不是修補。
它恰好落在代理變得危險的時刻。 2026 是企業全面擁抱編碼代理的一年,正如 Air 自己出櫃宣言所說。代理如今持有憑證、寫生產程式碼、在具備廣泛檔案權限的開發者筆電上執行。一個能把「控制一個上游儲存庫」轉成「在每台信任它的機器上執行任意程式碼」的供應鏈原語,等於代理界的 npm/PyPI 套件劫持時代——只不過這次的套件會自己安裝自己。
本週該做的事
- Claude Code:升級到 2.1.179 或更新版。注意 Anthropic 的版本說明沒有特別標註此修補,別等橫幅提示——直接更新。
- Codex:升級到 0.146.0 或更新版。
- Copilot:沒有修補存在。若你的團隊會從非 GitHub 主機安裝插件,在 Microsoft 出修補前把那些插件視為不可信任——或停用第三方插件來源。
- Gemini CLI:假設它永遠不會被修。遷移到 Antigravity——這個攻擊觸不到它,因為它沒有市集插件 SHA 鎖定可以繞過。
- 所有人:盤點你的代理實際從哪些市集與 git 主機拉插件。GitHub 限定的預設目錄是安全區;其他一切都是暴露面。
- 代理框架開發者:把那行斷言補上。checkout 之後,解析工作目錄中實際的 commit,不等於鎖定值就中止。一行關閉兩個變體。
最讓人不安的結論是:「鎖定」是一個沒有任何代理真正兌現過的承諾。Plugin4Shell 沒有弄壞那個鎖——它揭露了那個鎖從來就不存在。修補很簡單;信任的重建不會。
Sources
- [1] https://www.air.security/blog-posts/plugin4shell
- [2] https://thehackernews.com/2026/09/plugin4shell-lets-repository-owners.html
- [3] https://www.theregister.com/security/2026/09/17/ai-coding-agents-0-click-rce-flaw-could-hand-attackers-keys-to-the-kingdom/5297335
- [4] https://www.helpnetsecurity.com/2026/09/18/plugin4shell-ai-coding-agents-vulnerability/
- [5] https://cybersecuritynews.com/plugin4shell-zero-click-rce/
- [6] https://www.infoworld.com/article/4223907/a-zero-click-rce-flaw-in-ai-coding-agents-could-have-exposed-enterprise-systems.html