HTTPヘッダインジェクション えいちてぃーてぃーぴーへっだいんじぇくしょん
HTTPヘッダインジェクションとは
HTTPヘッダインジェクションとは、Webアプリケーションがユーザーの入力値をHTTPレスポンスヘッダに組み込む際、改行コード(\r\n)を適切に除去・エスケープしていないことを悪用した攻撃手法です。攻撃者は改行コードを含む文字列を送り込むことで、サーバーが返すレスポンスヘッダを自由に追加・書き換えできてしまいます。
HTTPの仕様では、ヘッダとボディは空行(改行コード2つ)で区切られます。この性質を利用すると、ヘッダ領域に細工した改行コードを挿入するだけで、レスポンスを丸ごと2つに分割する「HTTPレスポンス分割(HTTP Response Splitting)」にまで発展させることもできます。結果として、攻撃者がでっち上げた偽のHTTPレスポンスをブラウザに送りつけることが可能になります。
実務的な被害としては、セッションIDの固定化・ハイジャック、クロスサイトスクリプティング(XSS)の誘発、フィッシング目的の偽ページ表示、キャッシュポイズニングなどが挙げられます。開発者が「リダイレクト先URLをそのままヘッダに埋め込む」といった実装をしがちな箇所で頻繁に発生するため、特に注意が必要な脆弱性です。
攻撃の仕組みと構造
HTTPレスポンスの基本構造
HTTPレスポンスは「ステータス行 → ヘッダ → 空行 → ボディ」という順序で構成されています。
HTTP/1.1 302 Found ← ステータス行
Location: https://example.com/ ← ヘッダ(1行目)
Set-Cookie: session=abc123 ← ヘッダ(2行目)
← 空行(ヘッダ終端)
<html>...</html> ← ボディ
攻撃が起きる典型的な実装例
リダイレクト先URLをユーザー入力から取得してそのまま Location ヘッダに埋め込む実装が狙われます。
# 危険な実装例(Python/Flask風)
redirect_url = request.args.get("url")
response.headers["Location"] = redirect_url # ← 改行チェックなし!
攻撃者が次のような値を送り込むとどうなるでしょうか。
https://example.com/%0d%0aSet-Cookie:%20session=attacker_value
%0d%0a はURLエンコードされた \r\n(改行コード)です。サーバーがこれをデコードしてヘッダに埋め込むと:
HTTP/1.1 302 Found
Location: https://example.com/
Set-Cookie: session=attacker_value ← 攻撃者が挿入した偽ヘッダ!
被害のパターン一覧
| 攻撃パターン | 仕組み | 主な被害 |
|---|---|---|
| セッション固定攻撃 | 偽の Set-Cookie ヘッダを挿入 | セッションハイジャック |
| HTTPレスポンス分割 | 改行2つ連続で挿入しボディを偽装 | 偽ページの表示・XSS |
| キャッシュポイズニング | プロキシに偽レスポンスをキャッシュさせる | 第三者への影響波及 |
| クロスサイトスクリプティング | 偽ボディにスクリプトを埋め込む | 個人情報窃取・操作 |
覚え方
「改行(\r\n)は封筒の切れ目」
HTTPヘッダは「封筒の宛名書き」、ボディは「手紙の中身」。改行コードは封筒を切る”はさみ”。 攻撃者がはさみを持ち込むと、封筒を好き勝手に切り貼りできてしまう——それがHTTPヘッダインジェクション!
歴史と背景
- 2000年代初頭 — WebアプリケーションがURL・フォーム入力値をHTTPレスポンスヘッダに動的に組み込む実装が急増。この頃から脆弱性として認識され始める
- 2004年 — セキュリティ研究者のKlein氏らが「HTTP Response Splitting」として体系的に論文化・公開。業界全体に問題が広く認知される
- 2005年前後 — OWASP(Webアプリセキュリティの標準化団体)がガイドラインに掲載。主要フレームワークが改行コードの自動除去を実装し始める
- 2013年 — IPA(情報処理推進機構)が「安全なウェブサイトの作り方」改訂版でHTTPヘッダインジェクションを重点項目として明示
- 現在 — 多くのWebフレームワーク(Rails、Django、Spring等)は標準でヘッダへの改行コード挿入を禁止・例外スローするよう対策済み。しかし自前実装や古いシステムでは今も発生する
対策と関連する防御技術
攻撃を防ぐポイントは「ヘッダに組み込む前に改行コードを取り除く」という一点に集約されます。
具体的な対策コード例
# 安全な実装例:改行コードを除去してからヘッダに設定
import re
def safe_redirect(redirect_url):
# \r と \n をすべて除去(サニタイズ)
safe_url = re.sub(r'[\r\n]', '', redirect_url)
response.headers["Location"] = safe_url
XSSとの違いを整理
| 比較項目 | HTTPヘッダインジェクション | クロスサイトスクリプティング(XSS) |
|---|---|---|
| 攻撃対象 | HTTPレスポンスヘッダ | HTMLボディ(Webページ本文) |
| 悪用する文字 | 改行コード \r\n | <script> タグ等のHTML特殊文字 |
| 主な被害 | Cookie操作・レスポンス分割 | スクリプト実行・情報窃取 |
| 組み合わせ | ヘッダ経由でXSSを引き起こすことも可能 | 別の脆弱性と組み合わせることも |
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 9110 | HTTP Semantics — HTTPレスポンスヘッダの正式仕様。改行コードはヘッダ区切りとして定義されている |
| RFC 9112 | HTTP/1.1 — ヘッダのフォーマットと \r\n による区切り規則を規定 |
| CWE-113 | Improper Neutralization of CRLF Sequences in HTTP Headers — CWE(共通脆弱性タイプ一覧)における本脆弱性の識別番号 |
| OWASP Testing Guide | HTTPヘッダインジェクションのテスト手法・検出方法を記載(OTG-INPVAL-015) |
| IPA「安全なウェブサイトの作り方」 | 国内向け開発ガイドライン。HTTPヘッダインジェクションを重点脆弱性として掲載 |
関連用語
- クロスサイトスクリプティング(XSS) — HTMLボディへスクリプトを挿入する攻撃。ヘッダ経由で誘発されることもある
- セッションハイジャック — 正規ユーザーのセッションIDを奪い取りなりすます攻撃。ヘッダインジェクションの主要な被害結果のひとつ
- クリックジャッキング — ユーザーに見えないレイヤーを重ねてクリックを誘導する攻撃。Webレスポンスの改ざん系攻撃として関連
- 入力値検証(バリデーション) — ユーザー入力を受け付ける前に形式・文字種を確認する防御手法。本攻撃の根本的な対策
- HTTPレスポンス分割 — ヘッダインジェクションを発展させ、レスポンス全体を2つに分割する高度な攻撃手法
- サニタイズ — 危険な文字・文字列を無害化する処理。改行コードの除去はその代表例