はじめに
LLM を組み込んだアプリを作ると、必ずついて回るのが プロンプトインジェクション です。ユーザー入力や外部から取り込んだテキスト(Web ページ・PDF・ツールの出力)に紛れ込んだ悪意ある指示が、システムプロンプトを上書きしたり、本来出してはいけない情報を吐き出させたりする攻撃です。OWASP の Top 10 for LLM Applications でも、プロンプトインジェクション(LLM01)は最上位の脅威として挙げられ続けています。
問題は「自分のアプリがどれくらい耐えられるのか」を手で確かめるのが大変なこと。DAN 系ジェイルブレイク、Base64 エンコード回避、データ抽出……と攻撃の種類は膨大で、ひとつずつ手打ちで試すのは現実的ではありません。
この記事では、Praetorian が公開した OSS の LLM 脆弱性スキャナ Augustus を使い、API キー不要・ローカルの Ollama モデル相手に プロンプトインジェクション耐性を自動スキャンするところまでを手を動かして試します。
この記事で学べること
- Augustus が何をするツールで、NVIDIA の garak と何が違うのか
-
go installから最初のスキャンまでの最短手順 - ローカル LLM(Ollama)を相手に、API 課金ゼロで攻撃プローブを流す方法
- スキャン結果(HTML / JSONL レポート)の読み方と、CI に組み込む際の勘所
対象読者
- LLM をアプリに組み込んでいて、セキュリティ評価の入口を探している方
- プロンプトインジェクション対策の「効果測定」を自動化したい方
前提環境
- OS: macOS / Linux
- Go: 1.25.3 以降(Augustus のビルドに必要)
- Ollama: ローカル LLM を動かす場合(任意・API キー不要で試すために使用)
TL;DR
- Augustus は 210+ の攻撃プローブ・28 の LLM プロバイダ・90+ のディテクター を備えた Go 製の LLM 脆弱性スキャナ(Apache 2.0)。
- NVIDIA の garak にインスパイアされた Go ネイティブ再実装 で、単一バイナリで動くのが強み。
-
go install一発で入り、augustus scan <provider> --probe <probe> --detector <detector>でスキャンできる。 - Ollama を使えば API キーなし・課金ゼロ でローカルモデルに全プローブを流せるので、まずはここから試すのが安全。
- 出力は table / JSON / JSONL / HTML。HTML レポートを CI のアーティファクトに残すと回帰検知に使える。
Augustus とは
Augustus は、LLM に対する敵対的攻撃(プロンプトインジェクション・ジェイルブレイク・データ抽出など)を自動でテストする脆弱性スキャナです。Praetorian の発表記事によると、主なスペックは次のとおりです。
| 項目 | 内容 |
|---|---|
| ライセンス | Apache 2.0 |
| 実装言語 | Go(単一バイナリ) |
| 攻撃プローブ | 210+(プロンプトインジェクション・ジェイルブレイク・エンコード回避・データ抽出ほか) |
| 対応プロバイダ | 28(OpenAI / Anthropic / Azure / AWS Bedrock / Google Vertex AI / Ollama など) |
| ディテクター | 90+(パターンマッチ・LLM-as-a-judge・HarmJudge・Perspective API) |
| 出力形式 | table / JSON / JSONL / HTML |
攻撃手法のカバー範囲も広く、DAN(v11.0 まで)・AIM・Grandma exploit などのジェイルブレイク、Base64・ROT13・モールス信号・leet speak といった 16 種以上のエンコード回避、GCG・AutoDAN・PAIR・TAP などの最適化系攻撃、RAG ポイズニングやコンテキストオーバーフローまで含まれます(GitHub README より)。
garak との違い
「LLM の脆弱性スキャナ」と聞いて NVIDIA の garak を思い浮かべた方も多いはずです。Augustus は garak にインスパイアされた Go ネイティブ再実装 と公式に位置づけられており、README では 210+ プローブ(garak は 160+) とプローブ数で上回る一方、対応プロバイダは 28(garak は 35+) とやや少ないと説明されています。
実務上の最大の差は 配布のしやすさ です。garak は Python 製でランタイムや依存解決が必要ですが、Augustus は Go の単一バイナリなので go install で入り、CI イメージにバイナリを1つ置くだけで動きます。プローブ/ディテクター/Buff(入力変換)という設計思想は garak 由来なので、garak を触ったことがあれば概念はそのまま通用します。
やってみる
ステップ1: インストール
Go 1.25.3 以降が入っていれば、go install 一発です。
go install github.com/praetorian-inc/augustus/cmd/augustus@latest
ソースからビルドする場合は以下です。
git clone https://github.com/praetorian-inc/augustus.git
cd augustus
make build
導入できたら、利用可能なプローブとディテクターの一覧を確認します。
augustus list
ここで「どんな攻撃が用意されているか」をざっと眺めておくと、後でスキャン対象を絞るときに役立ちます。
ステップ2: ローカルモデル(Ollama)を相手に流す
いきなり本番の OpenAI / Anthropic API に全プローブを撃ち込むと、課金もレート制限も気になります。まずは API キー不要・課金ゼロのローカル LLM で試すのが安全 です。Ollama に小さめのモデルを用意します。
# Ollama に軽量モデルを取得
ollama pull llama3.2:3b
そのうえで、Augustus から Ollama のチャットジェネレーターに対して全プローブを流します。
augustus scan ollama.OllamaChat \
--all \
--config '{"model":"llama3.2:3b"}'
--all は全プローブを実行するフラグです。最初は時間がかかるので、特定の攻撃カテゴリだけ試したいときは単一プローブを指定します。
augustus scan ollama.OllamaChat \
--probe dan.Dan_11_0 \
--detector dan.DAN \
--config '{"model":"llama3.2:3b"}' \
--verbose
<provider>.<Generator> と <probe-family>.<Probe> の組み合わせで対象を指定する、という形がつかめれば応用は効きます。
--configに渡す JSON のキーはプロバイダごとに異なります。augustus listの出力やプロバイダのドキュメントで、モデル名の指定方法を確認してから流しましょう。
ステップ3: 範囲を絞る・出力を残す
複数の攻撃ファミリーをまとめて流したいときは glob パターンが使えます。
augustus scan ollama.OllamaChat \
--probes-glob "dan.*,goodside.*,grandma.*" \
--detectors-glob "*" \
--config '{"model":"llama3.2:3b"}'
結果はデフォルトでターミナルに table 表示されますが、レポートをファイルに残す ことで後から差分を追えます。JSONL とあわせて HTML レポートを出力してみます。
augustus scan ollama.OllamaChat \
--all \
--config '{"model":"llama3.2:3b"}' \
--timeout 60m \
--output comprehensive-scan.jsonl \
--html comprehensive-report.html
--output で機械可読な JSONL、--html で人間が読むレポートを同時に得られます。JSONL は「どのプローブで・どのディテクターが・何件ヒットしたか」を1行ずつ持つので、CI で集計してしきい値判定するのに向いています。
ステップ4: 本番プロバイダに向ける
ローカルで挙動を確認したら、実際の API に向けます。OpenAI を対象にする例です(API キーは環境変数で渡します)。
export OPENAI_API_KEY="sk-..."
augustus scan openai.OpenAI \
--probe dan.Dan_11_0 \
--detector dan.DAN \
--verbose
本番 API に
--allを流すと、数百プローブ × 複数生成で API コストとレート制限 に直撃します。最初は単一プローブや glob で範囲を絞り、コスト感をつかんでから広げてください。スキャン対象は 必ず自分が管理・許可を得ているエンドポイント に限定します。
結果をどう活かすか
Augustus が見せてくれるのは「どの攻撃で・どのくらいすり抜けたか」という攻撃成功率です。スコアが高いカテゴリは、アプリ側の防御を厚くする優先度が高い、というシグナルになります。具体的には次のような対策と組み合わせます。
- 入力/出力のフィルタリング: 危険なパターンを検出してブロックする層を、モデルの手前と後ろに置く。
- システムプロンプトの堅牢化: 役割と禁止事項を明示し、外部テキストを「データ」として扱うよう指示する。
- ツール権限の最小化: エージェントがツールを呼べる場合、プロンプトインジェクション経由のツール悪用を想定して権限を絞る(OWASP でもエージェント文脈の最優先リスク)。
そして重要なのは、Augustus を一度きりで終わらせない ことです。HTML / JSONL レポートを CI のアーティファクトとして保存し、プロンプトやモデルを変えるたびにスキャンを回せば、「対策を入れたら本当にスコアが下がったか」「モデルを差し替えたら耐性が落ちていないか」を回帰テストとして継続的に確認できます。
全プローブのスキャンは時間がかかるため、CI では PR ごとに代表的なプローブの glob を流し、夜間ジョブで
--allを回す、といった二段構えが現実的です。
ハマりポイント
Go のバージョン
go install がエラーになる場合、まず Go のバージョンを確認してください。Augustus は Go 1.25.3 以降 を要求します(README 記載)。古い Go ではビルドが通りません。
--config のキー名
プロバイダごとに --config の JSON キーは異なります。Ollama では {"model":"llama3.2:3b"} のようにモデル名を渡しますが、他プロバイダでは別のキーが必要なことがあります。augustus list の出力を確認してから指定しましょう。
まとめ
-
Augustus は、garak の設計思想を Go の単一バイナリに落とし込んだ LLM 脆弱性スキャナ。
go installで入り、すぐに使える。 - Ollama を使えば API キーなし・課金ゼロ で全プローブを試せるので、まずローカルで挙動をつかむのが安全な入口。
- JSONL / HTML レポートを CI に残し、プロンプトやモデルを変えるたびに回す回帰テスト にすることで、プロンプトインジェクション対策の効果を継続的に測れる。
「対策したつもり」で止めず、攻撃を自動で撃ち込んで数値で確かめる——その入口として Augustus は手軽な選択肢です。
参考リンク
- Augustus — GitHub リポジトリ — インストール・CLI 使用例・garak との比較
- Introducing Augustus: Open Source LLM Prompt Injection Tool — Praetorian — スペック・攻撃カバレッジ
- NVIDIA garak — Augustus のインスピレーション元となった Python 製スキャナ
- OWASP Top 10 for LLM Applications — プロンプトインジェクション(LLM01)の位置づけ