最大的 Agent 風險,也在你裝進去的插件
你 review 過一個 Coding Agent plugin,也把它 pin 到特定 SHA。
Plugin4Shell
AIR Security 揭露 · 2026 年 9 月
最大的 Agent 風險不只在模型, 你裝進去的插件也算
Coding Agent 的 plugin、skill 看起來像小功能,實際上更像裝進同事電腦的軟體。
它通常繼承操作者可及的檔案、憑證、內部系統與 production 環境。
AIR Security 的 Plugin4Shell 研究指出,四個主流 Coding Agent 都曾有同一類問題:review 過、也 pin 了 SHA 的插件,仍可能跑到別的程式碼。
以為已經防住
review → pin commit → 安裝
SHA pinning 的承諾是: 你審的是哪版, 跑的就該是哪版
企業審完 plugin,marketplace 把它鎖到某一個 commit。照理說,日後 repo owner 就算改了預設分支,也不該改到已安裝版本。
這正是 SHA pinning 的用途:把「我看過這份程式碼」變成可重複驗證的事實。
Plugin4Shell 繞過的不是 review 流程,而是這個最後一哩的驗證。
少了一個比對
請求 checkout SHA,不等於真的落在那個 SHA
Agent 問 Git 拿 pin, 卻沒有確認 working tree 的 HEAD
AIR 的 PoC 利用 Git ref 的名稱解析,讓 Agent 送出看似正確的 checkout 請求,實際工作目錄卻落到攻擊者控制的內容。
關鍵不是 pin 有沒有寫進設定檔,而是 checkout 後是否斷言:HEAD 必須等於被 pin 的 commit。
沒有這一步,畫面顯示「已依 pin 安裝」,執行的仍可能是另一份程式碼。
為何會是 0-click
不是新裝一個惡意 plugin 才有風險
- 已安裝
- 受害前提是已有一個曾經 review、也受信任的 plugin 在 agent 裡
- 背景更新
- AIR 指出 Claude Code 與 Codex 預設會自動更新已安裝的 plugin
- 0 次
- 不必重新安裝、不必點確認;上游換掉內容後,更新就可能帶入惡意程式碼
為何企業要在意
plugin 不是 browser extension 那麼簡單
它拿到的是 Agent 已經拿到的權限
這類攻擊不一定需要再提權。Agent 用誰的身分做事,plugin 通常就拿到誰可及的資源。
對工程團隊,可能是 repository、SSH key、cloud credential、內網服務或 production shell。
所以它的治理單位不該只是「一個方便的小工具」,而是一條會進入 endpoint 的軟體供應鏈。
範圍與修補
依 AIR Security 截至 2026/09/17 的揭露
- 2.1.179
- Claude Code 已修補。請確認使用版本不低於此版本
- 0.146.0
- OpenAI Codex 已修補。請確認使用版本不低於此版本
- 未修
- GitHub Copilot 尚未有修補;AIR 表示 Microsoft (NASDAQ:MSFT) 尚未發布修補程式
- 不會修
- Gemini CLI 已 deprecated、不會修;AIR 建議遷移 Antigravity
企業現在能做什麼
把 plugin 當軟體供應鏈,不是當 prompt 的附屬品。
先完成 patch,盤點所有 Coding Agent 版本,更新 Claude Code 與 Codex,並為 Copilot、Gemini CLI 的未修狀態建立替代或隔離方案。
接著盤點已安裝 plugin、marketplace 與 Git host;對每次更新驗證實際 commit,並以最小權限、短期憑證與 production approval 降低單一 plugin 的爆炸半徑。
重點不是停止用 Agent,而是讓更新、來源與權限都能被治理。
出處與限制
這件事要讀懂, 也要讀準
這是研究團隊以 PoC 證明的漏洞,不等於已有公開的大規模實際受害案例。Gemini CLI 的 FETCH_HEAD 變體與前述 Git ref 變體不同。
原始研究與完整技術細節
AIR Security〈Plugin4Shell〉· 2026/09/17
受影響的 Agent 與修補狀態
Claude Code、Codex、GitHub Copilot、Gemini CLI;版本與狀態以 AIR 揭露日為準
Git host 的重要差異
SHA-shaped branch 變體僅在 host 接受 40-hex branch name 時成立;GitHub 會拒絕
0-click 的必要條件
已安裝 plugin 加上背景 auto-update;不是每一次新安裝都必然 0-click
Source · air.security/blog-posts/plugin4shell