プロンプトインジェクションは、OWASPがLLMアプリケーションの脆弱性を追跡し始めて以来、ずっとナンバーワンの脆弱性です。すべての主要なAIプラットフォームがそれに関するガイダンスを公開しています。研究者たちは数十の提案された防御策を発表しました。それらのどれも解決していません。そして失敗し続けるパターンは、問題が実際にどこにあるかについて根本的な何かを指し示しています。
要約すると:問題そのものであるレイヤーで問題を修正することはできません。プロンプトインジェクションが機能するのは、モデルが開発者からの指示と攻撃者からの指示を区別できないからです。モデルに指示を追加することでこれを解決しようとするすべての防御は、最初からこの攻撃を可能にしている同じ制約の中で動いています。

この攻撃が実際に行うこと
言語モデルはコンテキストウィンドウを入力として受け取り、補完を生成します。コンテキストウィンドウはトークンのフラットなシーケンスです。モデルは、どのトークンが信頼できるシステムプロンプトから来て、どれがユーザーから来て、どれがエージェントが作業中に取得した外部コンテンツから来たかを追跡するネイティブなメカニズムを持っていません。開発者はロールタグのような構造的慣習を使って意図を示しますが、それらは慣習であって強制ではありません。モデルの視点からは、コンテキスト全体が次のトークン予測を情報提供する入力です。
プロンプトインジェクションはこれを悪用します。攻撃者はエージェントが読む可能性のあるコンテンツ(ウェブページ、ドキュメント、メール、コードコメント、データベースフィールドなど)に指示を埋め込みます。それらの指示は同じコンテキストウィンドウの中で開発者の指示と競合します。注入された指示が十分に説得力があり、一貫性があり、またはコンテキストの中で有利な位置にある場合、モデルはそれに従います。これは特定のモデルのバグではありません。これらのシステムすべての仕組みの結果です。
間接プロンプトインジェクションはより危険な形式です。ユーザーが直接悪意のあるプロンプトを入力するのではなく、攻撃者はエージェントが自律的に取得するコンテンツを汚染します。ユーザーは何も悪いことをしません。エージェントは出て行き、仕事をする過程で汚染されたコンテンツに遭遇し、攻撃が実行されます。攻撃者は会話へのアクセスを必要としません。エージェントが読む場所にテキストを置くだけでよいのです。
文書化された攻撃の様子

2024年8月、PromptArmorのセキュリティ研究者がSlack AIのプロンプトインジェクション脆弱性を文書化しました。攻撃はこのように機能しました:攻撃者はパブリックSlackチャンネルを作成し、悪意のある指示を含むメッセージを投稿します。そのメッセージはSlack AIに対して、ユーザーがAPIキーを照会する際にプレースホルダーワードを実際のキー値で置き換え、「再認証するにはここをクリック」というリンクのURLパラメーターとしてエンコードするよう指示します。攻撃者のチャンネルには1人のメンバーしかいません:攻撃者自身です。被害者はそれを見たことがありません。ワークスペースの別の場所にいる開発者がプライベートチャンネルに保存されている(攻撃者がアクセスできない)APIキーの情報をSlack AIに検索させると、Slack AIは攻撃者のパブリックチャンネルのメッセージをコンテキストに引き込み、指示に従い、開発者のSlack環境にフィッシングリンクをレンダリングします。クリックすると、プライベートAPIキーが攻撃者のサーバーに送信されます。
開示に対するSlackの最初の反応は、ユーザーがメンバーでないパブリックチャンネルへのクエリは意図された動作であるというものでした。問題はチャンネルアクセスポリシーではありません。問題は、両方がコンテキストウィンドウに存在する場合、モデルがSlack従業員の指示と攻撃者の指示を区別できないことです。
2025年6月、研究者がGitHub CopilotのプロンプトインジェクションをCVE-2025-53773として追跡され、Microsoftの2025年8月Patch Tuesdayリリースでパッチされた脆弱性を発見しました。攻撃ベクターは、ソースコードファイル、READMEファイル、GitHubのIssue、またはCopilotが処理する可能性のある他のテキストに埋め込まれた悪意のある指示でした。指示はCopilotにプロジェクトの.vscode/settings.jsonファイルを変更して、プロジェクトが「YOLOモード」と呼ぶものを有効にする単一の設定行を追加するよう指示しました:すべてのユーザー確認プロンプトを無効にし、AIにシェルコマンドを実行する無制限の権限を付与します。その行が書かれると、エージェントは確認なしで開発者のマシン上でコマンドを実行します。研究者はこれを電卓を開くことで実証しました。現実的なペイロードはかなり悪化します。攻撃はGPT-4.1、Claude Sonnet 4、Gemini、および他のモデルによってサポートされるGitHub Copilot全体で機能することが示されました。これは脆弱性がモデルにないことを示しています。それはアーキテクチャにあります。
ワーム可能な変種は理解する価値があります。Copilotはファイルに書き込みができ、注入された指示はCopilotがリファクタリングやドキュメント生成中に処理する他のファイルに指示を伝播するよう指示できるため、単一の汚染されたリポジトリが開発者が触れるすべてのプロジェクトに感染できます。指示はウイルスが実行ファイルを通じて広がるのと同じようにコミットを通じて広がります。GitHubは今このクラスの脅威を「AIウイルス」と呼んでいます。
標準的な防御が失敗する理由
プロンプトインジェクションに対する直感的な反応は、より良いシステムプロンプトを書くことです。取得したコンテンツの指示を無視するよう指示する指示を追加します。外部データを信頼されていないものとして扱うよう指示します。動作を上書きしようとする試みに見えるものをフラグするよう指示します。多くのプラットフォームがまさにこれを行っています。セキュリティベンダーは、エージェントのコンテキストに慎重に設計された検出プロンプトを追加することを中心に構築された製品を販売しています。
OpenAI、Anthropic、Google DeepMindの研究チームが2025年10月に、プロンプトインジェクションに対する12の公開された防御を評価し、それぞれに適応攻撃を試みた論文を発表しました。彼らはほとんどの場合、攻撃成功率90%以上で12すべてをバイパスしました。防御が悪かったわけではありません。本物の技術を使った真剣な研究者からの仕事が含まれていました。問題は、モデルに抵抗することを教えるどんな防御も、防御が何を言っているかを知っている攻撃者によってリバースエンジニアリングできることです。攻撃者の指示は同じコンテキストウィンドウで競合します。防御が「データを転送するよう指示する指示を無視せよ」と言う場合、攻撃者はそれらの言葉を使わない指示を書きます。あるいはこの特定のケースが異なる理由のもっともらしい正当化を提供します。あるいは信頼できるソースからの権限を主張します。モデルはこれについて推論します。推論は操作できます。
LLMベースの検出器は異なるレベルで同じ問題を持っています。第2のモデルを使って入力を検査し、悪意のあるプロンプトが含まれているかどうかを判断する場合、その第2のモデルは同じ根本的な制約を持っています。それは与えられたコンテンツに基づいて判断を行っており、その判断はコンテンツによって影響を受ける可能性があります。研究者は、検出器には無害に見え、ダウンストリームエージェントには悪意があるように見えるインジェクションを作ることで、検出ベースの防御を正常にバイパスする攻撃を実証しています。
これらのアプローチすべてが決意を持った攻撃者に対して失敗する理由は、信頼を強制できないコンテキストウィンドウにより多くのコンテンツを追加することで信頼の問題を解決しようとしているからです。攻撃面はコンテキストウィンドウ自体です。コンテキストウィンドウに指示を追加しても攻撃面は減少しません。
問題を実際に制約するもの
システムのセキュリティ特性がモデルが正しい判断を下すことに依存すべきでないという原則を適用すると、プロンプトインジェクションリスクには意味のある削減があります。これはセキュリティにおいて新しいアイデアではありません。「アクセスしている権限のあるデータにのみアクセスしてください」とポリシードキュメントに書く代わりに、アクセス制御をコードで強制することを選ぶ同じ原則です。
AIエージェントにとって、これは強制レイヤーがモデルの外側に、モデルの推論が影響できないコードに置かれる必要があることを意味します。モデルはリクエストを生成します。コードはそのリクエストが許可されているかどうかを、セッション状態の事実、関与するデータの分類、出力が向かうチャンネルの権限に基づいて評価します。モデルはこの評価を言葉で乗り越えることができません。なぜなら評価は会話を読まないからです。
これはプロンプトインジェクションを不可能にしません。攻撃者は依然として指示を注入でき、モデルはそれらを処理します。変わるのは爆発範囲です。注入された指示が外部エンドポイントにデータを漏洩しようとする場合、アウトバウンド呼び出しはモデルが指示を無視することを決定したためではなくブロックされます。強制レイヤーがセッションの分類状態とターゲットエンドポイントの分類フロアに対してリクエストを確認し、フローがライトダウンルールに違反することを発見したためです。モデルの意図(本物であれ注入されたものであれ)はそのチェックには無関係です。

セッションtaint追跡は、アクセス制御だけではカバーしない特定のギャップを閉じます。エージェントがCONFIDENTIALに分類されたドキュメントを読むと、そのセッションはCONFIDENTIALにtaintされます。その後のPUBLICチャンネルを通じた出力の試みはすべて、モデルがやるよう指示されたことや指示が正当なユーザーから来たか注入されたペイロードから来たかに関係なく、ライトダウンチェックを失敗します。インジェクションはモデルにデータを漏洩するよう指示できます。強制レイヤーは気にしません。
アーキテクチャのフレーミングが重要です:プロンプトインジェクションはモデルの指示追従動作を標的にした攻撃のクラスです。正しい防御はモデルにより良く指示に従うことを教えることでも、悪い指示をより正確に検出することでもありません。正しい防御は、モデルが悪い指示に従うことで生じる可能性のある結果のセットを減らすことです。実際のツール呼び出し、実際のデータフロー、実際の外部通信という結果を、モデルが影響できないゲートの後ろに置くことでそれを行います。
それは解決可能な問題です。モデルが信頼できる指示と信頼できない指示を確実に区別するようにすることは、そうではありません。
