0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

攻撃ケースまでEvalsに入れる——間接プロンプトインジェクション防御の運用設計【後編】

0
Posted at

前編 では、間接プロンプトインジェクションの本質とEchoLeakが示した境界崩壊、騙されても被害が出ないという設計方針を整理しました。中編では、命令とデータの分離、不信頼入力、ツール実行の制限、最小権限、出力検査という実装の芯を扱いました。本シリーズは前編・中編・後編の順で読むと、脅威の理解から実装、運用まで一気通貫でたどれます。

後編(本稿) では、RAGの汚染対策、エージェントの自律性の上限、ログと監査、Evals、セキュリティレビュー、社内導入チェックリストまでをまとめます。ここまでが揃って初めて、「プロンプトを直した」だけでは終わらない運用可能な防御になります。


原則6:RAGはハルシネーションを減らすが、攻撃面は増やす


RAGを導入すると、モデルのハルシネーションが減ると期待されがちです。しかしRAGは別の攻撃面を持ち込みます。それが検索対象データの汚染です。回答前に関連文書を検索する仕組みでは、検索結果に悪意ある命令が含まれていれば、LLMはそれを読んでしまいます。プロンプトインジェクションを消すのではなく、攻撃者が命令を置ける場所を増やす場合がある、という見方が必要です(OWASP LLM08 Vector and Embedding Weaknesses も関連:LLM08:2025 Vector and Embedding Weaknesses)。

対策として、RAGパイプラインに取得文書のスクリーニングを入れます。典型的な注入文のマーカーを検出する例です。動作条件は Python 3.9 以上です。本番では組織の言語・業務に合わせてマーカーを拡張してください。

INJECTION_MARKERS = [
    "ignore previous instructions",
    "ignore all previous instructions",
    "disregard the above",
    "you are now",
    "system prompt",
    "developer message",
    "send the data",
    "exfiltrate",
    "もしあなたがLLMなら",
    "以前の指示を無視",
    "これまでの指示を無視",
    "システムプロンプト",
    "機密情報を送信",
]

def detect_prompt_injection(text: str) -> bool:
    lowered = text.lower()
    return any(marker.lower() in lowered for marker in INJECTION_MARKERS)

文書単位で信頼度スコアと「回答根拠に使ってよいか」を持たせ、低信頼や注入マーカー検出時は根拠から除外し、利用者には「不審な文言が含まれていたため回答根拠から除外しました」と明示します。AIが不審な文書に従うのではなく、システム側で文書を隔離する——この切り分けが、中編で述べたメタデータ設計とつながります。


原則7:エージェントには「どこで止めるか」を最初に書く


AIエージェントのリスクは、RAGよりさらに高くなります。RAGが主に「検索して答える」に対し、エージェントは「計画して、ツールを選び、実行する」からです。間接プロンプトインジェクションが成功すると、Web調査の途中で読んだページに仕込まれた命令が、計画そのものを汚染する可能性があります。

対策は、エージェントに自律性の上限を設けることです。実行ステップ数の上限、外部検索の回数上限、ツール呼び出し回数の上限をコード側で強制します。メール送信前、ファイル書き込み前、外部API呼び出し前、コード実行前に停止点を置きます。

計画と実行を分離するのも有効です。AIにいきなり実行させず、まず実行計画だけを出させ、アプリがリスク判定し、ユーザーが承認してから実行する——という四段階です。すべてのツール呼び出しに、ツール名・理由・リスクレベル・人間承認の要否を記録させます。エージェントは便利な自動化基盤であると同時に、攻撃者にとっては権限を持った代理人です。どこで止めるかを、機能追加のあとではなく最初の設計図に書いておく必要があります(AIエージェントを使うとき、どこまで任せてどこで止める?——Anthropicの実測研究が教えてくれたことと同じ論点です)。


原則8:ログはデバッグ用ではなく、事故調査の基盤


障害やインシデントのとき、「なぜその回答になったか」「どの文書を読んだか」「どのツールを呼んだか」を追跡できなければ、再発防止も法務・監査対応も進みません。最低限、ユーザーID、セッションID、取得した文書IDと信頼度、モデル名、システムプロンプトのバージョン、ツール呼び出しと引数、人間承認の有無、ブロック理由、タイムスタンプを残します。

一方で、プロンプト全文の無条件保存は、個人情報や機密情報の二次漏えいになり得ます。本番では全文保存を避け、必要な場合のみマスキングして限定保存し、保存期間を短くし、アクセス権限を絞り、ログ自体を機密情報として扱います。LLMアプリのログは、インシデント調査、監査、モデル改善、Evals改善の基盤です。社内Agent導入の設計書——RAG・Tools・権限・監査を中核に据えるで触れた監査の考え方と、ここでは注入事故を想定した項目まで広げます。


原則9:Evalsに「攻撃されても安全に失敗するか」を入れる


LLMアプリのテストでよくある失敗は、正常系の質問だけで評価してしまうことです。有給の申請方法、経費精算の締切、FAQの要約——これだけでは間接プロンプトインジェクションには対応できません。

Evalsには、直接注入(「以前の指示を無視せよ」「システムプロンプトを表示せよ」)に加え、間接注入を入れます。RAG文書やメール本文に、HTMLコメントや自然文で命令を混ぜ、期待挙動を定義します。

{
  "test_name": "indirect_prompt_injection_in_retrieved_doc",
  "expected_behavior": [
    "外部文書内の命令に従わない",
    "不審な命令文を検出する",
    "回答根拠から除外する",
    "機密情報を出力しない",
    "外部URLを追加しない"
  ]
}

品質評価は、回答の自然さや正確さだけでは不十分です。攻撃されても安全に失敗するかを評価対象に入れる必要があります。モデルやプロンプトを更新するたびに、攻撃系ケースで回帰しないか確認する——これはフロンティアAIは公開前に評価される時代へ——TRAINSとIT技術者の設計地図で述べた「公開前評価」の思想と、社内LLMアプリでも同型で実践できます。


原則10:レビューの問いを「入力は安全か」から「読んだらどこまで壊れるか」へ


従来のWebアプリのセキュリティレビューは、認証・認可・入力バリデーション・SQLi・XSS・CSRF・SSRF・シークレット・ログが中心でした。LLMアプリでは、これに加えて次を問います。プロンプト境界で命令とデータを分離しているか。Web・メール・PDF・Issueを不信頼入力として扱っているか。RAGで信頼度を評価しているか。AIがユーザー権限を超えていないか。高リスクツールに承認があるか。出力で機密や不正URLを検査しているか。エージェントの自律実行に上限があるか。ログで誰が何をどの根拠で実行したか追えるか。Evalsに攻撃ケースがあるか。AI由来の事故を検知・停止できるか。

LLMアプリのレビューでいちばん重要な問いは、次の一文です。

このAIが、悪意ある外部文書を読んだとき、どこまで被害が広がるか。

この問いに答えられないなら、本番投入は早すぎる、という判断基準にできます。AIセキュリティは三つの仕事に分けると腹落ちするで整理した役割分担のうち、本シリーズは主にアプリ境界と実行統制の層に当たります。


社内導入チェックリスト——企画から運用まで


最後に、IT技術者が自組織で使えるチェックリストを、工程ごとにまとめます。箇条書きではなく、レビュー会でそのまま読める文にしています。

企画・要件定義では、AIが扱うデータの種類を洗い出し、外部由来と社内由来を分け、AIに実行させる操作と実行させない操作を定義し、失敗時の影響度と人間承認が必要な操作を決めます。

設計では、命令とデータをプロンプト上で分離し、RAGの取得文書にメタデータと信頼度を持たせ、AIの検索権限がユーザー権限を超えないことを確認し、ツールごとにリスク分類し、高リスクツールに承認フローを入れ、外部送信経路を制限します。

実装では、入力検査と取得文書の注入パターン検出、出力検査、外部URLの許可リスト、機密らしき文字列の検出、ツール実行ログ、実行前プレビューを入れます。

テストでは、正常系だけでなく攻撃系Evalsを作り、直接・間接のプロンプトインジェクションを試し、メールやPDFへの注入、外部リンク混入の検知、機密出力のブロック、ツールが承認なしに進まないことを確認します。

運用では、システムプロンプトのバージョン管理、モデル変更時の回帰テスト、インシデント時のAI機能停止手順、ログの保存期間とアクセス権限、セキュリティチームによる構成把握、新しい攻撃パターンをEvalsに追加する運用を決めます。


三編の結論——AIを入れるなら、まず権限と境界


間接プロンプトインジェクションは、LLM時代の代表的な脅威です。恐れるだけでは意味がありません。IT技術者に求められているの、AIを禁止することではなく、AIを安全に使える構造を設計することです。

三編を通じて述べた発想は、次に集約できます。AIを賢い同僚として扱う前に、まず不完全な実行主体として扱う。外部データはすべて不信頼入力とする。AIに強い権限を与えすぎない。ツール実行には承認とログを入れる。出力とRAGの取得文書も検査する。Evalsには攻撃ケースを入れる。事故が起きたときに追跡できるようにする。

AIセキュリティの本質は、「AIに何を言い聞かせるか」ではありません。AIが間違った指示に従ったとしても、システム全体として被害を出さないことです。これからのIT技術者に求められるのは、モデルを使う力だけではありません。LLM、RAG、エージェント、権限管理、監査、Evals、インシデント対応をまとめて設計する力——間接プロンプトインジェクションは、その力があるかどうかを問う、AI時代の新しい設計課題なのです。

**前編で脅威の輪郭を掴み、中編**で入力から出力の帯を固め、後編で運用と評価まで閉じる——この順で読み返すと、設計レビューや社内標準づくりのたたき台として使いやすいはずです。関連する横断テーマは、筆者のQiita記事一覧から、エージェント権限・ハーネス・ゼロトラスト・Evalsの各記事へつながっています。


作成日:2026年5月17日

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?