HTTPヘッダ・インジェクション(HTTP header injection)とは、HTTPを使って通信するシステムにおいて、動的にHTTPヘッダを生成する機能の不備を突いてヘッダ行を挿入することで不正な動作を行なわせる攻撃手法のこと。また、その攻撃を可能とする脆弱性のこと。
原理
SQLインジェクションなどと同様に、入力値を出力に用いている箇所において、文法上特殊な意味を持つ文字をエスケープせずに展開することで発生する。
HTTPヘッダにおける特殊文字とは、改行コードである。各HTTPヘッダ行は改行で終了し、それ以降は新たなヘッダ行として処理される。この結果、HTTPヘッダの値として改行コードを挿入することができれば、本来の通信内容には含まれないヘッダを挿入することができる。
また、HTTPは空行によってヘッダとボディを区切っている。連続する改行を挿入すればHTTPヘッダの終了を示すことになり、後続するヘッダ行があってもボディとして処理される。
想定される攻撃例
改行の後にSet-Cookie(またはSet-Cookie2)ヘッダを挿入することで、任意の値のHTTP cookieを設定させることができる。WebアプリケーションのセッションIDは通常、HTTP cookieで管理されており、固定値で上書きできればセッション固定攻撃を実現できる。セッション固定攻撃はセッションハイジャックを容易にする。
連続する改行を挿入すると、HTTPヘッダの終了およびボディの開始を指示することができる。連続する改行の後の内容はボディの先頭部分として処理されるため、ボディに任意の記述を挿入できることになる。これはクロスサイトスクリプティング等に繋がる可能性がある。
HTTP 1.1のKeep-Aliveが有効な接続でContent-Lengthヘッダの改竄などを行なうと、ひとつの応答を複数に分割したり、また逆に複数の応答をひとつの応答として処理させたりすることができる。
対策
Webアプリケーション開発者は、HTTPヘッダを単なる文字列として直接出力することを避け、ヘッダ出力のために実行基盤が提供するAPIを使うべきである[1]。
この種のインジェクション攻撃に対する対応の原則は、出力中に現れる特殊文字をエスケープすることである。HTTPヘッダそのものにはエスケープ処理が定義されていないが、値がURIであれば、%xxという形式のURLエンコードを使える可能性がある。また、そもそも正当な応答の値に改行が含まれる可能性がなければ、入力エラーとしてそのような値を拒否することも考えられる。
入力値がコピーされる可能性が高いHTTPヘッダとしては、リダイレクト処理で使われるLocation、セッション管理でよく使われるSet-Cookie(およびSet-Cookie2)が挙げられる。
脚注