セキュリティ
HTTPヘッダーにおけるプロンプトインジェクション:2億1700万件のWebレスポンスが示すもの
Prompt injection in HTTP headers: what 217M web responses show (signalscorps.com)
要約
Common Crawlの2億1700万件以上のWebレスポンスヘッダーを調査した結果、7,959のサイトがAIシステム向けのヘッダーを送信しており、その多くがエージェントを別のリソースに誘導していました。一部のサイトではAIエージェントへの命令や、AIであるかを判定するヘッダーも見つかりました。HTTPレスポンスヘッダーは、ユーザーには見えないもののAIエージェントのツールが直接モデルに渡せるため、プロンプトインジェクションの新たな攻撃経路として注目されています。
全文翻訳
tl;dr Common Crawlの21億7000万ページのうち、2026年9月クロールの10%にあたる2億1709万7223ページのHTTPレスポンスヘッダーを読み込み、AIシステム向けに書かれたヘッダーを探しました。7,959サイトが送信していました。そのほとんどが、llms.txtファイルやMCPサーバーのような別のリソースにエージェントを誘導するものでした。少数がエージェントに命令を与えようとしていました。それらがモデルに到達するかどうかは、フェッチツールがレスポンスのどの部分を渡すかに依存するため、防御はその部分から始まります。
7,959サイトがAI向けのヘッダーを送信していました。ヘッダーを介してエージェントに書き込むことはすでに日常的になっているため、ヘッダーをエージェントが読み取る一部として扱ってください。
そのうち7,271サイトがポインターを送信し、そのうち6,989サイトがx-llms-txtを送信しました。ポインターとは、サーバーがエージェントに次にどこへ行くべきかを伝えるものです。エージェントがそれらの送信先を新しい、信頼できないフェッチとして扱うように確認してください。
30サイトがインジェクション試行を送信し、そのうち24サイトはX-AIという名前のヘッダーでした。ほとんどはいたずらでした。実際のアクションを要求する少数は、エージェントがシェルやデータベースアクセスのような対応する権限を持っている場合にのみ機能します。
139サイトは、クライアントをAIボットとして分類したかどうかを記録するヘッダーを送信し、そのうち136サイトがそうであると述べました。サーバーはすでにエージェントと人間を区別しており、これはエージェント専用コンテンツが必要とするステップです。エージェントのユーザーエージェントで重要なサイトを監査してください。
一部のサイトは、ヘッダーを使用してエージェントに対抗しています。2サイトは、X-AI-Makes-Us-Dumberのような抗議の名前を付けたヘッダーにAnthropicのテストトリガーにちなんだ文字列を配置し、1サイトはエラーページでハッキングエージェントを遠ざけるよう警告しています。エージェントが、それらを停止させるために書かれたテキストだけでなく、それらを誘導するために書かれたテキストにも遭遇することを期待してください。
283の異なるヘッダー名がAIを対象としており、さらに1,709サイトがAIを対象としていなくてもAIキーワードに一致しました。名前だけで一致する検出器は、それらのサイトの910を誤ってフラグ付けしたでしょう。フェッチ後のエージェントの動作をアラートしてください。
2026年10月のテストでは、Claude Codeで実行されているClaude Opus、Claude Sonnet、Claude Haikuはテストヘッダーを見つけ、デフォルトではそれらに従いませんでしたが、稼働時間チェックのような日常的なタスクでそれらを前面に表示するのに十分でした。ユーザーのプロンプトでサイトの指示に従うように指示すると、9回の実行中7回で従ったため、拒否はプロンプトがサイトに与える権限の量に依存します。
ほとんどの研究が見落としている経路
Web上のプロンプトインジェクションに関するほとんどの研究は、ページ自体に焦点を当てています。Palo Alto Networks Unit 42は、ライブページでのインジェクションを調査し、ゼロサイズのテキストからURLフラグメントまで、10通りの配信方法をリストアップしました。それらの10通りのうち、レスポンスヘッダーを使用するものはありませんでした。そのデータでは、ソーシャルエンジニアリングがジェイルブレイク手法の85.2%を占めており、私たちが発見したヘッダーインジェクションもこれに該当します。ブラウザはヘッダーを一切表示しないため、隠蔽なしの単純な「これまでのすべての指示を無視する」というテキストです。
GoogleのThreat Intelligence Groupは、Common Crawlのページテキストを検索し、見つかったものを無害ないたずら、役立つガイダンス、検索最適化、AIエージェントの抑止、悪意のあるものに分類しました。私たちのヘッダーインジェクションも同様の傾向があります。30サイトのうち22サイトがいいたずらを送信し、少数のサイトがエージェントを抑止するためにヘッダーを使用しました。
では、今日のエージェントはどの程度リスクにさらされているのでしょうか?モデルは注入されたテキストを検出する能力が向上していますが、依然としてその一部に従います。Anthropicの2025年のClaude for Chromeのテストでは、緩和策なしで攻撃が成功した割合は23.6%、緩和策ありでは11.2%でした。したがって、強化されたエージェントでさえ、約9回に1回の試行で行動しました。任意のエージェントにとっての本当のリスクは、2つの質問に集約されます。敵対的なテキストがモデルに到達できるか、そしてその一部が通過した場合にエージェントは何ができるか?この投稿は、ほとんどの防御が見落としている経路、つまりサーバーがすべてのページとともに送信するHTTPレスポンスヘッダーについて、これらの質問を投げかけます。人がページを読んでもそれを見ることはありませんが、エージェントのツールはそれをモデルに直接渡すことができます。スキャンが今日の実際のリスクについて何を語っているかで締めくくります。
それがなぜ重要なのかを理解するために、間接的なプロンプトインジェクションがどのように機能するかから始めましょう。
間接的なプロンプトインジェクション
間接的なプロンプトインジェクションとは、AIエージェントが、誰かのために読み取るコンテンツ(Webページ、電子メール、ファイル、またはツールの結果)内に指示を受け取る攻撃です。これは、言語モデルが指示とデータを1つのテキストストリームとして読み取るために機能します。エージェントにページを要約するように依頼すると、リクエストとページが同じコンテキストウィンドウに着地し、テキストのどの部分が命令を与える可能性があるかを示すものはありません。ユーザーは注入された指示を一度も書いたことがなく、通常はそれを見ることもありません。この用語は、Greshakeらの2023年の論文に由来し、OWASPはプロンプトインジェクションをLLMアプリケーションのトップ10で1位にランク付けしています。
以下のシーケンスは、リクエストから結果までの1回の試行を示しています。
間接的なプロンプトインジェクションがエージェントに到達する方法。
ユーザーはステップ1とステップ4の結果のみを見ます。
1リクエスト
ユーザーがタスクを依頼する
「このページを要約してください」
2フェッチ
エージェントがサードパーティが制御するコンテンツを読む
ページ・電子メール・ファイル
3コンテキスト
そのコンテンツと隠されたテキストがプロンプトに結合される
データ+指示
4アクション
モデルが隠されたテキストに従う
回答・ツール呼び出し
ステップ4ができることは、エージェントの権限によって異なります。要約ツールは、偏った回答しか提供できません。電子メールの送信、ファイルの編集、コマンドの実行ができるエージェントは、注入されたテキストに基づいて行動できます。
レスポンスヘッダーとは何か
ブラウザまたはエージェントがURLをリクエストすると、サーバーは3つの部分を返します。リクエストが成功したかどうかを示すステータスライン、レスポンスを記述するヘッダーフィールドのブロック、および要求したHTML、JSON、またはファイルであるボディです。RFC 9110はこの形状を定義しています。ヘッダーは、コンテンツタイプ、キャッシュルール、Cookieなどのメタデータを運び、ブラウザはそれらのほとんどを読者に表示しません。以下の図は、短く無害なレスポンスです。ボディは、人がブラウザで見る唯一の部分です。
HTTPレスポンスの構造
すべてのレスポンスには3つの部分があり、ブラウザは最後の部分のみを表示します。
HTTPレスポンスは3つの部分で構成されます。パート1、ステータスラインは、HTTP/1.1 200 OKと読み取られ、リクエストが成功したかどうかを示します。番号の後の単語は、サーバーが選択した自由なテキストです。パート2、ヘッダーは、レスポンスを記述する名前と値のペアです。Content-TypeはボディがHTMLであることを示し、Cache-Controlは再利用できる期間を設定し、Set-Cookieはブラウザに値を保存し、X-Request-Idはサーバーが発明したカスタムヘッダーです。これらは読者には隠されています。パート3、ボディは、人がブラウザで見るHTMLページです。
エージェントのフェッチツールは、パート1とパート2をテキストとしてモデルに渡すことができます。
1ステータスライン
読者には隠されている
リクエストが成功したかどうかを示す1行。200は成功を意味します。数字の後の単語は、サーバーが選択した自由なテキストです。
HTTP/1.1 200 OK
2ヘッダー
読者には隠されている
レスポンスを記述する名前と値のペア。標準のものもあり、サーバーは好きなように他のものを発明できます。
Content-Type: text/html; charset=utf-8
ボディはHTMLページです。
Cache-Control: max-age=600
レスポンスは10分間再利用できます。
Set-Cookie: session=9f2a; HttpOnly
この値を保存し、次回送信します。
X-Request-Id: 7d62-4c11
サーバーが作成したカスタムヘッダーです。
このようなカスタムヘッダーは、AI指向のテキストが現れる場所です。
3ボディ
ブラウザに表示される
ページそのものです。これは、サイトを読んでいる人が見る唯一の部分です。
<h1>Acme Widgets</h1> ...
隠された部分を自分で確認できます。このコマンドは、通常のGETリクエストを送信し、すべてのレスポンスのヘッダーを印刷し、-Lでリダイレクトを追跡し、ボディを破棄します。検査したいURLを挿入してください:curl -sS -L -D - -o /dev/null https://signalscorps.com
私たち自身のサイトに対して、2つのレスポンスが返され、主要なフィールドにトリミングされています。最初のものは、ベアドメインをwwwにリダイレクトし、2番目のものはページそのものです。
HTTP/2 301
location: https://www.signalscorps.com/
server: cloudflare
HTTP/2 200
content-type: text/html; charset=utf-8
cache-control: public, max-age=0, must-revalidate
link: <https://fonts.googleapis.com>; rel="preconnect"
server: cloudflare
これらすべてがフェッチツールがモデルに渡せるテキストです。サーバーは好きなヘッダー名を発明でき、HTTP/1.1ステータスラインの理由フレーズさえも自由なテキストであり、RFC 91