解説動画あり!Hostヘッダ・インジェクションとは
Hostヘッダ・インジェクションとは?
HTTPリクエストヘッダには、通信対象サイトのホスト情報を格納する「Host」ヘッダがあります。通常、このフィールドにはWebブラウザが自動的に通信相手のホスト名を格納してアクセスしますが、この値はクライアントから渡される値であるため、未検証のままサーバー側で利用していると思わぬ誤動作を引き起こすことがあります。
このように「Host」ヘッダに格納されるホスト名を変えてアクセスされた場合に誤動作してしまう問題のことをHostヘッダ・インジェクション脆弱性と呼び、この問題を狙った攻撃のことをHostヘッダ・インジェクション攻撃と呼びます。
また、Hostヘッダ・インジェクション脆弱性は、問題の発生の仕方によっては能動的攻撃であったり、受動的攻撃になったりと攻撃手法が変化するのが特徴です。そのため、問題の発生状況によっては、同じHostヘッダ・インジェクションであってもそれぞれのリスクに大きな差異が生じます。
Hostヘッダ・インジェクション攻撃の仕組み
Host情報が置き換わることで生じる問題は様々なケースに分類できますが、ここではよくある例としてパスワードリマインダーでのHostヘッダ・インジェクションの攻撃の概要について解説します。
パスワードリマインダー機能におけるHostヘッダ・インジェクション
- 攻撃者は自身が所有するドメイン情報を含んだ「Host」ヘッダを送信する
- 問題のあるWebアプリケーションでは、攻撃者の指定した「Host」ヘッダの値を利用してリマインダーメールの内容を組み立てる
- 被害者に向けて2.のURLが記載されたパスワードリセット用のメールが送信される
- 被害者が気付かずに攻撃者の用意した罠サイトにアクセスする
- 攻撃者の罠サイトでパスワード再設定処理を行うことでパスワード情報が漏洩する
上記のような攻撃では再設定用のメールアドレスを送信するまでが能動的攻撃であり、以降の被害者がパスワードをリセットする流れまでが受動的攻撃となります。
被害事例
パスワードリマインダーにおける攻撃例を前述しましたが、過去には以下のようにRSSにおけるHostヘッダ・インジェクション脆弱性による被害事例がありました。
tDiaryでの被害事例
記事の抜粋)
Web日記支援システムtDiaryにおいて、脆弱性が発見されました。第三者が読者を任意のサイトに誘導できる危険性があります。以下の説明を読んで、早急な対応をお願いします。
以下の条件をすべて満たす運用をしているtDiaryには、この問題が存在します。
以下のいずれかのバージョンのtDiaryを使用している(xは任意)
tDiary 2.0.x
tDiary 2.1.x
makerss.rbプラグインもしくはwhatsnew-list.rbプラグインを使ってfeed(RSS)を生成している
IPアドレスさえ合っていれば、任意のホスト名でのアクセスが可能になっている(※)
tdiary.confにて、base_urlを指定していない
※例えばWebサーバのName-based Virtual Host機能などを使い、特定のホスト名を指定した場合のみアクセス可能な場合は安全です。試しに自分の日記に対し、URLのホスト名の部分をIPアドレスに置き換えても普通に表示されてしまう場合には、この脆弱性の対象になると考えて良いでしょう。
引用ページ:https://tdiary.org/20070723.html
脆弱性の解説動画
Hostヘッダ・インジェクションが起こる原因
問題のあるWebアプリケーションでは、アプリケーションロジックの中で「Host」ヘッダの値を未検証のまま利用して処理を継続しています。そのため、各種のセキュリティ上の問題が発生します。
Hostヘッダ・インジェクションが存在するプログラム例(PHP言語)
<?php
// SSLへリダイレクトする処理(未検証のHostヘッダの値を使っているため脆弱性あり)
header("Location: https://$_SERVER['HTTP_HOST']/", true, 301);
exit;
?>
また、上記のようなアプリケーションロジックにおける発生原因意外にも、例えば1つのドメインに対して、HTTPリクエストのホスト情報を元にバックグランドで複数のアプリケーションサーバーに振り分けている(バランシングしている)ような環境においては「Host」ヘッダだけではなく「X-Forwarded-Host」ヘッダなどの値がHostヘッダ・インジェクションの原因となることがあります。
なお、最近では仮想環境などにも対応したフレームワークやパッケージアプリケーションにおいては、バーチャルドメインの利用可否の設定によっては、Hostヘッダ・インジェクションが混入することがあるため、こちらの点についても注意が必要と言えます。
Hostヘッダ・インジェクション攻撃への対策手法
必須対策1(ドメインを固定にする)
Hostヘッダ・インジェクションは送られてきたHostヘッダの値を元に処理をすることが原因で発生します。そのため、Webアプリケーション内のロジックにおいてURLを生成する際のドメイン情報をあらかじめ定めた上で、固定の値を用いて処理することで問題の混入を防止することができます。
必須対策2(Hostヘッダの値を検証する)
Webサービスの仕様や運用上、前述した必須対策1の実施が難しい場合に行う対策となります。Webアプリケーションの処理において、生成するURLに用いるドメイン情報が複数ある場合やURLのドメイン情報が可変値などの場合には、あらかじめ定義したホワイトリスト形式の許可ドメインを用意します。その上で、送られてきたHostヘッダの値がリストで定義されているドメイン情報と合致しているか検証して許可されている場合のみ処理を実行します。
推奨対策1(X-Forwarded-Hostヘッダの解釈を無効にする)
Webサービスの運用上、問題が内容であればX-Forwarded-Hostヘッダなどのオーバーライドヘッダを無効にすることでサーバー設定やミドルウェア設定が原因で発生するHostヘッダ・インジェクションのリスクを低減させることができます。
推奨対策2(バーチャルドメイン設定)
公開ドメインがホスティングされたWebサーバーにおいては、バーチャルドメインなどを用いて内部向けのWebページをホスティングするなどの複数のホスト情報を設定しての運用は避けます。このように対応することでHostヘッダ・インジェクションのリスクを低減させることができます。
まずは手軽にツールで脆弱性診断
上述の対策手法が重要となる一方で、脆弱性が混入されていないかを検知する事も重要となります。そのためには脆弱性診断を受診する必要があり、Hostヘッダ・インジェクションの脆弱性についても脆弱性診断を通じて発見する事が出来ます。
脆弱性診断とは何かについて詳しく知りたい⽅は脆弱性診断とは(エンジニア向け)と脆弱性診断とは(⾮エンジニア向け)もぜひご参照ください。
脆弱性診断ツール「Securify Scan」では、Hostヘッダ・インジェクションの脆弱性検知も対応しております。脆弱性検知やセキュリティレベルを強化したい企業様はぜひ弊社の脆弱性診断ツール「Securify Scan」を活用ください。
無償でのトライアル実施も行っておりますので、お気軽にお問い合わせください。