HTTPヘッダ・インジェクションとは
HTTPヘッダ・インジェクションは、WebアプリケーションがHTTPヘッダを動的に生成する際に、入力値を適切に処理しないことで発生するセキュリティ上の
脆弱性です。この
脆弱性を悪用することで、攻撃者は本来のHTTPヘッダに不正なヘッダを挿入し、Webアプリケーションの動作を改ざんしたり、ユーザーに被害を与えたりすることが可能になります。
攻撃の原理
この攻撃は、SQLインジェクションと同様に、入力されたデータがエスケープ処理されずにHTTPヘッダに組み込まれることで発生します。特に、改行コードはHTTPヘッダにおいて特殊な意味を持ちます。HTTPヘッダは各行が改行で区切られており、改行コードをヘッダの値に挿入することで、本来のヘッダ以外のヘッダを挿入したり、ヘッダとボディの区切りを偽装したりすることが可能になります。
具体的には、HTTPヘッダの値に改行コード(\r
)を挿入すると、それ以降の文字列が新たなヘッダ行として扱われます。また、連続した改行コード(\r
\r
)を挿入すると、HTTPヘッダの終了とボディの開始を意味することになります。これにより、攻撃者はヘッダに任意の情報を追加したり、ボディに不正なスクリプトを挿入したりすることができます。
想定される攻撃例
1.
Cookieの不正設定: 攻撃者は、改行コードを挿入し、その後に`Set-Cookie`ヘッダを追加することで、ユーザーのブラウザに任意のCookieを設定できます。これにより、セッションIDを固定化するセッション固定攻撃が可能になり、セッションハイジャックのリスクが高まります。
2.
クロスサイトスクリプティング (XSS): 連続した改行コードを挿入することで、HTTPヘッダの終わりとボディの始まりを強制的に示すことができます。この手法を用いると、攻撃者はボディに任意のスクリプトを挿入でき、ユーザーのブラウザ上で悪意のあるスクリプトを実行させることが可能になります。
3.
HTTP応答の分割と偽装: HTTP 1.1のKeep-Alive接続では、`Content-Length`ヘッダを改ざんすることで、一つのHTTP応答を複数に分割したり、複数の応答を一つに結合したりすることが可能です。これにより、攻撃者はWebアプリケーションの応答を操作し、ユーザーに誤った情報を表示させたり、別の攻撃へとつなげたりすることが可能になります。
対策
HTTPヘッダ・インジェクションに対する対策は、主に以下の3点です。
1.
APIの使用: Webアプリケーション開発者は、HTTPヘッダを文字列として直接出力するのではなく、フレームワークや実行環境が提供するヘッダ出力用のAPIを使用するべきです。これらのAPIは、自動的にエスケープ処理やサニタイズ処理を行うため、インジェクション攻撃を防ぐことができます。
2.
入力値のエスケープ: HTTPヘッダの値として使用される入力値に含まれる特殊文字(特に改行コード)をエスケープする必要があります。URIの場合はURLエンコードを利用できる場合があります。値に改行が含まれる可能性がないのであれば、そのような入力自体をエラーとして拒否することも有効です。
3.
要注意ヘッダの管理: 特に、リダイレクトで使用される`Location`ヘッダや、セッション管理に使われる`Set-Cookie`ヘッダは、攻撃者が悪用する可能性が高いため、特別な注意が必要です。これらのヘッダを生成する際には、必ず適切なエスケープ処理を行うべきです。
HTTPヘッダ・インジェクションは、Webアプリケーションのセキュリティにおいて重要な
脆弱性です。開発者は上記の対策を参考に、安全なWebアプリケーションを開発するように努める必要があります。