プロンプトインジェクション解説
プロンプトインジェクションは、AIアプリにおける最も本質的なセキュリティリスクです。これは、モデルが読み込む信頼できないコンテンツに命令が含まれている場合に発生し、モデルはそれをあなたから来た命令であるかのように従ってしまいます。モデルは「処理すべきデータ」と「従うべきコマンド」を確実に見分けることができません — どちらもすべて単なるテキストだからです。
2つのタイプ
- 直接インジェクション — ユーザーが敵対的な命令(「ルールを無視して…」)を入力します。モデルを一般公開するアプリにとっての懸念事項です。
- 間接インジェクション — こちらが危険なタイプです。悪意ある命令が、エージェントが取得するコンテンツに隠れています。Webページ、PDF、メール、コードコメント、APIレスポンス、カレンダーの招待などです。ユーザーはそれを目にすることはなく、エージェントがそれを読み込んで行動してしまいます。
なぜ難しいのか
完璧なフィルターは存在しません。モデルはコンテキスト内の命令に従うように作られており、注入されたテキストもまさにそのコンテキスト内に存在します。そのため、防御は単なる検知ではなく、被害範囲(ブラストラディウス)を制限することが中心となります。
防御策(重ねて適用する)
- 最小権限。 エージェントが本当に被害を与えられるのは、強力なツールを持っている場合だけです。ツールの範囲を厳しく絞り、リスクの高いアクションは人間の承認を経るようにゲートを設けましょう。エージェントのセキュリティ確保を参照してください。
- 取得したコンテンツはデータとして扱う。 信頼できないコンテンツを明確に(例えば区切り文字で)囲み、その中にあるものはすべて分析対象の情報であり、決して従うべき命令ではないとモデルに指示します。
- シークレットを信頼できない入力と混ぜない。 エージェントがあなたのシークレットを読み取れ、かつ攻撃者が制御するコンテンツを読み取れ、かつネットワーク通信を行えるなら、それは情報流出の三角形(exfiltration triangle)です — そのうちの一辺を断ち切りましょう。
- 不可逆的・機微なアクション(メール送信、金銭の支出、削除)には人間を介在させる(ヒューマン・イン・ザ・ループ)。
- 出力を監視・制約する(例えば、エージェントが通信できるドメインを許可リスト化する)。
:::warning エージェントが読み込むコンテンツはすべて敵対的である可能性があると想定する あなたの信頼境界の外から来るメール、Webページ、ドキュメントは、デフォルトで敵対的である可能性があるものとして扱うべきです。 :::