NVIDIA garak × ATR
garak 是紅隊工具,ATR 是偵測標準。一個找到攻擊,另一個把它變成一條版本化、MIT 授權的偵測規則,ATR 因此不必另造一套攻擊語料——每個 probe 的來源都留在 author 欄位。
概念
garak 在 LLM 層找攻擊。ATR 在 agent 層防禦(tool calls、skills、MCP)。同一個攻擊 payload,兩個不同的偵測面——一個標準量它能不能突破模型,另一個標準量它能不能 在真實 agent 成品上被攔下來。橋接只是一支 Python 腳本:garak 報告進來,ATR 提案 出去,結晶 loop 起草規則,再由維護者審查。一條在這裡寫下的規則,下游每個消費 ATR 的引擎都收得到。
garak (red team) ATR (standard) downstream consumers
───────────────── ────────────── ────────────────────
Probes claude-3.7 828 rules today npm: agent-threat-rules
Probes gpt-5 ──▶ +auto-crystallised PyPI: pyatr
Probes gemini-2-pro from garak evidence your CI pipeline
Writes report.jsonl canary 24h
maintainer review
garak PR #1676 (ATR detectors inside garak): withdrawn by its ATR author on
2026-08-04, not merged. garak does not ship ATR.一次性設定
- 寄信到 [email protected] 附上你的組織名稱以取得 partner API key(早期夥伴階段手動發放,無費用,MIT 條款)。
- 橋接腳本 garak-to-tc.py 已於 2026-06-20 移出公開 repo,目前沒有公開提供。
- 在環境變數設定 key:
export ATR_PARTNER_KEY=…
執行
跑完一次 garak eval session 後:
# Native garak JSONL report
python3 garak-to-tc.py \
--input ~/.local/share/garak/runs/2026-04-18-claude-3-7/report.jsonl \
--partner-name your-org \
--target-model claude-3-7-sonnet \
--garak-version 0.14.1
# Or ATR-style eval (from scripts/eval-garak.sh in this repo)
python3 garak-to-tc.py \
--input data/garak-benchmark/garak-eval-report.json \
--partner-name your-org \
--dry-run # inspect before submitting兩種模式
腳本有兩種提交模式。預設(--mode drafter)就是你要的。
- drafter(預設)。把每個失敗的 probe POST 到
/api/atr-proposals/from-payload。Server 端跑 tool-use LLM drafter (grep 既有規則做去重、抓 research 做佐證、寫含 3+ conditions / 5+ TP / 5+ TN / 3+ evasion tests 的 YAML),通過 RFC-001 品質閘門,自測自己的 regex,然後立案成 proposal。每次呼叫 30-60s。這個模式產出真正的 ATR 規則。 - proposal(legacy)。POST client 端建好的字面草案。快,但 LLM reviewer 通常會以「太窄」(字面指紋 ≠ 偵測規則)退回。只有你上游自己有 YAML 產生步驟才用。
下游會發生什麼
- 每個唯一的失敗 probe →
/api/atr-proposals下一條 proposal,內嵌完整 garak 來源。 - TC 結晶 LLM 讀攻擊 payload + garak metadata,起草一條一般化的偵測 regex。
- 規則在 Threat Cloud 上進入 24h canary。
- 通過 canary → 安全閘門(良性 skill 語料 0 FP、test_cases 齊備、每個 PR ≤10 條規則; 語料以
data/skill-benchmark/benign/為準,閘會遞迴讀取其下所有 .md)→ 以 PR 送進agent-threat-rulesmain,由維護者審查後手動 merge(repo 已關閉 auto-merge)→ 隨下一個版本發布(CI 在 npm 上 stage,維護者以 2FA 核准)→ 每個下游消費者在下次安裝時升級。 - 每條產出的規則都帶
author: your-org (via garak vX.Y.Z)與metadata_provenance.garak_probe: <probe-id>。歸屬永久且機器可讀。
什麼算失敗的 probe
腳本在以下任一情況把一個 garak attempt 當成規則候選:
- 至少一個 garak detector 回傳分數高於 0.5(目標模型中招)。
- 輸入是 ATR 風格的 eval report,且該 prompt 出現在
missed_samples— garak 標記它為惡意,而 ATR 尚無對應 pattern (最高訊號的候選)。
速率限制與安全
- 每次 POST 之間預設 100ms 延遲,跑完約一分鐘。兩份語料、兩個 lane 的數字都公開:在 garak 公開 in-the-wild jailbreak 集(650 筆)上,recall 是 92.3% (hunt) / 0.9% (enforce);在完整 garak 語料(3,475 筆,涵蓋全部 probe 家族)上是 57.2% (hunt) / 0.5% (enforce)(ATR 4.1.5,量測於 2026-10-15)。hunt lane 是引擎預設,載入所有成熟度的規則;enforce lane 只載入 stable 規則,是開啟封鎖時要用的 lane,所以要開封鎖之前,該看的是它的數字。兩份都部分屬於 closed-book(等於看過考題):在上面開火的規則有不少正是從它們寫出來的,完整套件還把 in-the-wild 集收了兩次,所以兩個 hunt 數字都不是樣本外的成績。兩份語料之間的落差,一部分是刻意的——regex 偵測層不去打某些 probe 家族(例如純語意越獄),硬塞只會換來脆弱簽章與誤報;另一部分是 in-the-wild 的數字有不少靠的是從那份語料寫出來的規則。較低的數字也照樣列出,是因為一個標準的可信度,取決於它願不願意公開自己最差的數字。
patternHash是 prompt 的 sha256,所以對同一份 report 重跑是冪等的 — TC 辨識重複提交,只 bump 一個確認計數,絕不建立重複規則。- 所有流量都用你的 partner key 認證。Key 外洩?寄信,我們撤銷並重發。
- 每個提交的 proposal 在進入 canary 前,都可透過 TC admin dashboard 審查與退回。
相關
- /integrate — 一般採用者(npm + PyPI),不需 partner key
- /partner-sync — 給下游消費 ATR 的平台用的即時規則拉取
- scripts/garak-miss-to-proposals.ts — 公開 repo 裡的管線:把 ATR 在 garak benchmark 上漏掉的 prompt 變成規則提案