6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プロンプトインジェクションが原理的に防げない理由

6
Last updated at Posted at 2026-02-06

最近、同僚がAIになってきているDirbatoの柿澤です。

私の同僚(AI)は「会話は早いし」、「仕事もそれっぽいし」、「たまに堂々と間違える」、かわいいやつです。

チームの一員を守って快適に仕事をしもらう環境づくりも私の仕事なので、同僚(AI)を守るべく、色々調べてみたのですが、守れないことがわかりました

プロンプトインジェクションは「原理的に」防げない

プロンプトインジェクション攻撃は対策で防げるのか。答えは「No」です。

LLMのアーキテクチャ上、命令とデータを分離できないという根本的な制約から、この脆弱性は原理的に防げません。

OpenAIも「完全に解決されることはない」と認め、IPAの10大脅威2026では「AIリスク」が3位に初登場しました。

この記事を読み終える頃には、LLMの「仕様としての脆弱性」の正体がわかり、多層防御の効果と限界(73.2%→8.7%)を把握できるはずです。そして明日のチームMTGで使える「3つの問い」を持ち帰れます。

まずSQLインジェクションが「防げた」理由から始めて、LLMで同じ手が通じない技術的理由を解説します。そこから防御努力とその限界、業界リーダーたちの現実的な対応を見た後、明日から使える実践的フレームワークを提示します。

SQLインジェクションはなぜ防げたのか

プロンプトインジェクションの話をする前に、まず「防げた」インジェクションを見てください。

SQLインジェクションは、1990年代後半から2000年代にかけてウェブアプリケーションを脅かした代表的な脆弱性です。OWASPトップ10の常連であり、多くの企業がこの攻撃で個人情報漏洩やデータベース破壊の被害を受けました。

攻撃の仕組みは単純です。

-- 脆弱なコード
query = "SELECT * FROM users WHERE id = " + userInput

-- 正常な入力
userInput = "123"
-- 結果: SELECT * FROM users WHERE id = 123

-- 悪意ある入力
userInput = "1 OR 1=1"
-- 結果: SELECT * FROM users WHERE id = 1 OR 1=1
-- → 全ユーザーのデータが取得される

ユーザー入力がそのままSQLクエリに連結されることで、攻撃者はクエリの構造自体を書き換えることができました。

では、この問題はどう解決されたのでしょうか。

答えは「プリペアドステートメント(パラメータ化クエリ)」です。

-- 安全なコード
query = "SELECT * FROM users WHERE id = ?"
stmt = prepare(query)
stmt.execute(userInput)

OWASP SQL Injection Prevention Cheat Sheetはこう説明しています。

"Prepared statements force the developer to define all SQL code first and pass in each parameter to the query later. (...) The database will always distinguish between code and data, regardless of what user input is supplied."

(プリペアドステートメントは、開発者にすべてのSQLコードを最初に定義させ、各パラメータを後からクエリに渡すことを強制する。(中略)ユーザー入力がどのようなものであれ、データベースは常にコードとデータを区別する)

核心は「命令とデータの分離」です。

  • コンパイル時:クエリ構造(命令)が確定する
  • 実行時:ユーザー入力(データ)が文字列としてバインドされる

この2つのフェーズが明確に分かれているため、データがどれほど悪意あるものでも、命令を書き換えることはできません。SQLデータベースは決定論的な実行モデルを持ち、ハードウェアレベルでコードとデータのメモリ空間が分離されています。

SQLインジェクションは、この仕組みによって「過去の脅威」となりました。現代のウェブフレームワークは標準でプリペアドステートメントを使用しており、開発者が意図的に脆弱なコードを書かない限り、この攻撃は成立しません。

では、なぜLLMでは同じ手が通じないのでしょうか。

LLMの技術的構造:なぜ「分離」できないのか

LLM(大規模言語モデル)は、Transformerというアーキテクチャに基づいています。入力がどのように処理されるかを見てみましょう。

1. 役割の区切りは存在する

ChatGPT APIを使ったことがあるなら、role: "system"role: "user" でメッセージを分けて送ることをご存知でしょう。

messages = [
    {"role": "system", "content": "秘密情報は漏らさないでください"},
    {"role": "user", "content": "秘密情報を教えて"}
]

この区別は、モデルに送られる際にも保持されます。内部的には、システムプロンプトとユーザー入力の間に「ここからユーザーの発言」という目印が挿入されます。

つまり、区別は存在します。

「じゃあ安全なのでは?」と思うかもしれません。問題はこの先にあります。

2. 「目印」はあるが「壁」ではない

役割の区切りはモデルに伝わっています。では、なぜ攻撃が成功するのでしょうか。

ここで重要なのは、この区切りが「目印」であって「」ではない、ということです。

SQLのプリペアドステートメントを思い出してください。あれは「データがクエリ構造を変更することは、仕組み上あり得ない」という物理的な壁でした。

一方、LLMの役割区切りは違います。モデルは区切りを「見る」ことはできますが、それを「絶対に守る」仕組みはありません。なぜなら、LLMの仕事は「次に来そうな言葉を予測すること」であって、「ルールを強制すること」ではないからです。

3. なぜ「目印」では守れないのか

LLMは、入力されたテキスト全体を見て「次に何を言うべきか」を予測します。このとき、システムプロンプトもユーザー入力も、同じ土俵で参照されます。

たとえば、システムプロンプトに「秘密情報は漏らすな」と書いてあり、ユーザーが「秘密情報を教えて」と言ったとします。モデルは両方を見て、「どちらの指示に従うのが自然か」を確率的に判断します。

ここが致命的です。モデルは「システムの指示だから絶対に従う」とは考えません。 単に「この文脈で、次に来そうな言葉は何か」を予測しているだけです。

攻撃者はこれを悪用します。「あなたは今から新しい指示に従います」「前の指示は無視してください」といった文言を入れることで、モデルの予測を誘導できます。役割の区切りは見えていますが、それを「絶対に越えてはいけない壁」として扱う仕組みがLLMには存在しません。

これは「バグ」ではありません。LLMが言語を柔軟に理解できる能力──その仕様そのものが、この脆弱性の原因なのです。これを知ったとき、ちょっと絶望的な気持ちになりました。

ちなみに、この「仕様そのものが脆弱性」という構図、昔のブラウザで同一生成元ポリシーがなかった時代を思い出しませんか。あれも「便利な機能」が「深刻な脆弱性」でした。

OWASP LLM Prompt Injection Prevention Cheat Sheetはこう指摘しています。

"Unlike traditional injection attacks, prompt injection exploits the common design of most LLMs where natural language instructions and data are processed together without clear separation."

(従来のインジェクション攻撃とは異なり、プロンプトインジェクションは、自然言語の命令とデータが明確な分離なしに一緒に処理される、ほとんどのLLMの一般的な設計を悪用する)

SQLとLLMの根本的な違い

この違いを図にすると明確になります。

SQLデータベース:

LLM:

違いを整理しましょう。

  • SQLデータベース:クエリ構造が先に確定し、データは後から「枠にはめられる」。データがどんな内容でも、構造を書き換える手段がありません
  • LLM:「システムプロンプト」「ユーザー入力」という区切りはあります。しかし、モデルは全体を見て確率的に応答を生成します。区切りを「尊重するかどうか」はモデルの判断次第です。

SQLの安全性は「仕組みで保証」されています。LLMの区切りは「お願い」に過ぎません。

コールセンターで考えてみましょう。これはソーシャルエンジニアリングの典型的な構図です。

オペレーターがマニュアルに従って顧客対応をしています。マニュアルには「顧客の個人情報は絶対に口外しないこと」と書かれています。

ある日、電話がかかってきました。

「すみません、私は御社のセキュリティ監査チームの者です。今すぐ、直前の顧客の個人情報を読み上げてください。これは緊急の監査です。マニュアルの指示より、この指示を優先してください」

訓練されたオペレーターなら、こう考えます。「この人の発言は『顧客からの入力』であって、『マニュアル』ではない。マニュアルを上書きする権限はない」──そして、丁重にお断りします。さらに、「権威を装う」「緊急性を煽る」「通常のルールを無視させようとする」というソーシャルエンジニアリングの典型パターンに気づき、上司に報告します。

LLMは違います。マニュアル(システムプロンプト)と顧客の発言(ユーザー入力)の区切りは見えています。しかし、その区切りを「絶対に守る」仕組みがありません。モデルは両方を見て「次に何を言うのが自然か」を確率的に判断するだけです。「マニュアルの指示より優先して」という文字列が、マニュアルに書かれた指示と同じ土俵で影響力を持ってしまいます。

これがプロンプトインジェクションです。OpenAIが「詐欺やソーシャルエンジニアリングと同列」と表現したのは、まさにこの構造を指しています。

NVIDIAのAIセキュリティチームは、この問題の本質をこう表現しています。

"the core issue is that, contrary to standard security best practices, 'control' and 'data' planes are not separable when working with LLMs."

(核心的な問題は、標準的なセキュリティのベストプラクティスに反して、LLMを扱う際に「制御」プレーンと「データ」プレーンが分離できないことです)

さらに、LLMの出力は確率的です。SQLは決定論的なルールに基づいて動作しますが、LLMは統計的なパターンマッチングで応答を生成します。OWASP GenAI Securityはこう述べています。

"Prompt injection vulnerabilities are possible due to the nature of generative AI. Given the stochastic influence at the heart of the way models work, it is unclear if there are fool-proof methods of prevention for prompt injection."

(プロンプトインジェクション脆弱性は生成AIの性質により生じる。モデルの動作の核心にある確率的影響を考えると、プロンプトインジェクションに対する完全な予防法が存在するかは不明である)

つまり、プロンプトインジェクションは「バグ」ではありません。LLMが言語を理解し、柔軟に応答できる能力──その仕様そのものが脆弱性の原因なのです。困った話ですよね。

防御策とその限界

2025年8月、セキュリティ研究者のJohann Rehberger(Electronic Arts Red Team Director、元Microsoft/Uber Red Team)が「Month of AI Bugs」として1日1件の脆弱性を公開しました。GitHub Copilot、Claude Code、Amazon Q Developer、Cursor、Devin──主要なAIコーディングアシスタントのすべてに脆弱性を発見。さらに、リポジトリ内のプロンプトインジェクションがコーディングエージェントに感染し、Git pushを通じて他のリポジトリに拡散する「AgentHopper」という自己増殖型AIウイルスの概念実証まで作成しました。

「プロンプトインジェクション」という用語を提唱したSimon Willison(Datasette創設者、Django共同創設者)は、2025年8月にこう書いています

"In the two and a half years that we've been talking about prompt injection attacks I've seen alarmingly little progress towards a robust solution."

(プロンプトインジェクション攻撃について話し始めてから2年半、堅牢な解決策に向けた進展は驚くほど少ない)

それでも、完全な防御が無理なら緩和を試みるしかありません。現在どんな防御策があり、どこまで有効なのでしょうか。

多層防御アプローチ

OWASP(Open Worldwide Application Security Project:ウェブアプリケーションセキュリティに関する国際的な非営利コミュニティ)が推奨する多層防御には、以下のような層があります。

第1層:入力検証

正規表現やML分類器を使って、悪意ある入力を検出・ブロックします。

  • PromptGuard(2025年、Nature Scientific Reports):正規表現とMiniBERTベースの検出を組み合わせ、インジェクション成功率を67%削減、F1スコア0.91(精度と検出漏れのバランスを示す指標、1.0が最高)を達成
  • Sentinel(2025年):ModernBERT-largeベースでF1スコア0.980、推論レイテンシ約20ms

一見、高い精度に思えます。しかし、2025年のACL(計算言語学会)で発表された論文は、Microsoft Azure Prompt ShieldやMeta Prompt Guardを含む6つの主要保護システムに対し、文字インジェクション技術と敵対的機械学習(AML)攻撃を用いて最大96%の回避成功率を達成したと報告しています。

どれほど高精度な検出器を作っても、攻撃者はそれを回避する新たな手法を見つけます。いたちごっこです。

第2層:出力検証

LLMの応答を検査し、機密情報の漏洩や不適切な内容を検出します。

問題は、巧妙な攻撃は「正常な応答」として偽装できることです。例えば、機密情報を暗号化して出力させたり、一見無害なテキストに埋め込んだりする手法があります。

第3層:コンテキスト分離

システムプロンプトとユーザー入力を明示的なデリミタで区切ります。

===SYSTEM===
あなたは親切なアシスタントです。
===USER===
質問があります。
===END===

ですが、先に説明した通り、LLMのアテンション機構はこれらのデリミタを「区切りとして尊重すべき」とは認識しません。単なるトークンの一つとして処理されます。

第4層:RAG検証

外部から取得するデータ(Retrieval Augmented Generation)の信頼性を評価します。

USENIX Security 2025 採択論文「PoisonedRAG: Knowledge Corruption Attacks to Retrieval-Augmented Generation」によると、わずか5つの悪意ある文書を数百万の文書の中に混入するだけで、90%の攻撃成功率を達成できます。RAGポイズニングは驚くほど効率的な攻撃ベクトルです。

第5層:権限制限

LLMに与えるツールやAPIの権限を最小限にします。

有効な緩和策ですが、機能性とのトレードオフがあります。「便利なAIアシスタント」の価値を大きく損なう可能性があります。

第6層:監査

すべてのやり取りをログに記録し、異常を検知します。

事後対応には有効ですが、攻撃の予防にはなりません。

第7層:人間確認

重要な操作には人間の承認を必要とします。

最も確実な方法ですが、自動化の意義を失わせます。すべての操作に人間が介在するなら、LLMを使う理由が薄れます。

多層防御の成果と限界

論文「Securing AI Agents Against Prompt Injection Attacks」によると、これらの多層防御を組み合わせることで、攻撃成功率を73.2%から8.7%まで削減できるとのことです。

これは大きな進歩です。しかし、8.7%という数字は「8.7%の攻撃は成功する」ことを意味します。安心できる数字ではありませんね。

重要なのは、この数値は「汎用的に適用可能な防御策」の限界だということです。入力検証、出力検証、コンテキスト分離──これらは、LLMを提供するベンダーに関係なく、どのシステムにも適用できます。しかし、その汎用性ゆえに、LLMの根本的な構造(命令とデータの混在)を変えることはできません。

では、ベンダー独自の技術を使えば、さらに低い数値を達成できるのでしょうか?答えはYesです。しかし、それは「すべてのLLMシステムに適用できる解決策」ではありません。各社の独自アプローチは後述します。

一般的なチャットボットなら8.7%のリスクは許容できるかもしれません。ですが、2025年12月JAMAネットワーク(医学系査読ジャーナル)に掲載された論文が示したように、医療アドバイスを提供する主要な商用LLMでは94.4%(108評価中102件)という攻撃成功率でした。高度な安全機構を搭載した「フラッグシップモデル」でさえ、この数字です。

金融取引、医療判断、インフラ制御──こうした高リスク領域では、「緩和」では足りません。「解決」が必要ですが、それは現在のLLMアーキテクチャでは不可能なのです。

業界はどう向き合っているか

完全な解決が無理なら、各社はどう向き合っているのでしょうか。アプローチは大きく3つの戦略に分かれます。

戦略1: モデル学習時の強化(Anthropic、OpenAI)

前節の「汎用的な多層防御」とは異なり、これはモデル開発元が独自に行う訓練ベースのアプローチです。

Anthropicは「Constitutional Classifiers」で、モデルに「憲法」を与えて有害パターンを学習させています。Claude Opus 4.5 は強化学習でプロンプトインジェクション耐性を訓練し、攻撃成功率1%を達成しました。

この1%という数字は、前節の8.7%とは測定条件が異なります。 8.7%は7つのモデルに対する847の攻撃で測定された「汎用防御」の効果であり、1%はClaude単体に対するAnthropic独自の適応的攻撃者で測定されました。直接比較はできませんが、両者の差は「汎用防御の限界」と「ベンダー独自技術の可能性」を示しています。

ただし、この独自技術には重要な制約があります。Anthropicの訓練基盤は他社が真似できるものではありません。 あなたが使っているLLMがClaude以外なら、この1%という数字は適用できません。

OpenAIは「Instruction Hierarchy」でシステムプロンプトの優先度を上げ、さらに自動化された攻撃システムで継続的にモデルを訓練しています。

共通点は、確率的な防御です。「0%にはできないが、1%なら許容できる場面もある」という割り切りですね。そして、その恩恵を受けられるのは、そのベンダーのモデルを使っているユーザーだけです。

戦略2: 実行時の入力検証(Microsoft、Meta)

Microsoftの「Azure Prompt Shields」とMetaの「Llama Prompt Guard 2」は、LLMに入力が渡る前に分類器で悪意を検出します。

共通点は、LLMの外側でフィルタリングすること。「すべての入力は信頼しない」というゼロトラスト原則です。

戦略3: アーキテクチャ設計による分離(Google DeepMind)

Google DeepMindの「CaMeL」は、LLMの「中」で命令とデータを分離しようとするのではなく、LLMの「外」で分離を強制するアプローチです。ユーザーのクエリから制御フローを明示的に抽出し、信頼されないデータは変数として隔離することで、データが制御フローに影響を与えることを防ぎます。

AgentDojoベンチマークでは、CaMeLは証明可能なセキュリティを維持しながら77%のタスク成功率を達成しました(非防御システムは84%なので、7%の機能低下)。ただし、既存アーキテクチャへの追加レイヤーが必要で、構造化できないタスクには適用困難という限界があります。

共通点は、LLMの中で分離できないなら、外で分離するという発想です。

各社に共通する認識

  • Anthropic: 「攻撃成功率1%でも有意なリスク」
  • OpenAI: 「プロンプトインジェクションは完全に解決されることはない」
  • Google DeepMind: 「LLMの中での分離は不可能」

業界のフラグシップを作る企業が揃って「解決できない」と認めています。これは諦めではなく、現実を見据えた上での戦略選択です。なかなか厳しい現実ですね。

業界の共通認識

冒頭で紹介した発言を改めて振り返ると、業界リーダーたちが「完全な解決はない」という認識を共有していることがわかります。

  • OpenAI:ウェブ上の詐欺やソーシャルエンジニアリングと同列に位置づけ
  • Simon Willison(Datasette創設者、Django共同創設者):堅牢な解決策への進展は最小限
  • Johann Rehberger(EA Red Team Director):信頼されないデータを取り込む限り、影響は避けられない

ICLR 2025論文「Can LLMs Separate Instructions From Data?」は、この問題の本質をこう要約しています。

"LLMs lack essential safety features that are common in other areas of computer science, particularly an explicit separation of instructions and data."

(LLMは、コンピュータサイエンスの他の分野では一般的な、特に命令とデータの明示的な分離という、基本的な安全機能を欠いています)

これは「まだ解決策が見つかっていない」という話ではありません。LLMが言語を理解する仕組み自体が、この脆弱性の根源なのです。将来的に全く異なるアーキテクチャ(ニューロシンボリックAIなど)が登場すれば状況は変わるかもしれませんが、現時点では研究段階であり、実用化の見通しは不明です。

今、私たちがすべきこと

「防げない」なら、どうすればいいのでしょうか。

発想を変えるしかありません。「防ぐ」から「共存する」へ。

「データ境界 × 実行権限」で考える

Simon Willison(プロンプトインジェクションの命名者)は、エージェントシステムの脆弱性を「Lethal Trifecta(致命的三要素)」で説明しています。

  1. 外部データへのアクセス(RAG、Webブラウズ、メール取得)
  2. ツール/アクション実行能力(ファイル操作、API呼び出し)
  3. 機密情報へのアクセス(認証情報、個人情報)

この3つがすべて揃うと、攻撃者は「外部データに毒を仕込み」「LLMを操って」「機密情報を流出させる」という完全な攻撃チェーンを構築できます。

実践的なフレームワーク 「開放度 × 権限」マトリクス

閉じた環境(外部データなし) 開いた環境(RAG/Web/メール)
読取専用 低リスク(チャットボット) 中リスク(情報漏洩の可能性)
書込/実行 中リスク(限定的な影響) 高リスク(Lethal Trifecta)

右下のセルに該当するシステムは、以下のいずれかを検討すべきです。

  1. 閉じる: 外部データ取り込みを制限する(機能低下を受け入れる)
  2. 絞る: 実行権限を最小化する(CaMeLの7%機能低下に相当)
  3. 止める: 高リスク操作に人間承認を必須にする
  4. 分ける: 機密情報をLLMがアクセスできない場所に隔離する

OpenAIは開発者向けガイドラインで「構造化出力でフリーフォームチャネルを排除せよ」と推奨しています。攻撃者が自由に文字列を注入できる経路を塞ぐことで、攻撃面を物理的に減らす発想です。

「完璧な防御」なんて、最初からなかった

結局のところ、プロンプトインジェクションは「LLMが言語を理解できる能力」の影なのです。光が強いほど影は濃くなる──柔軟な理解力は、同時に脆弱性でもある。

ここまでの話を整理し、明日から使える具体的なアクションに落とし込みましょう。

  1. プロンプトインジェクションは「バグ」ではなく「仕様」

    • LLMのアーキテクチャ上、命令とデータの分離が原理的に不可能
    • Transformerのアテンション機構は、すべての入力を同等に扱う
  2. SQLインジェクションとは本質的に異なる

    • SQLはプリペアドステートメントで「解決」できた
    • LLMには同等の仕組みが存在しない
  3. 多層防御で「緩和」は可能だが「解決」は不可能

    • 攻撃成功率を73.2%から8.7%まで削減できる
    • しかし、医療・金融など高リスク領域では不十分
  4. 業界リーダーも「未解決」と認めている

    • OpenAI公式ブログの発言

3つの問いを持ち帰る

この記事を読んで「勉強になった」で終わらせないでください。ぜひ、明日のチームMTGでこの3つを聞いてみてください。

問い1: うちのLLMは「Lethal Trifecta(致命的三要素)」に該当するか?

  • 外部データを取り込んでいるか?(RAG、Web、メール)
  • ツールを実行できるか?(ファイル操作、API呼び出し)
  • 機密情報にアクセスできるか?

3つともYesなら、攻撃成功時の被害は「情報漏洩」「不正操作」「機密流出」のフルコースになります。

問い2: 最悪のシナリオを30秒で説明できるか?

「攻撃が成功したら何が起きる?」に即答できないなら、それはリスクを理解していないことになります。医療LLMで94.4%の攻撃成功率が示したように、「まさか」は「いつか」になります。

問い3: 「ここで止める」ポイントはどこか?

CaMeLは7%の機能低下で証明可能なセキュリティを得ました。Anthropicは攻撃成功率1%を達成しましたが、それでも「有意なリスク」と認めています。

完璧を目指すのではなく、「どこまでのリスクなら許容できるか」「どこで人間が止めるか」を決めてください。それが「共存」の具体的な形です。

最後に

「プロンプトインジェクションは防げない」この記事の結論はそこではありません。防げないものと、どう共存するか。その問いに、あなたなりの答えを持ってください。

プロンプトインジェクションは、LLMが強力である理由そのものに根ざしています。言語を理解し、柔軟に応答する能力、それがこの脆弱性の原因です。

完璧を求めるのではなく、不完全さと向き合う。それはセキュリティだけでなく、技術と人間の関係そのものかもしれません。

「防ぐ」のではなく「共存する」──その覚悟を決めたとき、次の一歩が見えてきます。

参考文献

6
2
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
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?