AIDEFEND in Action AIA-0027 實際事件 發布於 AIA: 2026年6月1日

TrapDoor:竊取憑證的供應鏈攻擊鎖定 AI 助手指令檔

Socket 將 npm、PyPI 與 Crates.io 上超過 34 個惡意套件、384 個以上相關版本與成品,連結到 TrapDoor 竊取憑證的攻擊活動。除了會執行的套件惡意程式,攻擊者也在 .cursorrules 與 CLAUDE.md 植入 AI 指令,並透過看似文件更新的 pull request 嘗試送進專案。來源記錄的是誘導 AI 助手執行假安全掃描的企圖,沒有證明每個 PR 都已合併,或只要複製儲存庫就會成功竊取資料。

Indirect Prompt InjectionConfiguration PoisoningConfiguration ReviewAI Supply ChainAI Coding Agent
9 項對應的 AIDEFEND 防禦手法

威脅分析

  • 兩條入侵路徑,其中一條比較特別。 TrapDoor 一方面走傳統惡意套件路線,另一方面把 AI 程式助手會讀的設定檔(.cursorrules、CLAUDE.md)變成藏指令的地方,讓助手可能被引導去讀取並外傳資料。
  • AI 指令檔路徑是已觀測到的投遞企圖。 與攻擊活動相關的檔案與 PR,要求助手遵循遠端指引或執行偽裝的安全掃描;隱藏 Unicode 字元與看似正常的文件標題,可能掩飾其中指令。是否造成影響,仍取決於檔案是否進入儲存庫、助手是否讀取並遵循,以及執行權限是否允許存取秘密與對外傳送。Socket 明確提醒,這種方式不一定適用於所有工具或模型。
  • 套件這條路,在安裝、import 和編譯時就會執行。 在 npm 上,postinstall hook(套件裝好後自動跑的腳本)會自動執行 1,149 行的 trap-core.js。在 PyPI 上,套件在被 import 時就執行,從攻擊者的 GitHub Pages 網域抓 JavaScript 下來,再用 node -e 跑。在 Crates.io 上,build.rs 會在編譯期間執行,用一把寫死的 XOR 金鑰把本機的錢包金鑰庫加密,再外傳到 GitHub Gist。
  • 偷走哪些東西,以及攻擊者怎麼篩選。 目標包括 SSH key、AWS 憑證、GitHub token、瀏覽器登入資料庫、環境變數、API key,以及 Solana、Sui、Aptos 的錢包金鑰庫。惡意程式還會用真實 API 呼叫去驗證偷到的 AWS 和 GitHub 憑證,讓攻擊者能分辨哪些還能用、哪些已經失效。
  • 它會留後路,也會擴散。 trap-core.js 會透過 .cursorrules、CLAUDE.md、Git hook、shell hook、systemd、cron 和 SSH,在多個地方留下會讓惡意程式之後再跑的設定;還會重複使用偷來的 SSH key,嘗試橫向移動到其他機器。它另外設計了一層「偽裝層」,刻意把竊取憑證的動作,包裝成聽起來正當的任務 - 安全稽核、錢包安全檢查、雲端設定驗證。
  • 被打破的邊界是「設定檔不是程式碼」這個假設。 一旦 AI 助手把 repo 裡的檔案當成可信任的指令,攻擊者只要有辦法讓一個檔案進到 repo - 不管是透過套件,還是一個文件類的 PR - 就可能影響助手的行為。潛在曝險也包含會讀取投毒檔案的助手;只複製儲存庫,不代表惡意指令已執行或憑證已外洩。套件與儲存庫活動於 2026 年 5 月被觀測到,那些 PR 來自 GitHub 帳號 ddjidd564,目標包括 browser-use、langchain、langflow、llama_index、MetaGPT 和 OpenHands。

適用的 9 項 AIDEFEND 防禦手法

AID-H-022.002
Pre-Merge Dependency Change Risk Review
高
TrapDoor 的套件攻擊,靠的是 34 個以上的仿冒工具套件被加進專案。pull request 新增套件前,必須針對確切套件與 lockfile 差異,檢查漏洞、授權條款、維護者與來源儲存庫信譽、版本來源、安裝腳本差異,以及套件名稱是否有錯字或相似字元;任何分析缺漏,都要擋下合併。這項控制在安裝前審查原始碼變更;實際套件檔案的惡意程式掃描,以及限制 postinstall 或匯入時程式碼的影響,仍由其他控制負責。
AID-I-001.004
Sandbox Network Egress Restrictions
高
對 agent 命令、套件安裝與建置執行,採用沙箱對外連線預設拒絕,並獨立測試每條執行路徑。來源指出 GitHub Pages 用於提供惡意程式與設定,GitHub Gist 則是 Rust 路徑的竊資目的地;不能把靜態 Pages 網站直接寫成接收憑證的位置。只允許套件儲存庫或共用代管網域仍不夠,還須確認必要路徑,避免上傳與中繼濫用。
AID-H-022.001
Sandboxed Dependency Installation
高
把不可信套件的安裝,以及必要的匯入與建置執行,放在一次性沙箱中;不要掛載開發者家目錄、SSH 金鑰或正式環境秘密。能停用時,先停用 npm 安裝生命週期腳本。Python 匯入程式碼與 Rust build.rs 需要另外隔離執行或拒用套件,沒有一個通用旗標能同時停用三條路徑。
AID-M-009.002
Authority Envelope & Action Risk Classification
高
不論提示詞將動作稱為什麼,讀取 SSH 金鑰或錢包、執行 shell 與對外傳送,都是高風險動作。權限與風險紀錄應將這些動作排除在一般任務範圍外;實際拒絕則由執行時的核准、工具授權與對外連線管制負責。
AID-H-021.001
Client-Side Configuration Enforcement
中
以端點內容檢查與確切暫存檔案的審查提供早期訊號,並由中央 CI 決定是否允許合併。已公開的 hook 涵蓋 CLAUDE.md、agent_config.md 與兩種危險措辭,不涵蓋 .cursorrules,也不會解碼隱藏 Unicode、驗證遠端指引或證明指令安全。必須針對本案擴充並獨立驗證檔案與政策涵蓋範圍,在助手讀取前拒絕未經審查的變更。
AID-D-001.001
Per-Prompt Content, Intent & Obfuscation Analysis
中
在營運者可控制的入口,依 G001 使用鎖定版本、經校準的次要分類器,檢查程式助手實際讀入的指令檔文字中的任務轉向、權限宣稱或提權意圖,並產生與確切內容綁定的發現。G001 不會解碼零寬字元中的隱藏指令,也不會比對原始與呈現後的文字。目前 G002 解碼器無法初始化,此處不計入其效果。分類結果提供證據,是否拒絕輸入由獨立放行政策決定;看似合理或被隱藏的指令仍可能漏判。放行前須另行驗證完整分類結果與必要類別的涵蓋範圍。目前 G001 範例會把空結果、缺少必要類別或NaN 分數回報為 PASS/NO_FINDING;整合端必須把這些情況視為錯誤並拒絕放行。這是額外需要實作的檢查,不是已公開範例原本就具備的行為。
AID-H-002.002
Inference-Time Prompt & Input Validation
中
在指令檔的確切讀入位置、組裝推論請求前,套用已公開的欄位驗證與 Unicode 政策;依具簽章的放行政策,拒絕不允許的字元或偵測發現。正規化與模式檢查仍可能漏掉語意上的任務轉向,也不會把儲存庫指令變成可信權限;仍需要工具授權與對外連線管制。
AID-M-001.002
AI System Dependency Mapping
中
一旦掌握 TrapDoor 的指標,防禦方需要把清查範圍從套件相依關係展開到相關資產:哪些專案或 lockfile 引用惡意套件,哪些 repo 新增了 .cursorrules 或 CLAUDE.md,哪些 CI cache、容器或開發者機器可能接觸過這些內容。相依關係與資產盤點本身是輔助控制,作用是把一份 IOC(入侵指標)清單,轉成可追蹤、可分派的清查工作,而不是單獨完成偵測或阻擋。
AID-E-003.003
Confirmed Malicious Code & Persistence Eviction
中
移除事件中已確認惡意的指令檔、套件程式、Git/shell hook、systemd/cron 項目,以及攻擊者新增的 SSH 存取設定,再驗證受影響資產都已清除。憑證撤銷、已簽發token與工作階段的撤除,是另外的應變工作;移除套件不代表這些工作已完成。

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

  • 在 repo、lockfile、CI cache 和開發者機器上,搜尋 TrapDoor 指標:GitHub 帳號與網域 ddjidd564 和 ddjidd564.github.io、活動標記 P-2024-001、惡意程式 trap-core.js(48,485 bytes),以及 Rust 用的 XOR 金鑰 cargo-build-helper-2026。
  • 找出並審查最近新增或被改過的 .cursorrules、CLAUDE.md、AGENTS.md,尤其是透過外部 pull request 進來的;檢查裡面有沒有零寬字元,以及要求去跑「安全掃描」、「錢包安全檢查」或上傳資料的指令。
  • 設定 AI 程式助手,讓它把 repo 裡的檔案當成資料而不是指令;在讀取放 secrets 的路徑、執行 shell 命令或對外連線之前,要求明確核准。
  • 把套件安裝和建置放進一次性沙箱:能停用時先停用 npm 生命週期腳本,匯入與建置程式碼另行隔離,裡面不要有 SSH key 或正式環境 secrets,對外連線只允許到核准過的 registry。
  • agent 或 PR 帶進來的相依套件,除非已經查過精確套件、版本、維護者歷史和安裝腳本,否則先擋下或送人工審查;把 Socket 原文列出的 TrapDoor 套件名稱一律當成惡意套件。
  • 先區分檔案曝險與實際助手/套件執行;確認惡意執行、秘密被讀取,或無法排除時,到簽發端撤銷或輪替受影響的 SSH、AWS 與 GitHub 憑證。錢包私鑰遭到入侵時,須另外處理錢包遷移;並主動搜尋新增的 SSH authorized key、cron 或 systemd 的持久化設定,以及連到 GitHub Pages 或 Gist 的對外流量。

1 個額外的防禦考量

AI 助手指令檔需要像程式碼一樣被審查

團隊應將 .cursorrules、CLAUDE.md、AGENTS.md 與 .github/copilot-instructions.md 等指令檔列入資安審查。已觀測到的 TrapDoor PR,企圖以文件更新與隱藏 Unicode 引入指令;發現 PR 不代表變更已合併,或助手已執行其中指令。
建議做法: 在 pull request 裡要求審查指令檔的變更,審查時把隱藏字元和零寬字元顯示出來,並在 agent 讀取 repo 或 prompt 之前,先掃描裡面有沒有看不見的 Unicode 字元。

結論

TrapDoor 結合會執行的供應鏈惡意程式,以及利用 AI 指令檔的攻擊企圖。相關防禦手法包括設定審查、經校準的內容偵測、獨立執行的工具授權、相依套件執行隔離、對外連線管制與事件範圍內的清除。AI 助手路徑仍取決於內容是否被讀入、模型行為與執行權限;發現檔案或複製儲存庫,不能直接視為已成功執行攻擊。

最後更新: