AIエージェントがWeb、メール、ドキュメントを読み、そのままToolを実行できるほど、Prompt Injectionへの備えは重要になります。対策の軸は、入力を完全に判定することではありません。外部データを命令と分け、Agentが使える権限を絞り、重要な操作を確認できる設計にします。
まず結論:4つの層で意図しない動作の影響を限定する
| 層 | 確認すること | 目的 |
|---|---|---|
| 外部データ | 外部テキストを命令として直接使わず、必要な値だけ構造化する | 制御フローへの影響を減らす |
| 権限 | 使えるTool・データ・操作を必要な範囲に限定する | 影響範囲を狭くする |
| 実行 | 重要な操作は承認を挟む | 自動で確定させない |
| 隔離・監視 | sandbox、通信制御、Toolログ、evalを組み合わせる | 異常を検知し改善できるようにする |
OpenAIの現行ガイダンスも、単一の入力判定だけではなく、アクセス制限、確認、隔離、監視を重ねる考え方を示しています。まずはAgentが何を読めるかだけでなく、読んだ情報をもとに何を実行できるかを確認します。
Prompt Injectionとは?外部データの指示に影響されるリスク
用語解説:Prompt Injection
Webページ、メール、ドキュメント、ユーザー入力などに含まれる指示によって、AIが本来の目的から外れた動作へ誘導されるリスクです。外部情報を読むAgentでは、第三者が作成した内容が会話コンテキストへ入るため、外部データの扱いを明確にします。
ポイントは、外部から取得した本文を「参考データ」として扱い、ユーザーや開発者が与えた目的と同じ権限を持つ命令として扱わないことです。
(AIエージェントがタスクを実行する仕組みを概念から確認したい場合については『ChatGPT Agentとは?AI秘書が仕事を“代行”する時代が来た』をご参照ください)
1:外部データを命令経路から分ける
外部テキストをそのまま次の処理へ渡すのではなく、後段が必要とする項目だけを固定した形式へ抽出します。自由文がTool選択や次の処理を直接決める範囲を減らします。
- ユーザーの目的と外部本文を別の入力として扱う
- 必要な値だけを固定schemaへ抽出する
- 外部本文そのものに次の処理を決めさせない
- 必要情報が不足している場合は確認へ戻す
入力判定だけで安全を保証しようとしない点も重要です。OpenAIが2026年3月に公開したAgent向けガイダンスでは、実際のPrompt Injection対策は入力フィルタだけに依存できず、影響を制約するシステム設計が必要だと説明されています。
2:Agentへ渡すToolとデータを必要最小限にする
調査だけを行うAgentへ、更新や削除を行うToolまで渡す必要はありません。タスクに必要な能力だけを公開し、参照範囲も必要なデータへ限定します。
- 読む処理と書き込み処理を分ける
- そのタスクに不要なToolを公開しない
- 参照できるデータ範囲を必要な範囲に限定する
- 接続先を制約できる場合は必要な範囲へ絞る
この設計はAgentの能力を弱くするためではなく、判断がずれた場合でも影響が必要な範囲を超えないようにするためです。
3:重要なTool実行は承認できるようにする
外部サービスへの送信、削除、権限変更など、結果への影響が大きい操作は自動確定させず、実行前に対象と内容を確認できるようにします。MCPやConnectorを使う場合も、重要な操作に承認を設定できるか確認します。
- 実行するToolと操作内容を表示する
- 変更対象や送信先を確認する
- 最初の依頼目的から外れた操作は止める
- 重要な操作を承認なしで確定させない
(MCPがAIと外部Toolをどう接続するのかを確認したい場合については『MCPサーバーとは?仕組みと使い方』をご参照ください)
4:隔離・監視・evalを組み合わせる
権限と承認に加えて、実行環境の隔離やログも重ねます。OpenAIの現行Agent向けドキュメントでは、構造化出力、確認、guardrail、隔離、trace/evalを組み合わせる考え方が示されています。
- 実行環境をsandboxなどで分離する
- 外部通信を必要な範囲に限定する
- Tool呼び出しと承認結果を追跡できるようにする
- 目的と無関係なTool選択を検知できるようにする
- model・Tool・promptを変えたときにevalを再実行する
導入前チェック:外部データからTool実行までを確認する
| 確認項目 | 確認すること |
|---|---|
| 外部Web・メール・文書を読む | 外部本文が直接Tool選択を決めていないか |
| 業務データへアクセスする | 必要なデータ範囲だけに限定しているか |
| 書き込み系Toolを使う | 重要操作に承認があるか |
| MCP・Connectorを使う | 利用Toolと承認条件を制約できているか |
| 自動処理を継続する | Toolログと停止経路を持っているか |
| modelやToolを更新する | 同じ評価条件で再確認できるか |
「入力を判定できるか」だけを見るのではなく、外部データが入ったあと、どの操作まで到達できる設計なのかを順番に確認すると抜けを見つけやすくなります。
まとめ:外部データを信用しすぎず、Tool実行を狭くする
- 外部コンテンツは命令ではなくデータとして扱う
- 自由文をそのまま後段へ流さず必要な情報だけ構造化する
- Agentへ渡すToolとデータ権限を必要最小限にする
- 重要操作は承認を挟む
- sandbox、通信制御、ログ、evalを組み合わせる
- 入力判定だけで十分という前提を置かない
まず現在のAgentについて、外部データを読む入口とToolを実行する出口を書き出し、その間に権限・承認・隔離のどの制御があるか確認してみてください。