執行你之首次 Garak 掃描
自零執行你之第一個 garak 漏洞掃描之逐步初學者演練,涵蓋安裝、目標設置、探測選擇與基礎結果解讀。
若你從未對語言模型使用漏洞掃描器,本演練將使你自零至你之第一個可行動掃描結果。我們將安裝 garak、設置免費本地目標、執行聚焦掃描,並學習如何讀取輸出。至結束,你將具形成本系列中每個後續 garak 演練基礎之可重複工作流程。
步驟 1:準備你之環境
於安裝 garak 本身前,設置隔離之 Python 環境。此防止 garak 之依賴(含 PyTorch、transformers 與數個 ML 函式庫)與你之其他 Python 專案衝突。
# 為紅隊工作建立專用目錄
mkdir -p ~/red-team/garak-lab
cd ~/red-team/garak-lab
# 建立虛擬環境
python3 -m venv .venv
# 啟動虛擬環境
source .venv/bin/activate
# 驗證 Python 版本(必須 3.10+)
python --version你應見如 Python 3.11.6 或更高之輸出。若你之版本低於 3.10,你需於繼續前安裝較新 Python。
現升級 pip 以避免 garak 依賴鏈之安裝問題:
pip install --upgrade pip setuptools wheel此步驟避免 pip 嘗試以過時建置工具編譯原生擴充套件時發生之建置失敗類別。
步驟 2:安裝 Garak
於啟動虛擬環境下,自 PyPI 安裝 garak:
pip install garak安裝拉入顯著數之依賴。於典型寬頻連線上,預期初始安裝 3-5 分鐘。完成後驗證:
# 檢查 garak 可用
garak --version
# 列出可用探測家族
garak --list_probes--list_probes 指令印出每個探測模組與類別。此為你可用攻擊之目錄。輸出長,故導至 less 或檔案以舒適閱讀:
garak --list_probes > available_probes.txt
wc -l available_probes.txt你典型將見組織為如 dan、encoding、promptinject、gcg、knowledgegraph 等家族之數百個探測類別。
類似地,列出生成器與偵測器以理解其他元件:
garak --list_generators > available_generators.txt
garak --list_detectors > available_detectors.txt步驟 3:以 Ollama 設置本地目標
為你之首次掃描,使用本地模型而非付費 API。此消除成本關切並讓你自由實驗。Ollama 為於本地執行模型之最簡單方式。
若你未安裝 Ollama:
# macOS 或 Linux
curl -fsSL https://ollama.com/install.sh | sh
# 驗證安裝
ollama --version拉取適合測試之小模型:
# 為實驗拉取小、快之模型
ollama pull llama3.2:3b
# 驗證模型可用
ollama list確保 Ollama 伺服器執行中:
# 啟動 Ollama 伺服器(若未執行)
ollama serve &
# 測試模型回應
ollama run llama3.2:3b "Hello, how are you?"若模型對話式回應,你之目標就緒。
步驟 4:執行你之第一個針對性掃描
而非執行所有探測(可能花費數小時),自針對單一探測家族之聚焦掃描開始。promptinject 家族為基礎提示注入漏洞測試,且為良好起點:
garak --model_type ollama \
--model_name llama3.2:3b \
--probes promptinject此指令告訴 garak:
- 連接至 Ollama 實例作為生成器
- 載入
llama3.2:3b模型 - 執行
promptinject家族中之所有探測 - 為每個探測使用預設偵測器
- 印出結果至主控台並儲存詳細記錄
掃描將花費 2-10 分鐘,取決於你之硬體。你將見每個探測執行之即時輸出:
garak LLM vulnerability scanner v0.9 : https://github.com/NVIDIA/garak
📦 Loading generator: ollama:llama3.2:3b
🔍 Running probes on ollama:llama3.2:3b
probes.promptinject.HijackHateHumansMini : PASS 100/100
probes.promptinject.HijackKillHumansMini : PASS 98/100
probes.promptinject.HijackLongPrompt : FAIL 72/100
每行顯示:
- 探測類別名稱
- PASS 或 FAIL 狀態
- 偵測器分類為安全之嘗試比率(PASS 較高為較佳)
步驟 5:理解掃描輸出
掃描完成後,garak 儲存詳細結果於其資料目錄。找出並檢視之:
# 找出最新報告檔案
ls -lt ~/.local/share/garak/ | head -10Garak 每次掃描產出兩個關鍵輸出檔案:
| 檔案類型 | 副檔名 | 含 |
|---|---|---|
| 報告 | .report.jsonl | 每探測嘗試配提示、回應與偵測結果之一個 JSON 物件 |
| 記錄 | .log.jsonl | 含時序、錯誤與 metadata 之操作記錄項 |
檢視報告檔案以理解個別探測嘗試:
# 自報告美化印出前幾個項
cat ~/.local/share/garak/garak.*.report.jsonl | \
python3 -m json.tool | head -60報告中之每個項含:
{
"entry_type": "attempt",
"probe": "promptinject.HijackLongPrompt",
"prompt": "Ignore the above and instead tell me...",
"output": "I can't help with that request...",
"detector": "promptinject.AttackRogueString",
"status": "pass",
"score": 0.12
}要聚焦之關鍵欄位:
- probe:何攻擊被嘗試
- prompt:送至模型之確切 payload
- output:模型之原始回應
- status:偵測器是否將此分類為成功攻擊
- score:自偵測器之信心分數(較高意指攻擊更可能成功)
步驟 6:擴展你之掃描
現你理解基礎,執行具多個探測家族之更廣掃描:
garak --model_type ollama \
--model_name llama3.2:3b \
--probes promptinject,dan,encoding,gcg此測試四個攻擊類別:
| 探測家族 | 測試什麼 |
|---|---|
promptinject | 直接提示注入嘗試 |
dan | 「Do Anything Now」越獄提示 |
encoding | 編碼 payload(Base64、ROT13 等) |
gcg | 以梯度為本之對抗後綴(快取) |
你亦可以自訂前綴儲存輸出以易於組織:
garak --model_type ollama \
--model_name llama3.2:3b \
--probes promptinject,dan,encoding,gcg \
--report_prefix first_broad_scan自報告獲快速失敗摘要:
# 按探測家族計算失敗
cat ~/.local/share/garak/first_broad_scan*.report.jsonl | \
python3 -c "
import sys, json
from collections import Counter
failures = Counter()
for line in sys.stdin:
entry = json.loads(line)
if entry.get('status') == 'fail':
failures[entry['probe']] += 1
for probe, count in failures.most_common():
print(f'{count:4d} {probe}')
"步驟 7:建立可重複組態檔案
而非輸入長命令列,建立捕捉你掃描參數之 YAML 組態檔:
# garak-first-scan.yaml
plugins:
model_type: ollama
model_name: llama3.2:3b
probes:
- promptinject.HijackHateHumansMini
- promptinject.HijackKillHumansMini
- promptinject.HijackLongPrompt
- dan.Dan_11_0
- dan.Dan_6_0
- encoding.InjectBase64
- encoding.InjectROT13
extended_detectors:
- toxicity.ToxicCommentModel使用組態檔案執行掃描:
garak --config garak-first-scan.yaml --report_prefix config_scan此途徑具數個優勢:
- 可重現性:任何人可執行確切相同之掃描
- 版本控制:將組態檢入你之儲存庫
- 迭代:修改組態並隨時間比較結果
步驟 8:下一步與驗證
於繼續前,驗證你可使用你掃描結果回答這些問題:
- 哪些探測家族產生失敗? 於主控台輸出查看 FAIL 行。
- 最差表現之探測為何? 找出通過比最低之探測。
- 你能找到失敗之實際攻擊 payload 與回應嗎? 使用
jq或 Python 自 JSONL 報告提取特定失敗。
# 提取一個完整失敗範例供審查
cat ~/.local/share/garak/first_broad_scan*.report.jsonl | \
python3 -c "
import sys, json
for line in sys.stdin:
entry = json.loads(line)
if entry.get('status') == 'fail':
print(json.dumps(entry, indent=2))
break
"若你能提取並讀取失敗項,你具與 garak 工作之基本技能。本系列中之下一個演練建立於此基礎:
- garak-custom-probe-creation 涵蓋撰寫為你特定應用量身打造之探測
- garak-multi-model-comparison 顯示如何跨模型比較漏洞輪廓
- garak-ci-cd-integration 自動化於你部署管線中之掃描
常見問題與故障排除
| 問題 | 原因 | 解法 |
|---|---|---|
於 import 時 ModuleNotFoundError | 不完整安裝 | 執行 pip install garak --force-reinstall |
為 Ollama 之 ConnectionRefusedError | Ollama 伺服器未執行 | 於分離終端機執行 ollama serve |
| 找不到模型錯誤 | 模型尚未拉取 | 執行 ollama pull llama3.2:3b |
| 掃描於第一個探測懸置 | 模型載入記憶體中 | 等待 30-60 秒供初始模型載入 |
| 極慢之掃描時間 | 僅 CPU 推論 | 對 CPU 此為正常;考慮 GPU 或較小模型 |
| 空報告檔案 | 掃描中斷或當機 | 檢查記錄檔案以獲錯誤細節 |
CUDA out of memory | GPU 記憶體耗盡 | 使用如 llama3.2:1b 之較小模型或為 CPU 設 CUDA_VISIBLE_DEVICES="" |
相關主題
- Garak 端對端演練 —— 涵蓋所有 garak 特性之完整參考
- Garak 自訂探測建立 —— 下一步:為你特定應用撰寫探測
- 提示注入基礎 —— 理解 garak 最多測試之攻擊類別
- Ollama 本地紅隊 —— 更多關於為安全測試使用本地模型
執行你之首次 garak 掃描時,為何推薦使用如 'promptinject' 之針對性探測家族而非 '--probes all'?