セキュリティ研究者らが、Nginxの脆弱な実装に対してアクセス制御の回避、機密キャッシュページの露出、サービス拒否(DoS)状態の誘発、さらには格納型クロスサイトスクリプティング(XSS)攻撃の実行を可能にする新たなキャッシュポイズニング手法「キャッシュキーインジェクション」を明らかにしました。
セキュリティ脆弱性レポート
YesWeHackの研究者Alex Brumen氏による調査では、Webキャッシュが区切り文字を用いずに複数の可変リクエスト値を直接連結してキャッシュキーを生成する際に生じる欠陥が指摘されています。
未キー化のHTTPヘッダーやパラメータを悪用する従来のWebキャッシュポイズニングとは異なり、キャッシュキーインジェクションはすでにキャッシュキーに含まれている値そのものを標的とします。
新たなキャッシュキーインジェクション攻撃
Nginxは多くの場合、スキーム、ホスト、URI、クエリ文字列、Cookie、リクエストヘッダーといったパラメータからキャッシュキーを構築します。`proxy_cache_key “$scheme$host$request_uri$http_accept”;`のような設定は、各要素にキーがあるため一見安全に見えます。
しかし、これらの値の間に明確な境界がないため、2つの異なるリクエストが同一の最終的なキャッシュキーを生成してしまう可能性があります。
例えば、`Accept: */*`ヘッダーを伴う`/home`への正規のリクエストは、`Accept: ome*/*`を使って`/h`にアクセスする攻撃者制御下のリクエストと同一のキャッシュキーを生成する可能性があります。Nginxが攻撃者のレスポンスを先にキャッシュしてしまうと、その後`/home`へアクセスしたユーザーは汚染されたレスポンスを受け取ることになりかねません。

この手法は、アクセス制御ポリシーと組み合わさった場合に深刻な影響をもたらす可能性があります。ある概念実証(PoC)のシナリオでは、Nginxサーバーが`/admin`へのアクセスをlocalhostのみに制限していました。攻撃者は`/ad`をリクエストし、隣接するキー化ヘッダー内の残りの断片を操作することができました。
Nginxがリクエストパスを`/ad`として評価しているにもかかわらず、結果として生じるキャッシュキーは`/admin`のキャッシュ済みレスポンスと衝突し、攻撃者は共有キャッシュから機密コンテンツを取得できてしまいます。
研究者らはまた、キャッシュポイズニングによるサービス拒否(CPDoS)についても実証しました。攻撃者は、正規リソースのキャッシュキーと衝突する存在しないエンドポイントをリクエストできます。オリジンサーバーがキャッシュ済みの404レスポンスを返す場合、実際のページにアクセスしようとするユーザーは、キャッシュエントリが失効または削除されるまで、攻撃者が誘発したエラーを代わりに受け取ってしまう可能性があります。

より深刻なシナリオとして、HTTPスキームの混同が挙げられます。キャッシュキーが`$scheme$host`で始まり、サーバーが任意のHostヘッダーを受け入れ、HTTPとHTTPSの両方が同一のアプリケーションを提供している場合、攻撃者は「s」で始まるHost値を持つHTTPリクエストと、正規のHTTPSリクエストとの間で衝突を発生させることができます。
アプリケーションがHost値をスクリプトソースに反映させている場合、汚染されたキャッシュページが攻撃者制御下のJavaScriptを読み込んでしまい、格納型XSS脆弱性につながる可能性があります。
脆弱性データベースアクセス
この調査ではさらに、特定の条件下ではエッジキャッシュ層としてのCloudflareが回避されうる点にも注意が促されています。Authorizationヘッダーを含むリクエストはCloudflareのキャッシュを回避する一方で、認証済みリクエストを明示的にキャッシュ対象から除外していないNginxのオリジンキャッシュには到達してしまう可能性があります。
こうしたリスクを軽減するため、防御側は生の可変長キャッシュキー要素を連結する方法を避けるべきです。管理者は`”$scheme|$host|$request_uri|$http_accept”`のような区切り文字や構造化されたエンコーディングを実装し、Hostヘッダーを検証し、HTTPとHTTPSの挙動を分離し、認証済みリクエストが共有キャッシュに書き込まれないようにする必要があります。
SOCのアラート調査1件あたりの時間を21分短縮。即座のインシデント対応のためのIOCコンテキストでSOCを強化: TI LookupをSOCに統合する
翻訳元: https://gbhackers.com/new-cache-key-injection-attack/