Threat Crystallization: How a New Agent Attack Becomes a 3ms Rule in About an Hour
Threat crystallization turns an AI's one-time reasoning about a new attack into a deterministic regex rule that runs in milliseconds for every install, with new-attack-to-shipped-rule in about an hour.
威脅結晶化是這樣運作的:AI 讀一次新的 agent 攻擊,花幾秒理解它為什麼有效,然後把這份理解寫成一條確定性的 regex 規則。從此以後,這條規則對每次安裝都在毫秒內執行,熱路徑上不再需要模型。新攻擊到上線規則約需一小時。委員會式規則庫則要數週到數月。
我開發 ATR(Agent Threat Rules),一套開放、MIT 授權的偵測標準;也開發建構其上的免費產品 PanGuard。這篇要解釋我一直在用的這個詞背後的機制,因為威脅結晶化正是這套語料能長到將近 690 條規則(2026 年 7 月為 688 條,npm agent-threat-rules v3.5.6)、橫跨 10 個類別,而不必我一條條純手寫的真正原因。
威脅結晶化到底是什麼意思?
它是把兩件通常被混在一起的工作分開:理解攻擊,以及偵測攻擊。
理解很慢也很貴。一個大模型讀一個惡意 skill 或被污染的 tool response,推理其意圖,判斷它是不是攻擊。這份推理耗掉數秒與實實在在的 token,而你不會想在每一次 tool call、每一位使用者身上永遠付這筆錢。
偵測則應該又快又免費。當模型理解攻擊之後,這份理解裡最耐久的部分是一個 pattern:一個特定的指令形態、一個外洩原語、一個可疑的參數。這個 pattern 被寫成 regex 規則。這條規則就是那份推理凍結後的產物。它在毫秒內確定性地執行,對所有人一模一樣,而且再也不需要模型。
這就是結晶化:流動的推理冷卻成一條固態的規則。AI 判斷了一次,規則永遠執行。
為什麼用 regex 而不是每次都跑模型?
因為確定性與速度正是 Layer 1 防禦的全部意義。一條在毫秒內執行的規則,可以卡在 skill 安裝前或 tool call 執行前的 inline 位置,而且在每台機器上行為都一致。你可以讀它、稽核它、做版本控管,並精確重現它為什麼觸發。把模型呼叫放進熱路徑則很慢、每次呼叫都要花錢,而且每次給的答案還略有不同。
這些確定性 Layer 1 規則的實測表現(一律連同其語料一起引用)是站得住的。在 NVIDIA garak 的野外 jailbreak 語料(650 筆)上,規則達到 97.2% recall。在自建的 PINT 格式語料(850 筆,取自 deepset/prompt-injections 與 Lakera Gandalf,並非 Lakera 官方私有 PINT)上,99.7% precision、63.6% recall。在 HackAPrompt(EMNLP 2023,4,780 筆)上,69.6% recall,對比 28.6% 的基線,precision 100%。在 498 筆真實世界 SKILL.md 語料上,100% recall、97% precision、0.2% 誤報。
一個誠實的但書:沒有單一的引擎級誤報數字。誤報是分 lane 的。對 65,000 筆的 benign gate,enforce lane 約 0.24% FP,而預設的 hunt lane 約 9%。任何拿一個混合後的單一 precision 數字餵給你的偵測引擎,都是在賣東西。
這個飛輪怎麼轉?
每一次掃描,只要發現新東西,都能變成一條保護所有人的規則。這就是那個迴圈。
我做過一次野外掃描,橫跨六個公開登錄庫:96,096 個 AI agent skill,751 個確認惡意。這堆裡每一個新穎的惡意 pattern,都是結晶化的候選。模型理解它一次,pattern 變成規則,規則上到標準,下一個跑 pga scan 的人在安裝那東西之前就已受保護。理解一個攻擊的成本由一台機器付一次。好處由每一次安裝共享。
這也是為什麼語料能每天長,而不是每季才長。新攻擊不必等標準委員會開會。它只等一個模型理解它、一道 gate 放行。
什麼阻止壞規則上線?
一道 gate。因為任何快速移動的規則管線,其失敗模式就是上線一條會誤擋合法行為的規則。這個錯我犯過。曾有一條 auto-merge 管線在我攔下來之前 merge 了十一條誤報規則,而這正是現在這道 gate 存在的原因。
在一條結晶化規則被允許進入標準之前,它必須通過 65,000 筆的 benign gate,並證明它仍抓得到自己的 true positive。會對乾淨 skill 觸發的規則不上線。已經抓不到自己當初對付的那個攻擊的規則也不上線。沒有 gate 的結晶化,只是一種更快產生噪音的方式。
威脅結晶化 vs 委員會規則庫
| 屬性 | 威脅結晶化 | 委員會規則庫 |
|---|---|---|
| 新攻擊到上線規則 | 約一小時 | 數週到數月 |
| 誰推理這個攻擊 | AI,一次 | 工作小組,反覆 |
| 每次檢查的執行成本 | 毫秒,無模型 | 不一,常為人工 |
| 確定性 | 各處結果相同 | 依審查者而異 |
| 一次發現誰受益 | 每一次安裝 | 有出席的成員 |
重點不是委員會沒用。ATR 對接了真正委員會驅動的框架:866 條規則到類別的映射,覆蓋 OWASP Agentic Top 10(2026)全部 10 個類別,以及 MITRE ATLAS 101 個頂層技術中的 34 個。重點是,從發現一個活攻擊到能防它,那段落差應該是一小時,而不是一季。威脅不會等。postmark-mcp,一個受信任的 MCP server,連續十五個版本每天靜默 BCC 3,000 到 15,000 封信才被發現。MCPJam Inspector(CVE-2026-23744)的預設 0.0.0.0 綁定,讓每一個 v1.4.3 之前的版本一個 HTTP 請求就等於 RCE。回應速度在這裡不是錦上添花。
FAQ
威脅結晶化跟 LLM 防火牆是一樣的嗎?
不一樣。LLM 防火牆對每個請求都跑一次模型。結晶化只跑一次模型去理解攻擊,然後上線一條確定性 regex 規則,讓模型永遠不在熱路徑上。你以 regex 的速度與成本,拿到模型的判斷。
把模型放前面會不會慢到沒辦法 inline 用?
這正是這個設計的理由。因為偵測是 regex,一條 Layer 1 規則在毫秒內執行,可以卡在 skill 安裝前的 inline 位置。那筆昂貴的推理是更早、只做一次、在別人的機器上發生的。
為什麼沒有單一的誤報數字?
因為誤報是分 lane 的。對 65,000 筆的 benign gate,enforce lane 約 0.24% FP,預設的 hunt lane 約 9%。單一混合後的引擎級 FP 數字會把這個取捨藏起來。
我要怎麼試?
跑 npm install -g @panguard-ai/panguard && pga up,再用 pga scan <target> 在安裝前檢查一個 skill 或 MCP server。它免費、MIT 授權,並自動偵測 Claude Code、Cursor、Windsurf、Gemini CLI、Cline、Codex CLI 等 runtime。
針對你 agent 的下一個攻擊,此刻已經存在於某處。安裝一個 skill 之前先用 pga scan <target> 掃它;如果你發現新東西,那個發現就能變成一條保護所有人的規則。