2018年8月13日
8月9日 (木) に開催された Black Hat USA 2018 では、キャッシュインフラストラクチャの背後にデプロイされた Web サイトに対するキャッシュポイズニング攻撃に関するレポートが公表されました [1] 。このような攻撃では、攻撃者が任意のコンテンツを攻撃対象のキャッシュに挿入する可能性があります。
Fastly のサービスで、ヘッダー間のインタラクションを考慮せずにバックエンドがコンテンツを選択するように設定されている場合、このような攻撃に対して脆弱な場合があります。このリスクは、VCL パッチを適用するか、またはバックエンドの設定を変更することで十分に軽減できます。
1つまたは複数のバックエンドで HTTP レスポンスの送信先となるユーザー (またはセキュリティドメイン) を判断するのに X-Forwarded-Host
、X-Rewrite-Url
、または X-Original-Url
の HTTP リクエストヘッダーのコンテンツが使用される場合に、この種の脆弱性の影響を受ける場合があります。サイトの Fastly の設定によってこのヘッダーがバックエンドに渡され、このヘッダーのコンテンツが (たとえば明示的に、または Vary
HTTP レスポンスヘッダーによって) 有効なエッジ キャッシュキーに含まれない場合、攻撃対象のキャッシュに挿入された任意のコンテンツを含むレスポンスがエッジに保存される可能性があります。
攻撃者は、HTTP リクエストをサイトに送信し、影響を受けたバックエンドが攻撃者によってコントロールされたレスポンスを使用して応答するように仕掛けて Fastly のお客様の URL をポイズニングします。その結果、悪意のあるレスポンスオブジェクトが、サイトのキャッシュ内のポイズニングされた URL に保存されます。これにより攻撃者は、攻撃対象サイトのユーザーがポイズニングされた URLにアクセスするよう誘導し、悪意のあるコンテンツを配信することができます。
オリジンが特殊な値を使用してユーザーに配信するコンテンツを選択したり、複数のセキュリティドメインから選択したりする場合は、以下の対策の検討をお勧めします。
VCL ガイダンスに従って、脆弱性のあるヘッダーを既知の安全な値に設定するか、ヘッダーの設定を解除することを検討してください。たとえば、以下の VCL スニペットを使用して X-Forwarded-Host
ヘッダーを Host
ヘッダーの値に設定できます。
set req.http.x-forwarded-host = req.http.host;
以下の VCL スニペットを使用して X-Original-URL
ヘッダーの設定を解除できます。
unset req.http.x-original-url;
また、以下の VCL スニペットを使用して X-Rewrite-URL
の設定を解除できます。
unset req.http.x-rewrite-url;
または、これらの値をキャッシュキー [6] や Vary
ヘッダー [7] に含めて、セキュリティドメインでコンテンツがキャッシュされないように設定することができます。エッジキャッシュキーの操作については、Fastly のドキュメント [6] を参照してください。
この攻撃によるリスクの可能性がある場合は、Fastly のサポートチームが問題への対応または回避策の実施をサポートします。
以下の担当者までお問い合わせください。
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14773
https://hackerone.com/reports/487
[1] https://portswigger.net/blog/practical-web-cache-poisoning
[2] https://github.com/rails/rails/issues/29893
[3] https://www.drupal.org/SA-CORE-2018-005
[4] https://symfony.com/cve-2018-14773
[5] https://framework.zend.com/security/advisory/ZF2018-01
[6] https://docs.fastly.com/jp/guides/manipulating-the-cache-key
[7] https://www.fastly.com/jp/blog/best-practices-using-vary-header