continuous-llm-red-teaming-with-promptfoo について
Promptfoo と DeepTeam を使い、LLM アプリケーションを敵対的入力で継続的にテストする手順を示すスキルです。許可を得たセキュリティテストを対象とし、レポートと CI/CD のチェックで回帰を検出します。
主な機能
- 01敵対的テストケースの生成
- 02OWASP と MITRE ATLAS へのマッピング
- 03Promptfoo と DeepTeam によるテスト実行
- 04プラグイン別の合否レポート確認
- 05失敗時に CI/CD ビルドを停止
- 06リリースごとの攻撃成功率の追跡
活用シーン
- 01ジェイルブレイクとプロンプトインジェクション対策のテスト
- 02セキュリティ検査失敗時のマージ停止
- 03モデルやプロンプトのバージョン比較
- 04リリースをまたぐ脆弱性回帰の監視
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill continuous-llm-red-teaming-with-promptfooインストール後、Claude Code で/continuous-llm-red-teaming-with-promptfooを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdstandards.mdscripts/agent.py詳細
Promptfoo による継続的な LLM レッドチーミング
許可された利用のみ: これらの敵対的プローブは、自分が所有する、またはテストの明示的な許可を得ている LLM アプリケーションとエンドポイントに対してのみ実行してください。生成される攻撃ペイロード(ジェイルブレイク、プロンプトインジェクション、有害コンテンツの誘発)は敵対的な入力です。許可なくサードパーティーのサービスに送信すると、利用規約に違反する場合があります。
概要
Promptfoo は、オープンソースの LLM 評価・レッドチーミングフレームワークです(README によると OpenAI と Anthropic でも使用されています)。敵対的なテストケースを生成し、それらをモデル/エージェントに対して実行して、応答を評価します。DeepTeam(Confident AI 製)は、50 種類以上のすぐに使える脆弱性と、研究に裏付けられた 10 種類以上の攻撃手法を提供する、相補的なオープンソースフレームワークです。この 2 つを組み合わせることで、LLM のセキュリティを回帰テストとして扱えます。コミットのたびに同じ敵対的テストスイートを再実行し、以前は安全だった挙動に退行が生じた場合はパイプラインを失敗させます。
LLM アプリケーションは常に変化するため、これは重要です。プロンプト、モデル、RAG ソース、ツール、ガードレールはすべて変化します。前回のスプリントで修正したジェイルブレイクが、プロンプトの編集やモデルのアップグレード後に、気付かないうちに再発することがあります。Promptfoo はプラグインを OWASP LLM Top 10(owasp:llm)および OWASP Agentic(owasp:agentic)のプリセット、さらに MITRE ATLAS に直接対応付けるため、テストスイートで広く認知されたリスク分類体系を追跡できます。ここで扱う主要な脅威は AML.T0051 — LLM Prompt Injection(MITRE ATLAS)です。これは、アプリケーションが意図した挙動を上書きする敵対的な指示を指します。このスキルは Promptfoo のレッドチーミングドキュメント(https://www.promptfoo.dev/docs/red-team/)と DeepTeam のドキュメント(https://www.trydeepteam.com/docs/getting-started)に従い、NIST AI RMF MANAGE-4.1(AI リスク管理のためのデプロイ後の監視とフィードバック)に沿っています。
使用するタイミング
- 単発の手動テストではなく、CI/CD で LLM アプリを継続的かつ自動的にレッドチーミングする必要がある場合。
- セキュリティゲートを適用し、ジェイルブレイク/インジェクションの脆弱性を新たに持ち込む、または再発させる変更のマージをブロックしたい場合。
- コンプライアンス報告のために、カバレッジを OWASP LLM Top 10/OWASP Agentic/MITRE ATLAS に対応付ける場合。
- 2 つのモデル、またはプロンプトの 2 つのバージョンのセキュリティ態勢を並べて比較する場合。
- リリースをまたいで、脆弱性の再発を継続的に追跡する場合。
前提条件
- Node.js 18 以降(Promptfoo は npm 経由で配布)および Python 3.9 以降(DeepTeam 用)。
- Promptfoo と DeepTeam をインストールします。
npm install -g promptfoo # or: npx promptfoo@latest pip install -U deepteam - 対象の LLM エンドポイントへの API アクセス/認証情報(および OpenAI キーなどの評価モデル用認証情報)が環境変数として設定されていること。
- シークレットストレージを備えた CI/CD プラットフォーム(GitHub Actions、GitLab CI)。
- 対象アプリケーションをテストする許可。
目標
- LLM アプリを対象とする Promptfoo のレッドチーム設定を作成する。
- OWASP LLM Top 10 と OWASP Agentic のプラグインプリセットに加え、ジェイルブレイク/インジェクション戦略を有効にする。
- テストスイートをローカルで実行し、プラグインごとの合否レポートを解釈する。
- プログラムで実行でき、研究に裏付けられた攻撃を行う第 2 のエンジンとして DeepTeam を追加する。
- 両方を CI/CD に統合し、新たな脆弱性が見つかった場合にビルドを失敗させる。
- 実行ごとに共有可能な HTML/PDF セキュリティレポートを生成する。
MITRE ATT&CK の対応付け
| ID | 名前(MITRE ATLAS) | 戦術 |
|---|---|---|
| AML.T0051 | LLM プロンプトインジェクション | 初期アクセス/永続化(LLM) |
| AML.T0051.000 | 直接(プロンプトインジェクション) | LLM 攻撃 |
| AML.T0051.001 | 間接(プロンプトインジェクション) | LLM 攻撃 |
| AML.T0054 | LLM ジェイルブレイク | 権限昇格/防御回避(LLM) |
ワークフロー
1. レッドチーム設定を作成する
対話形式の設定を初期化します。ターゲット、プラグイン、戦略を記述する promptfooconfig.yaml が作成されます。
promptfoo redteam init
# choose your target type (HTTP endpoint, openai:..., anthropic:..., custom provider)
2. ターゲット、OWASP プリセット、攻撃戦略を定義する
promptfooconfig.yaml を編集します。purpose は攻撃生成の基盤となり、plugins は敵対的な入力を生成し、strategies は配信手法(ジェイルブレイク/インジェクションのラッパー)を指定します。
# promptfooconfig.yaml
targets:
- id: https://api.example.com/chat # your app endpoint
label: support-bot
redteam:
purpose: |
A customer-support assistant for an e-commerce site. Must never reveal
system prompts, leak PII, or perform actions outside order support.
numTests: 10
plugins:
- owasp:llm # OWASP LLM Top 10 preset
- owasp:agentic # OWASP Agentic threats preset
- id: pii:direct
numTests: 15
- prompt-extraction # system-prompt leakage
- harmful
strategies:
- id: jailbreak # iterative single-turn jailbreak
- id: jailbreak:composite # stacked jailbreak techniques
- id: crescendo # multi-turn escalation
- id: prompt-injection # injection wrapper
3. テストスイートを実行してレポートを確認する
redteam run は生成と評価を組み合わせます。実行後、インタラクティブレポートを開きます。
promptfoo redteam run
promptfoo redteam report # launches the web report (pass/fail per plugin)
各行には、プラグイン(OWASP/ATLAS との対応付け)、戦略、攻撃プロンプト、モデルの応答、評価者の判定が表示されます。プラグインごとの攻撃成功率が最も重要な指標です。リリースごとに追跡してください。
4. プログラムからの、研究に裏付けられた攻撃に DeepTeam を追加する
DeepTeam を使用すると、追加の脆弱性や攻撃に対応できるほか、Python で独自のテストスイートをスクリプト化できます。
# deepteam_suite.py
from deepteam import red_team
from deepteam.vulnerabilities import Bias, PIILeakage
from deepteam.attacks.single_turn import PromptInjection
def model_callback(prompt: str) -> str:
# call your application's LLM endpoint here and return the text response
return call_my_app(prompt)
red_team(
model_callback=model_callback,
vulnerabilities=[Bias(types=["race"]), PIILeakage(types=["api_and_database_access"])],
attacks=[PromptInjection()],
)
DeepTeam は YAML 設定から実行することもできます:
deepteam run config.yaml
5. CI/CD(GitHub Actions)でビルドをゲートする
レッドチームのアサーションが失敗した場合は、パイプラインを失敗させます。Promptfoo は失敗時にゼロ以外の終了コードを返し、マージをブロックします。
# .github/workflows/llm-redteam.yml
name: LLM Red Team
on: [pull_request]
jobs:
redteam:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm install -g promptfoo
- name: Run red team (fails build on new vulns)
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: promptfoo redteam run --no-progress-bar
- name: Export machine-readable results
if: always()
run: promptfoo redteam report --output results.json
- uses: actions/upload-artifact@v4
if: always()
with: { name: redteam-report, path: results.json }
6. 経時的なリグレッションを追跡する
実行ごとに results.json を保存し、リリース間でプラグインごとの攻撃成功率を比較します。OWASP LLM カテゴリのいずれかで成功率が上昇した場合は、リリース前にトリアージすべきリグレッションです。Promptfoo の --filter-failing を使うと、以前失敗したケースのみを再実行して、修正を確認できます。
promptfoo redteam run --filter-failing results.json
ツールとリソース
| リソース | リンク |
|---|---|
| Promptfoo レッドチームのドキュメント | https://www.promptfoo.dev/docs/red-team/ |
| Promptfoo レッドチームの設定 | https://www.promptfoo.dev/docs/red-team/configuration/ |
| Promptfoo の CI/CD 統合 | https://www.promptfoo.dev/docs/integrations/ci-cd/ |
| Promptfoo の MITRE ATLAS マッピング | https://www.promptfoo.dev/docs/red-team/mitre-atlas/ |
| DeepTeam(Confident AI) | https://github.com/confident-ai/deepteam |
| DeepTeam のドキュメント | https://www.trydeepteam.com/docs/getting-started |
| LLM アプリケーション向け OWASP Top 10 | https://genai.owasp.org/ |
プラグイン/戦略リファレンス
| Promptfoo の項目 | 種類 | 対応先 |
|---|---|---|
owasp:llm | プリセット | OWASP LLM Top 10 テストスイート |
owasp:agentic | プリセット | OWASP Agentic の脅威 |
prompt-extraction | プラグイン | LLM07 システムプロンプトの漏えい |
pii:direct | プラグイン | LLM06 機密情報の開示 |
harmful | プラグイン | 有害なコンテンツの生成 |
jailbreak / jailbreak:composite | 戦略 | AML.T0054 LLM ジェイルブレイク |
crescendo | 戦略 | マルチターンのジェイルブレイク |
prompt-injection | 戦略 | AML.T0051 プロンプトインジェクション |
検証基準
- ターゲット、
owasp:llm、owasp:agenticプラグインを含むpromptfooconfig.yamlが作成されている。 - ジェイルブレイクとプロンプトインジェクションの戦略が有効になっている。
-
promptfoo redteam runが実行され、プラグインごとの合否レポートが生成される。 -
model_callbackを介して、同じターゲットに対して DeepTeam テストスイートが実行される。 - CI/CD ジョブで新たなレッドチームの失敗時にビルドが失敗する(ゼロ以外の終了コード)。
- リグレッション追跡のため、実行ごとに
results.jsonアーティファクトがアーカイブされる。 - OWASP カテゴリごとの攻撃成功率がリリース間で追跡される。