Shikata Ga Nai

Private? There is no such things.

静的ファイル拡張子のキャッシュルールを悪用するWeb Cache Deception攻撃

Hello there, ('ω')ノ

✅ この攻撃の概要

多くのCDNやキャッシュサーバーは、以下のような静的ファイル拡張子(例:.css, .js, .png)を含むリクエストをキャッシュ対象と判断します:

/account.css, /user.js, /profile.png

しかし、アプリケーション側(オリジンサーバー)がこの拡張子を無視して処理している場合、以下のようなズレが生じます:

キャッシュの解釈 アプリの解釈
/account.css 静的ファイル → キャッシュ対象 /account として動的に処理

🎯 攻撃の本質

攻撃者が**.cssなどの静的拡張子を付けて**被害者のページにアクセスさせると:

  1. キャッシュサーバーが「静的だ」と思い込んで保存
  2. アプリは動的ページとして処理し、個人情報などを含むレスポンスを返す
  3. キャッシュがそのレスポンスを保存
  4. 攻撃者が同じURLにアクセス → 被害者の個人情報が含まれたレスポンスが表示される

🧪 攻撃URLの例

/account.css
/profile.js
/dashboard.png

これらは見た目は静的ですが、アプリケーションが動的ページとして処理する場合が多いです。


✅ 攻撃を成功させる条件

条件 内容
キャッシュサーバーが.css等をキャッシュ対象と認識する 多くのCDNではデフォルト
アプリが拡張子を無視する、または正規化する /account.css/account として処理される
被害者がそのURLにアクセスする 誘導、XSS、メールリンクなどで誘発
攻撃者が同じURLでキャッシュを取得 機密情報が含まれているか確認

🧠 攻撃のポイントまとめ

  • 静的拡張子 ≠ 静的コンテンツ
  • 拡張子がキャッシュされるかどうかはサーバーとCDNの解釈の差による
  • パスの末尾に偽装拡張子を追加して、本来はキャッシュ非対象のデータをキャッシュさせる

✅ まとめ

.css.jsを付けただけのURLでも、アプリが拡張子を無視していればWeb Cache Deceptionは成立します。

攻撃対象 対応の注意点
/account.css オリジンが/accountと解釈して動的データを返すか要確認
/profile.png CDNが静的だと思いこみ、保存してしまうリスクあり

Best regards, (^^ゞ