実務担当者向け

プロンプトインジェクションは防げるのか — 入力検査だけでは止まらない理由

この記事の結論
  • 命令とデータを区別できないというLLMの構造上の性質が原因で、入力検査では原理的に止まりきらない
  • 防御の主眼は「攻撃を防ぐ」から「成功しても被害が出ない設計にする」へ移す
  • 最も効くのは権限の最小化。AIに渡す権限を絞れば、乗っ取られても実行できることが減る

なぜ「防ぎきれない」と言われるのか

プロンプトインジェクションは、LLMに与える入力に指示を紛れ込ませ、開発者が意図しない動作をさせる攻撃です。

SQLインジェクションと名前は似ていますが、対策の難易度が根本的に違います。SQLでは、プレースホルダを使えば「ここはデータであって命令ではない」とデータベースに伝えられます。**LLMにはこの区別がありません。**システムプロンプトも、ユーザーの入力も、読み込んだ文書も、最終的には同じ1本のテキストとしてモデルに渡ります。

そのため「命令として解釈してはいけない部分」を構造的に指定する手段が存在しません。これが、入力検査で止めきれない理由です。

入力検査の限界

多くの実装では、危険そうな語句をフィルタする方式が最初に試されます。しかし次の理由で回避されます。

入力検査は攻撃の手間を上げる効果はあるので無駄ではありませんが、これに依存した設計は成り立ちません。

本当に危ないのは間接的な経路

自社サービスの入力欄から攻撃されるより、AIが自動で読み込む外部データに仕込まれるほうが深刻です。これを間接プロンプトインジェクションと呼びます。

想定される経路は業務システムのいたるところにあります。

この場合、**攻撃者は自社のシステムに直接触れる必要がありません。**対象の従業員に読ませる文書を1通送るだけで済みます。

発想を「防ぐ」から「成功しても困らない」へ

止めきれない前提に立つと、設計で決めるべきことが変わります。攻撃が成功したときに何が起きるかを制御するのが主眼になります。

1. 権限を最小にする(最も効果が大きい)

AIエージェントに与える権限が、そのまま攻撃者が得る権限になります。

「要約するだけのAI」が送信権限を持っていなければ、乗っ取られても情報は外に出ません。

2. 実行の前に人を挟む

取り返しのつかない操作は、AIの判断だけで完了させないようにします。

2つめは見落とされがちです。AIに「何をしようとしているか説明させる」と、その説明自体が攻撃者の制御下にあります。

3. 出力を信用しない

LLMの出力を、後続の処理がそのまま実行しない設計にします。

4. 記録を残す

どの入力に対してAIが何を実行したかを追えるようにします。攻撃が成功した後、影響範囲を特定できるかどうかがインシデント対応の成否を分けます。

ガードレールの位置づけ

入出力を検査するガードレール製品は、上記の設計を前提としたうえで上乗せする層として有効です。単体で信頼できる防御にはなりませんが、既知のパターンを弾き、明らかな異常を検知する役には立ちます。

導入する場合は「これで防げる」ではなく「攻撃の成功率を下げ、検知を早める」ものとして位置づけ、権限設計を省略しないことが重要です。

社内で説明するときの要点

経営や事業部門に説明する際、「完全には防げない」とだけ伝えると導入自体が止まりかねません。次の整理が実務的です。

  1. この攻撃はLLMの構造に由来し、製品を変えても消えない
  2. したがって、防ぐのではなく影響範囲を限定する設計にする
  3. 具体的には、AIに渡す権限を絞り、重要な操作には人の承認を挟む
  4. これは新しい考え方ではなく、従来の最小権限の原則をAIに適用しただけ

導入前の確認項目は生成AI導入セキュリティチェックリストに、社内ルールへの落とし込みは生成AIの利用規程に何を書くかにまとめています。

まとめ

この記事を読んだあとに