JVNVU#98141012
複数の CDN サービスプロバイダが HTTP キャッシュポイズニングの影響を受ける問題
コンテンツデリバリネットワーク (CDN) は、キャッシュと呼ばれる一時的なローカルストレージを使用して、オリジンとなるバックエンドの Web サーバから集められたコンテンツを配信するプロキシサーバのネットワークです。CDN のキャッシュに対して、無害化処理が行われていない HTTP ヘッダを使用して遠隔から任意のコンテンツを注入する攻撃を HTTP キャッシュポイズニングと呼びます。一度悪意のあるコンテンツを注入されると、将来的に対象のウェブサイトへアクセスする閲覧者の環境で、悪意あるスクリプトが配信、実行されてしまいます。
CDN にホストされている Web コンテンツ
CDN は高可用性、高パフォーマンスのサービスを提供するために、HTTP キャッシングソフトウェアを用いて、位置的に近いサーバからコンテンツを配信しています。HTTP キャッシングソフトウェアは Web サイトの閲覧者(Webクライアント)からの HTTP リクエストに含まれる HTTP ヘッダを解釈し、適切なコンテンツをプロキシのローカルキャッシュまたはオリジンとなる Web サーバから選択し、配信しています。
オリジン Web サーバや HTTP キャッシングソフトウェアが HTTP ヘッダの無害化処理を行わなかった場合、悪意のある攻撃者によって、細工された HTTP ヘッダを含む HTTP リクエストを送信されると、悪意のあるコンテンツをレスポンスに含めてしまうことになります。一度悪意のあるコンテンツが返されると、HTTP キャッシングソフトウェアによってコンテンツがキャッシュされ、そのキャッシュが削除されるか期限切れとなるまで、Web サイトの閲覧者に提供し続けることとなり、閲覧者の環境で意図しないスクリプトを実行させる等の攻撃が可能となります。
Host ヘッダや X-Forwarded-Host ヘッダ等を使用した HTTP ヘッダインジェクションの手法は過去にも存在しましたが、X-Forwarded-Proto や Referer、Upgrade-Insecure-Request、X-DNS-Prefetch-Control などの新しい HTTP ヘッダが使用されるようになったことに加え、クラウド CDN サービスが拡大したことにより、よりスケールが大きく、長期的な影響を及ぼす攻撃が可能となっています。
攻撃に用いられるヘッダの例としては以下のようなものがあります:
- Content-Security-Policy-Report-Only
- Forwarded
- Server-Timing
- Set-Cookie
- Strict-Transport-Security
- X-Forwarded-Proto
- Location
- Accept-Language
- Cookie
- X-Forwarded-For
- X-Forwarded-Host
- Referer
- Max-Forwards
このような攻撃が可能となる原因として少なくとも以下の2つが挙げられます。
- X-Forwarded-Host など一部の HTTP ヘッダは、リバースプロキシや CDN によって生成もしくは変更されていると捉えられることが多く、値が信頼されている
- User-Agent など一部の HTTP ヘッダは、Web サーバに送信される前に CDN による無害化処理が行われていない
攻撃者によって細工された HTTP ヘッダを含むリクエストが送信されることで、CDN のキャッシュが汚染され、Web サイトを閲覧者するユーザに悪意のあるコンテンツが返される可能性があります。
CDN の提供者は以下の処理を行ってください。
- オリジン Web サーバへリクエストを送信する前に、適切なRFCに基づいたHTTPヘッダの検証・無害化処理を行う
- X-Forwarded-Host のような、CDN によって生成・確認されると捉えられている一部のヘッダがクライアントから送信されてきた場合は、コンテンツの無害化処理を施してからヘッダ情報を編集する
Web サーバは HTTP リクエスト内のコンテンツを信頼してはいけません。また、レスポンスを返す際は、OWASPが推奨しているように適切かつ安全なエンコーディングを用いてください。
HTTP キャッシングソフトウェアにおける回避策として、リクエストに含まれる HTTP ヘッダに不審なコンテンツが発見された場合、キャッシング処理を行わないようにすることにより、悪意あるコンテンツの配信を防ぐことができます。
Web サーバでは適切な Cache-Control や Expiry ヘッダを用いて、CDN によって動的に生成されたコンテンツのキャッシングを防ぐことができます。
-
CERT/CC Vulnerability Note VU#335217
Multiple caching service providers are vulnerable to HTTP cache poisoning -
15KB Of Fame
HTTP Cache Poisoning via Host Header Injection -
Skeleton Scribe
Practical HTTP Host header attacks -
PortSwigger Research
Practical Web Cache Poisoning -
Host of Troubles
Host of Troubles Vulnerabilities -
OWASP Periodic Table of Vulnerabilities - HTTP Request/Response Smuggling
HTTP Request/Response Smuggling -
Cross Site Scripting Prevention · OWASP Cheat Sheet Series
Cache Poisoning -
Host of Troubles: Multiple Host Ambiguities in HTTP Implementations
The ACM Digital Library