AIDEFEND in Action AIA-0102 實證研究 發布於 AIA: 2026年10月23日

Plugin4Shell:Git 參照遮蔽,讓外掛程式繞過已審查的版本固定

Air Security 團隊示範,AI 輔助程式設計客戶端在安裝外掛時,可能載入與官方市集已審查提交(commit)完全不同的程式碼。若攻擊者取得受信任外掛上游儲存庫的控制權,即可建立與已固定 SHA 同名的預設分支,或在 Gemini CLI 環境中建立名為 FETCH_HEAD 的預設分支以遮蔽預期結果。後續的背景更新將在無須使用者再次點擊確認的情況下載入惡意程式碼。此安全缺陷出在客戶端未檢驗實際 checkout 至工作目錄的 commit 雜湊值,而非市集完全缺乏審查;攻擊者控制上游儲存庫以及符合條件的客戶端與託管平台,皆為本攻擊路徑的必要前提。

Supply Chain CompromiseClient SecurityAI Coding Agent
7 項對應的 AIDEFEND 防禦手法

威脅分析

  • 僅要求版本固定卻未校驗實際工作目錄的 Commit: AI 輔助程式設計客戶端雖依市集審查結果指定了特定 Git commit SHA,但在執行 checkout 後,完全未驗證工作目錄中的實際 commit 雜湊值是否相符,導致上游儲存庫管理者能在背景更新時偷換未經審查的程式碼。
  • 40 位十六進位同名預設分支造成參照遮蔽: 在針對 Claude Code、Codex 與 GitHub Copilot 的測試中,攻擊者將儲存庫預設分支命名為與核准 SHA 相同的 40 位十六進位字串。在相容的 Git 託管平台上,clone 會建立同名本機分支,使後續 checkout 優先解析為該分支,載入位於分支頂端的惡意程式碼。
  • Gemini CLI 遭 FETCH_HEAD 預設分支遮蔽: Gemini CLI 採用了先抓取固定物件再執行 checkout FETCH_HEAD 的特殊載入流程。攻擊者若將預設分支命名為 FETCH_HEAD,便能在 Git 參照解析時優先勝出,同樣達成未經核准的程式碼替換。
  • 修補狀況與攻擊成立前提: Anthropic 已於 Claude Code 2.1.179 修補此問題(CVE-2026-86063),OpenAI 亦於 0.146.0 版加入 SHA 校驗機制。本攻擊必須建立在攻擊者已掌控上游外掛儲存庫且使用者已預先安裝該外掛的前提下;此外,GitHub 平台本身禁止建立 40 位十六進位分支,已能自主阻斷該特定變體。

適用的 7 項 AIDEFEND 防禦手法

AID-H-003.010
Deployed AI Software Vulnerability Remediation Lifecycle
極高
全面盤點實際執行中的客戶端執行檔與外掛載入器版本;受影響的 Claude Code 應升級至 2.1.179 或更新版本,Codex 則應升級至包含 0.146.0 修補的受支援版本,隨後驗證執行檔雜湊並進行受控的 SHA 遮蔽反向拒絕測試。Claude Code 的資安通告適用於低於 2.1.179 的版本,不得將相同的 CVE 或版本邊界逕行套用至其他客戶端。在尚未獲得已驗證修補版本前,應透過集中管理政策直接停用該外掛及其更新管道,絕不能單憑市集審查標章便予以放行。
AID-H-030.005
Admission Decision Orchestration & Triggered Revalidation
高
外掛應該一律經由企業自己的安裝中介服務來安裝,由它提供經審查、位元組完全確定的外掛內容。中介服務對每個外掛版本保存一份綁定雜湊值的核准決定,把那份快照裝進客戶端的外掛目錄,再回傳一張安裝紀錄,客戶端讀回安裝後的雜湊值核對;客戶端自己完全不去 clone 發布者的儲存庫,所以上游那個與 SHA 同名的預設分支,或名為 FETCH_HEAD 的分支,就沒有東西可以遮蔽。市集每一次重新固定版本,也要當成重新審查的觸發條件,而不是例行更新:只要固定的 SHA、發布者狀態或儲存庫預設分支任一項改變,就讓先前的核准失效、先暫停該外掛的背景更新,並針對新解析到的 commit 與它實際的檔案樹重新跑一次審查,確認通過後才讓任何客戶端收到更新。前提是把客戶端指向這個中介服務或由它供應內容的內部市集;沒有走這條路安裝的外掛不在保護範圍內。
AID-I-001.002
MicroVM & Low-Level Sandboxing
高
將客戶端、外掛程式及所有 hook 子程序完整納入經嚴格驗證的受管虛擬機(MicroVM)或作業系統原生沙箱中,隔離並排除開發者家目錄內的 secrets、主機 agent 通訊通訊端(socket)以及未受限的正式環境目錄掛載。此防護能有效侷限惡意替換程式碼啟用後所能存取的主機資源。若沙箱僅包覆模型工具呼叫層,將完全遺漏外掛載入器直接執行的程式碼;必須確保外掛載入器與背景更新程序均在同一外層沙箱邊界內運作。
AID-H-028.006
Client Distribution, Plugin & Update Integrity Verification
中
在外掛匯入或任何 hook 程式碼執行前,完整盤點客戶端載入器可能讀取的外掛清單,將確切套件內容複製至受保護且不可變的預備暫存區,並依據獨立簽署的允許清單嚴格校驗發布者身分、版本與內容雜湊值,隨後僅載入該份通過驗證的位元組內容。單純檢查請求的 Git ref、指令執行成功回傳碼或由外掛自行回報的清單均不足以確認安全。此指引要求各主機環境具備專屬的啟用前檢查介面;在所有載入管道(包含 Gemini CLI 特殊的 checkout 路徑)均完成驗證前,需由受控客戶端或軟體供應商協同整合落實。
AID-D-004.001
Static Artifact Integrity Re-verification & Drift Monitoring
中
外掛目錄裡實際放的東西,要拿來和核准的固定版本重新比對。由一支用獨立唯讀身分執行的檔案完整性檢查工作,把每個已安裝外掛的 HEAD commit 與檔案樹雜湊值,對照市集核准的 SHA 和事先存好的檔案清單,只要不一致就產生發現,包括「要求的 ref 和實際解析到的 HEAD 不同」,以及 checkout FETCH_HEAD 卻解析到攻擊者命名分支這兩種情況;每次更新後、客戶端下次啟動前都跑一次。兩種變體被偷換的 checkout 它都抓得到,不過這是檔案寫入磁碟之後的偵測,能不能趕在啟用之前,取決於更新到下次啟動之間有多少時間,所以它是載入器檢查的輔助,不是替代。
AID-I-001.004
Sandbox Network Egress Restrictions
中
萬一被偷換的外掛程式碼真的跑起來,至少要限制它連得到哪裡。在裝著客戶端、更新程式與 hook 的沙箱外層,對外連線預設全部阻擋,只放行市集、模型端點和任務需要的儲存庫,並從沙箱內實測原始 IP、重新導向、Proxy 與 DNS 是否真的被擋。這能阻斷啟用後的回連與大量資料外傳;但擋不住本機破壞,也擋不住它讀取沙箱仍暴露出來的東西,而且研究並沒有示範特定的外洩目的位址,所以這一步的效果是圍堵,不是已驗證的阻斷。
AID-E-003.003
Confirmed Malicious Code & Persistence Eviction
中
一旦確認某個外掛被分支遮蔽偷換,就要把它從所有能載入的地方清掉,不能只清發現問題的那一台。先列出每一台裝過受影響外掛或版本的客戶端,保留被偷換的檔案內容供鑑識,再移除外掛目錄與快取的 clone,並在安裝中介服務或市集把惡意的 commit 與檔案樹雜湊值列入拒絕名單,讓任何更新程式都拉不回來,最後依雜湊值確認沒有任何執行中的客戶端還留著它;重新安裝時只能用已審查的快照。這是事後應變,而且要靠前面幾項控制建立的盤點資料才做得到。

身為資安防禦者,我們應該這麼做

  • 全面清查組織內部實際使用的客戶端執行檔、外掛載入器、市集來源與背景更新程序。將受影響的 Claude Code 與 Codex 立即升級至官方支援的修補版本,核對實際執行中的版本雜湊,並在隔離儲存庫中實測驗證 SHA 同名預設分支與產品特定的 FETCH_HEAD 遮蔽情境。
  • 在載入器的修補程式完成完整驗證前,應透過集中管理政策直接停用受影響的外掛安裝與背景更新管道。限制僅使用拒絕 SHA 同名分支的 Git 託管平台雖能降低部分風險,但完全無法抵禦 FETCH_HEAD 遮蔽變體。
  • 針對企業可控的受控客戶端,應於外掛匯入或任何 hook 執行前,嚴格比對解析後的 HEAD commit 與獨立核准的套件雜湊值。確保暫存與實際載入的是同一份不可變位元組內容,涵蓋所有搜尋路徑;若清單不完整或允許清單過期,應直接拒絕載入。
  • 不要再讓客戶端自己去 clone 發布者的儲存庫:改由企業安裝中介服務或內部市集提供經審查、綁定雜湊值的外掛快照,而且市集每次重新固定版本或預設分支一有變動,都先重新審查,確認通過後才讓更新送出。
  • 透過 MDM 派送的受管客戶端設定,把外掛市集限制在組織核准、且託管平台會拒絕 SHA 型分支名稱的來源,並關閉外掛的背景自動更新,讓新的版本固定只有在留下紀錄的安裝動作後才生效。
  • 將客戶端、背景更新程式與外掛執行的 hook 全數置於經嚴格驗證的外層沙箱中,隔離排除開發者機敏憑證(secrets)與正式環境存取權限,且沙箱的防禦邊界必須建立在外掛本身的設定檔之外。
  • 每次更新後,用唯讀身分把已安裝外掛目錄和核准的 SHA 與檔案清單比對一次。一旦確認被偷換,先保留檔案內容供鑑識,再從所有受影響客戶端移除該外掛與快取的 clone,在中介服務把惡意雜湊值列入拒絕名單,最後只從已審查的快照重新安裝。

結論

AIDEFEND  把 Plugin4Shell 對應到幾條具體防線:經實證的客戶端修補、由安裝中介服務把關並在每次重新固定版本時重新審查的外掛安裝流程、管住市集來源與自動更新的受管客戶端政策、啟用前的完整性檢查、外掛執行的隔離與對外連線限制,以及確認被偷換後從所有受影響端點清除。本案的核心啟示在於:授權必須精確作用於即將執行的真實程式碼。市集審查並固定的 SHA,只有在客戶端確實校驗工作目錄的 checkout 結果與載入的位元組一致時,才能發揮實質防護效益。

最後更新: