We Scanned 96,096 AI Agent Skills. 751 Were Malicious. Here Is What They Did.
I scanned 96,096 AI agent skills across six public registries and found 751 confirmed malicious. Most attacked at install time, before any runtime guard could see them.
我掃描了六個公開 registry 上的 96,096 個 AI agent skill,發現 751 個確認惡意。換算下來,你今天能安裝的每 1,000 個 skill 裡,大約有 8 個內藏著設計來竊取密鑰、執行遠端 payload 或回連攻擊者的程式碼。沒有一個會自報身分。它們看起來就是普通、會做一件有用事情的 skill,而它們確實做了那件有用的事,外加一件多的。
這是一份關於這 751 個 skill 究竟做了什麼的研究。結論很短:傷害發生在安裝當下,不是 runtime。一個 skill 的程式碼會在你安裝、把它接進 agent、或首次呼叫時執行。等到 runtime 防護開始盯著 agent 的 tool call 時,一個惡意的安裝流程早就讀完了你的 .env、解碼了一段 base64、並對一個寫死的 IP 開了 socket。槓桿點在於:在這個 artifact 落地之前就掃它。
什麼是 AI agent skill,為什麼它是一條供應鏈?
一個 skill(或一個 MCP server)是擴充 agent 的套件:一組工具、指令與可執行程式碼,讓像 Claude Code、Cursor、Windsurf 這樣的 agent 載入並呼叫。你安裝它的方式,跟你安裝任何相依套件一樣。問題就在這裡。這是 npm 形狀的散布方式,卻沒有 npm 十年來累積的供應鏈傷疤,而且對準的是一個握有你的 API key、你的 shell、你的檔案系統的 runtime。
這些 registry 是開放的。任何人都能發布。安裝步驟經常執行任意程式碼。而消費這個 skill 的,是一個擁有廣泛權限的自主 agent,這正是攻擊者想要的目標輪廓。這次掃描的六個公開 registry 橫跨主要的 skill 與 MCP 生態,96,096 個裡有 751 個惡意並不是捨入誤差。它是一個基線感染率。
這 751 個惡意 skill 實際上做了什麼?
惡意行為落在五種反覆出現的 pattern 上。多數壞 skill 不只用一種。
- ●環境變數與密鑰外洩。 目前為止最常見的 pattern。skill 讀取 process 環境變數、
.env檔或憑證儲存,然後把它們送出去。你的ANTHROPIC_API_KEY、雲端 token、資料庫 URL 就是在這裡離開現場的。它很安靜,因為讀環境變數對合法程式碼來說是再正常不過的事。破綻在於這些值接下來被怎麼處理。 - ●Base64 編碼的遠端程式碼執行。 payload 被存成一段 base64(或類似編碼)字串,在安裝或首次執行時解碼並執行。編碼能騙過快速掃過原始碼的人,也能騙過天真的關鍵字 grep。
eval(atob(...))與它的 shell 等價寫法反覆出現。 - ●寫死的可疑 IP 與回連主機。 直接烙進程式碼的字面 IP 位址與陌生網域,被當成外洩端點或 command-and-control 回連。一個宣稱只是排版文字的 skill,沒有理由握著一個裸 IP 和一個 socket 呼叫。
- ●混淆(Obfuscation)。 壓縮成一行的程式碼、字串切割、hex 逸出、層層疊疊的編碼,唯一目的就是讓程式碼對審查者不可讀。混淆本身不是攻擊。它是包住其他四種 pattern 的外殼,而它出現在一個小 skill 裡這件事本身,就是強烈訊號。
- ●延遲與條件式後門。 邏輯保持休眠,直到某個條件成立:一個日期、一次環境檢查、第 N 次呼叫。skill 在你評估期間表現完美,之後才翻臉。這是最可靠地擊敗人工審查的 pattern,因為審查的時間窗和攻擊的時間窗根本不重疊。
為什麼安裝時掃描是槓桿點?
因為攻擊在 runtime 監控進入迴圈之前就發動了。看看已經在案的真實事故。postmark-mcp 是一個受信任、能正常運作的 MCP server,它連續 15 個版本,每天安靜地把 3,000 到 15,000 封 email 密件副本(BCC)給攻擊者,才有人察覺。MCPJam Inspector 出貨了一個預設 0.0.0.0 綁定(CVE-2026-23744),在 v1.4.3 之前的每一個版本,把一個 HTTP 請求變成遠端程式碼執行。Azure MCP Server 有一個 SSRF(CVE-2026-26118),會竊取 managed-identity token。Claude Code 自己也有 hooks 與 MCP config 被濫用(CVE-2025-59536、CVE-2026-21852),做到任意 shell 執行與 API key 竊取。
這每一件都是 artifact 層級的問題。惡意行為就住在你安裝的那份程式碼裡,而且好幾個案例中,它在你把東西接進來的那一刻就執行了、或已經可被觸及。一個盯著 tool call 的 runtime 防護是必要的,但它是第二道。第一道防線是一開始就拒絕安裝這個 artifact。
這就是在安裝時掃描的理由。你把 skill 或 MCP server 當成一個靜態 artifact 來檢查:讀它的程式碼、解碼它被編碼的字串、解析它的網路端點、標記它的混淆、拿它的行為去比對已知攻擊 pattern。這一切都能在程式碼真正執行之前完成,因為破綻就在原始碼裡。
你要怎麼在安裝一個 skill 之前掃它?
這正是 ATR(Agent Threat Rules)存在要解決的問題。ATR 是一個獨立、開放、MIT 授權的偵測標準,就像 Sigma 是 SIEM 規則的開放標準一樣。它是一套確定性規則的語料,把 agent 專屬的攻擊 pattern 編碼進去:密鑰外洩、編碼 payload、可疑回連、混淆特徵,以及其餘。截至 2026 年 7 月,這套語料有 680+ 條規則、橫跨 10 個類別,對應到 OWASP Agentic Top 10(十個類別全覆蓋)與 MITRE ATLAS(101 個技術中的 34 個)。
在 498 個真實世界樣本的 SKILL.md 語料上,ATR 的 Layer 1 確定性規則做到 100% recall、97% precision、0.2% 誤報率。這正是安裝時問題的形狀:真實的 skill、靜態掃描、在它們執行之前。確定性規則在這裡是對的工具,因為它們以毫秒執行、每次給出相同答案,這正是你在一個安裝關卡所需要的。
PanGuard 是建立於並營運 ATR 標準之上的免費、MIT 授權工具。安裝它,在你安裝某個 skill 之前先掃那個 skill:
npm install -g @panguard-ai/panguard
pga up
pga scan <target>pga scan 把一個 skill 或 MCP server 當成靜態 artifact 檢查,回報它踩中哪些 ATR 規則,都在你把它接進 agent 之前。接著由 Guard 負責處理漏網之魚的 runtime 偵測。整套都是免費且開源。Community 版就是完整產品,沒有付費牆。
從 96,096 中的 751,你該帶走什麼?
兩件事。第一,惡意 skill 不是假設。以每 1,000 個約 8 個來算,如果你的團隊橫跨各處已經裝了幾百個 skill,你極可能已經裝到一個。第二,最要緊的防禦是那道在程式碼執行之前就跑的防禦。runtime 監控終究會抓到延遲後門。安裝時掃描則在那唯一還沒有任何東西執行、每個破綻都還躺在原始碼裡的時刻,抓下整套分類。
FAQ
這次掃描找到多少惡意 skill,總數是多少?
在六個公開 registry 上掃描的 96,096 個 AI agent skill 中,有 751 個確認惡意。基線感染率約為每 1,000 個 8 個。
最常見的惡意行為是什麼?
環境變數與密鑰外洩:讀取 .env 檔與 process 環境變數以竊取 API key 與雲端 token,再把它們送給攻擊者。它常見,是因為讀環境變數本身看起來很合法。
為什麼光靠 runtime 監控不夠?
因為一個 skill 的程式碼常在安裝或首次呼叫時就執行,早於 runtime 防護開始盯著的時間點。像 postmark-mcp 與 MCPJam Inspector 的 RCE(CVE-2026-23744)這類真實事故,都是 artifact 層級的問題,在 runtime tool call 監控之前、或獨立於它就發動了。
我可以免費在安裝前掃一個 skill 嗎?
可以。安裝 PanGuard(npm install -g @panguard-ai/panguard && pga up),對 skill 或 MCP server 跑 pga scan <target>。它免費、MIT 授權、建立於開放的 ATR 標準之上,Community 版就是完整產品、沒有付費牆。
下一步:在你安裝下一個 skill 或 MCP server 之前,先掃它。pga scan <target> 只要幾秒,拿 artifact 去比對開放的 ATR 規則語料,這是唯一一道在程式碼執行之前就跑的檢查。