red-teaming-llms-with-garak について
オープンソースの LLM 脆弱性スキャナー garak でモデルを検査するスキルです。スキャンの実行、結果の解釈、緩和策の再検証を扱い、許可を得た対象のみをテストします。
主な機能
- 01プロンプトインジェクションと脱獄の検査
- 02情報漏えいと危険な出力の検証
- 03ローカルモデルと API エンドポイントの検査
- 04ヒット率と生成レポートの確認
- 05緩和策適用後の結果比較
活用シーン
- 01LLM セキュリティ評価の基準作成
- 02ガードレールやプロンプト変更の検証
- 03更新後のエンドポイント回帰テスト
- 04AI リスク評価向けの所見記録
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill red-teaming-llms-with-garakインストール後、Claude Code で/red-teaming-llms-with-garakを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdstandards.mdscripts/agent.py詳細
garak による LLM のレッドチームテスト
法的および許可された利用に関する通知: このスキルは、許可を得た AI セキュリティテストおよび教育目的に限って使用してください。所有するモデル、API キー、エンドポイント、またはテストする明示的な書面による許可を得たものだけを調査してください。サードパーティの LLM API を自動的に調査すると、利用規約に違反したり、課金対象のトークンを消費したりする場合があります。管理権限のないシステムを許可なく調査することは、違法となる可能性があります。
概要
garak(Generative AI Red-teaming and Assessment Kit)は、NVIDIA が保守するオープンソースの LLM 脆弱性スキャナーです。ホストを対象とする Nessus のようなネットワーク脆弱性スキャナーに相当する役割を、大規模言語モデルに対して担います。ターゲットモデルに数千件の敵対的なプロンプト(「プローブ」)を送り、生成結果を収集し、応答に対して自動「検出器」を実行して各試行が成功したかどうかを判定します。プローブ群には、プロンプトインジェクション(promptinject、latentinjection)、ジェイルブレイク(dan)、学習データやシステムプロンプトの漏えい(leakreplay)、マルウェア生成(malwaregen)、クロスサイトスクリプティングのペイロード出力(xss)、エンコーディングを利用した回避(encoding)、有害性などが含まれます。garak は論文「garak: A Framework for Security Probing Large Language Models」(arXiv:2406.11036)で紹介されており、NVIDIA/garak GitHub リポジトリから配布されています。
このスキャナーは、特定のジェネレーターに依存しません。ローカルに読み込んだ Hugging Face モデル、OpenAI 互換 API、AWS Bedrock、Replicate、Cohere、NIM エンドポイント、GGUF/llama.cpp モデル、および JSON ジェネレータースペックを使った任意の REST エンドポイントを対象にできます。実行後、garak はすべての試行と検出器の判定を記録した行区切りログ .report.jsonl、人間が読みやすい .report.html、デバッグログ garak.log、および確認された脆弱性のヒットログを出力します。ターミナルには、プローブ別、検出器別の合否サマリーとヒット率(例:dan.Dan_11_0 jailbreak: FAIL ok on 38/40)が表示されます。これが、解釈の対象となる主な成果物です。
このスキルは、garak が両方を実行可能にするため、MITRE ATLAS の手法 **AML.T0051(LLM プロンプトインジェクション)**および **AML.T0054(LLM ジェイルブレイク)**に対応しています。プロンプトインジェクションとジェイルブレイクの入力を大規模に作成し、ターゲットのガードレールが機能するかを測定します。また、デプロイ済み AI システムのセキュリティとレジリエンスを、再現可能かつ定量的に測定することで、NIST AI RMF のサブカテゴリー MEASURE-2.7を支援します。
使用する場面
- デプロイの前後に、LLM のセキュリティを迅速かつ再現可能な方法でベースライン評価する必要がある場合。
- ガードレール、システムプロンプト、安全性のファインチューニングが、ジェイルブレイクやインジェクションの成功率を実際に下げるか検証する場合(前後に実行してヒット率を比較します)。
- AI リスク評価やモデルカードのセキュリティセクション向けの証拠を作成する場合(NIST AI RMF MEASURE-2.7)。
- OWASP LLM Top 10 のリスク(LLM01 プロンプトインジェクション、LLM02 機密情報の漏えい、LLM07 システムプロンプトの漏えい)のうち、モデルで実際に発生するものをトリアージする場合。
- モデルまたはプロンプトの変更後に、CI で LLM エンドポイントのリグレッションテストを行う場合。
前提条件
- Python 3.10 以降(3.12 を推奨)と仮想環境。
- PyPI から garak をインストールします:
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate python -m pip install -U garak garak --version - 最新開発版をインストールする場合:
python -m pip install -U git+https://github.com/NVIDIA/garak.git@main - ホスト型モデルを調査する場合、ターゲットの API キー(例:
export OPENAI_API_KEY="sk-...")。 - ターゲットをテストする書面による許可と、トークン費用への認識(プローブは数千件の呼び出しを生成します)。
目標
- 利用可能なプローブと検出器を列挙し、対象を絞ったテストスイートを選びます。
- ローカルの Hugging Face モデル、OpenAI 互換 API、任意の REST エンドポイントに対して garak を設定します。
- プロンプトインジェクション、ジェイルブレイク、漏えいのプローブ群を実行し、レポートを取得します。
- プローブ別のヒット率出力と
.report.jsonlを解釈します。 - 緩和策を適用した後に再実行し、リスクの低減を示します。
- AI リスク評価に使用できる、根拠のある調査結果の成果物を作成します。
MITRE ATT&CK マッピング
このスキルでは、ATT&CK の敵対的機械学習向け補完版である MITRE ATLAS のテクニック ID を使用します。
| ID | 戦術 | 公式名称 | 関連性 |
|---|---|---|---|
| AML.T0051 | ML 攻撃の準備/影響 | LLM プロンプトインジェクション | garak の promptinject と latentinjection のプローブは、悪意のあるプロンプトを作成し、モデルの意図された動作を覆そうとします。 |
| AML.T0054 | 権限昇格/防御回避 | LLM ジェイルブレイク | garak の dan や関連するプローブは、安全対策を回避してモデルに制限されたコンテンツを生成させようとします。 |
ワークフロー
フェーズ 1:プローブと検出器を列挙する
- 実行範囲を決められるよう、garak に含まれるすべてのプローブを一覧表示します。
garak --list_probes - 検出器(プローブの成功を判定するモジュール)とジェネレーター(ターゲットへの接続機能)を一覧表示します。
garak --list_detectors garak --list_generators - プローブの分類を確認します。主なファミリーは次のとおりです。
promptinject— PromptInject フレームワークによる直接インジェクション。latentinjection— ドキュメントやエンコードされたテキストに隠された指示(間接インジェクション)。dan— 「Do Anything Now」および関連するジェイルブレイク(例:dan.Dan_11_0)。leakreplay— 記憶されたテキスト、学習データ、または隠されたプロンプトをモデルに再現させます。encoding— base64/ROT13 などによるインジェクションの回避。xss— クロスサイトスクリプティングのペイロードを出力させます(Markdown/HTML による情報窃取)。malwaregen— ウイルス対策ソフトを回避するコードや悪意のあるコードを要求します。
フェーズ 2:ローカルの Hugging Face モデルをプローブする
- ローカルモデルに対してジェイルブレイクプローブを 1 つ実行し、セットアップを検証します。
python -m garak --target_type huggingface --target_name gpt2 --probes dan.Dan_11_0 - チャットモデルに対して、より包括的なテストスイートを実行します。
python -m garak \ --target_type huggingface \ --target_name meta-llama/Llama-3.2-1B-Instruct \ --probes promptinject,dan,leakreplay \ --report_prefix llama32_baseline
フェーズ 3:OpenAI 互換 API をプローブする
- キーをエクスポートし、インジェクションと漏えいのプローブを実行します。
export OPENAI_API_KEY="sk-..." python -m garak \ --target_type openai \ --target_name gpt-4o-mini \ --probes promptinject,latentinjection,leakreplay \ --generations 5 \ --parallel_attempts 8 \ --report_prefix gpt4omini_injection--generationsは、プロンプトごとの完了数を設定します(数を増やすほど統計的な信頼度が高まりますが、コストも増加します)。--parallel_attemptsを設定すると、リモート API のスループットが向上します。
フェーズ 4:任意の REST エンドポイントをプローブする
- garak は、JSON ジェネレーターの仕様を使って任意の HTTP API をターゲットにできます。
rest.jsonを作成します。{ "rest": { "RestGenerator": { "name": "my-llm-gateway", "uri": "https://llm.internal.example/v1/chat", "method": "post", "headers": { "Authorization": "Bearer $ENV_TOKEN", "Content-Type": "application/json" }, "req_template_json_object": { "model": "internal-bot", "prompt": "$INPUT" }, "response_json": true, "response_json_field": "$.output" } } } - garak を実行します。
export ENV_TOKEN="..." python -m garak \ --target_type rest \ -G rest.json \ --probes promptinject,dan \ --report_prefix internal_gateway
フェーズ 5:厳選した設定と全件スイープを実行する
- 評価を再現可能にするには、すべての設定を YAML/JSON 設定ファイルに固定し、
--configを指定します。python -m garak --config assessment.yaml# assessment.yaml plugins: model_type: openai model_name: gpt-4o-mini probe_spec: promptinject,latentinjection,dan,leakreplay,xss,malwaregen run: generations: 5 parallel_attempts: 8 reporting: report_prefix: quarterly_llm_assessment - 網羅的なスイープ(時間とコストがかかります)を行うには、
--probesを完全に省略してすべてのプローブを実行します。
フェーズ 6:検出率レポートを解釈する
- ターミナルのサマリーを確認します。各行は
probe.Class detector: PASS|FAIL ok on N/Mの形式です。okの割合が低い FAIL は、モデルが危険な動作を頻繁に生成したことを意味し、重大度の高い発見事項となります。 - 機械可読レポートを開き、失敗を集計します。
# Every attempt with detector verdicts is one JSON line jq -r 'select(.entry_type=="eval") | "\(.probe)\t\(.detector)\t\(.passed)/\(.total)"' \ garak.<timestamp>.report.jsonl | sort - 生成された
.report.htmlをブラウザーで開き、整形されたスコアカードとプローブごとの内訳を確認します。 - ヒットログから実際に成功した攻撃文字列を取得し、概念実証の証拠として使用します。
フェーズ 7:緩和して再テストする
- 対策を適用します(システムプロンプトを厳格化する、Llama Guard や LLM Guard などの入力/出力ガードレールを追加する、またはモデルを変更する)。
- 新しい
--report_prefixを指定し、同じプローブセットを再実行します。 - 実行間の検出率を比較し、リスク低減の度合いをレポートに記載します。
ツールとリソース
| リソース | 目的 | リンク |
|---|---|---|
| NVIDIA/garak | ソース、プローブ一覧、イシュー | https://github.com/NVIDIA/garak |
| garak ドキュメント | CLI リファレンス、ジェネレーター設定 | https://docs.garak.ai/ and https://reference.garak.ai/ |
| garak 論文(arXiv:2406.11036) | 方法論と設計 | https://arxiv.org/abs/2406.11036 |
| OWASP Top 10 for LLM Applications | プローブが対応するリスク分類 | https://genai.owasp.org/ |
| MITRE ATLAS | AML テクニックの定義 | https://atlas.mitre.org/ |
プローブファミリーのリファレンス
| プローブファミリー | 対象 | OWASP LLM との対応 |
|---|---|---|
promptinject | 直接的なプロンプトインジェクション | LLM01 |
latentinjection | 間接的な/隠れたコンテキストへのインジェクション | LLM01 |
dan | ジェイルブレイク/ガードレールの回避 | LLM01 / safety |
leakreplay | 学習データおよびプロンプトの漏えい | LLM02 / LLM07 |
encoding | エンコーディングによるフィルターの回避 | LLM01 |
xss | Markdown/HTML による情報流出ペイロード | LLM02 |
malwaregen | 悪意のあるコードの生成 | misuse |
検証基準
- garak がインストールされ、
garak --versionが成功する。 -
--list_probes/--list_detectorsを使ってプローブと検出器が一覧表示されている。 -
--report_prefixを設定し、対象に対する少なくとも 1 回のプローブ実行が完了している。 -
.report.jsonl、.report.html、garak.logが生成され、保存場所が確認されている。 - プローブごとのヒット率を抽出し、重大度順にランク付けしている。
- 成功した攻撃文字列を、証拠としてヒットログから取得している。
- 緩和策を適用し、ヒット率の変化を示す比較実行が完了している。
- リスク評価のため、調査結果を OWASP LLM Top 10 および MITRE ATLAS に照らして記録している。