偽装した結果をキャッシュに載せ、他人に配信させる攻撃。
- 攻撃者が
X-Forwarded-Host: evil.comを付けてリクエストする - アプリが
<script src="https://evil.com/app.js">を含む HTML を返す - キャッシュは
Hostと URL だけをキーにしているので、このレスポンスを通常のページとして保存する - 以降、普通にアクセスした人全員に evil.com のスクリプトが配られる
レスポンスを変えるヘッダーがキャッシュキーに入っていないことが原因。
- キャッシュキー: キャッシュが保存済みのレスポンスを探すための値。普通は
Hostと URL だけ - アプリは
X-Forwarded-Hostでレスポンスを変えるのに、キャッシュはそれを見ないので、ヘッダーあり / なしを同じリクエストとして扱う
対策: そのヘッダーをキーに入れる(Vary: X-Forwarded-Host。ヘッダーの値ごとに別々にキャッシュさせる)か、CDN でそのヘッダーを消してアプリに使わせない。