公開日:2020/01/15 最終更新日:2020/01/15

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つが挙げられます。
  1. X-Forwarded-Host など一部の HTTP ヘッダは、リバースプロキシや CDN によって生成もしくは変更されていると捉えられることが多く、値が信頼されている
  2. User-Agent など一部の HTTP ヘッダは、Web サーバに送信される前に CDN による無害化処理が行われていない

想定される影響

攻撃者によって細工された HTTP ヘッダを含むリクエストが送信されることで、CDN のキャッシュが汚染され、Web サイトを閲覧者するユーザに悪意のあるコンテンツが返される可能性があります。

対策方法

CDN の提供者は以下の処理を行ってください。

  1. オリジン Web サーバへリクエストを送信する前に、適切なRFCに基づいたHTTPヘッダの検証・無害化処理を行う
  2. X-Forwarded-Host のような、CDN によって生成・確認されると捉えられている一部のヘッダがクライアントから送信されてきた場合は、コンテンツの無害化処理を施してからヘッダ情報を編集する

Web サーバは HTTP リクエスト内のコンテンツを信頼してはいけません。また、レスポンスを返す際は、OWASPが推奨しているように適切かつ安全なエンコーディングを用いてください。

HTTP キャッシングソフトウェアにおける回避策として、リクエストに含まれる HTTP ヘッダに不審なコンテンツが発見された場合、キャッシング処理を行わないようにすることにより、悪意あるコンテンツの配信を防ぐことができます。

Web サーバでは適切な Cache-Control や Expiry ヘッダを用いて、CDN によって動的に生成されたコンテンツのキャッシングを防ぐことができます。

ベンダ情報

参考情報

  1. CERT/CC Vulnerability Note VU#335217
    Multiple caching service providers are vulnerable to HTTP cache poisoning
  2. 15KB Of Fame
    HTTP Cache Poisoning via Host Header Injection
  3. Skeleton Scribe
    Practical HTTP Host header attacks
  4. PortSwigger Research
    Practical Web Cache Poisoning
  5. Host of Troubles
    Host of Troubles Vulnerabilities
  6. OWASP Periodic Table of Vulnerabilities - HTTP Request/Response Smuggling
    HTTP Request/Response Smuggling
  7. Cross Site Scripting Prevention · OWASP Cheat Sheet Series
    Cache Poisoning
  8. Host of Troubles: Multiple Host Ambiguities in HTTP Implementations
    The ACM Digital Library

JPCERT/CCからの補足情報

JPCERT/CCによる脆弱性分析結果

CVSS v3 CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N
基本値: 7.2
攻撃元区分(AV) 物理 (P) ローカル (L) 隣接 (A) ネットワーク (N)
攻撃条件の複雑さ(AC) 高 (H) 低 (L)
必要な特権レベル(PR) 高 (H) 低 (L) 不要 (N)
ユーザ関与レベル(UI) 要 (R) 不要 (N)
スコープ(S) 変更なし (U) 変更あり (C)
機密性への影響(C) なし (N) 低 (L) 高 (H)
完全性への影響(I) なし (N) 低 (L) 高 (H)
可用性への影響(A) なし (N) 低 (L) 高 (H)
CVSS v2 AV:N/AC:M/Au:N/C:P/I:P/A:N
基本値: 5.8
攻撃元区分(AV) ローカル (L) 隣接 (A) ネットワーク (N)
攻撃条件の複雑さ(AC) 高 (H) 中 (M) 低 (L)
攻撃前の認証要否(Au) 複数 (M) 単一 (S) 不要 (N)
機密性への影響(C) なし (N) 部分的 (P) 全面的 (C)
完全性への影響(I) なし (N) 部分的 (P) 全面的 (C)
可用性への影響(A) なし (N) 部分的 (P) 全面的 (C)

謝辞

関連文書

JPCERT 緊急報告
JPCERT REPORT
CERT Advisory
CPNI Advisory
TRnotes
CVE
JVN iPedia