utsuroi csrf labs Lab 05 / 5 — Practitioner
05

SameSite=None の罠 — サードパーティ連携の代償

SameSite=None reopens CSRF for legacy integrations

Chrome 80(2020年)以降、Cookie の SameSite 属性のデフォルトが Lax になり、古典的な POST CSRF はブラウザレベルで自動的に防がれるようになりました。

ところが、うつろい EC は外部の決済サービス(beauty-pay.example)と iframe 連携しているため、決済フロー中に Cookie が必要。SameSite=Lax だと iframe 越しに Cookie が送信されないので、開発者はセッション Cookie に SameSite=None; Secure を設定した。

これにより古典的な CSRF 攻撃面が復活。攻撃者は罠サイトから cross-site で POST すれば、被害者の認証 Cookie が添付されてしまう。

Cookie の SameSite 属性を切り替えて、各ケースで CSRF が成立するかしないかを観察してください。SameSite=None でのみ攻撃が成立するはず。

shop.utsuroi.example.com / mypage
攻撃者ドメイン(beauty-news.evil)から POST
POST /account/email HTTP/1.1
Host: shop.utsuroi.example.com
Origin: https://beauty-news.evil
Cookie: session=victim_xxx
SameSite 属性ごとの挙動
SameSite=None; Secure
→ cross-site POST でも Cookie が送信される
→ サーバは Cookie を見て「正規ユーザ」と判定
→ CSRF 成立
ヒント — 各設定で何を試すか

3つのモード(Strict / Lax / None)それぞれで「攻撃を実行」を押して結果を比較してください。None でのみ CSRF が成立し、StrictLax ではブラウザが Cookie 自体を送らないため、サーバ側の脆弱性に到達できません。

正解(ネタバレ)
  • Strict — cross-site から Cookie 一切送らず → 攻撃失敗
  • Lax — POST フォーム送信時は Cookie 送らない → 攻撃失敗
  • None — cross-site でも Cookie 送る → 攻撃成立

つまり Chrome 80 以降のデフォルト(Lax)では古典的 POST CSRF は防がれます。逆に「サードパーティ連携のために None にした」場合、Token 等の追加対策がなければ簡単に攻撃される。