はじめに
― なぜ「Lax なのに POST が通る」のか ―
SameSite Cookie は、CSRF 対策として 事実上の標準防御になりました。
特に近年は、主要ブラウザ(例:Google Chrome)が SameSite=Lax をデフォルト挙動にしたことで、
「SameSite を書いていない = ある程度安全」
と誤解されがちです。
しかし Chrome には、明確に仕様化された例外があります。
それがいわゆる 「2 分ルール」 です。
本記事では、
- 2 分ルールとは何か
- なぜ Chrome がこの仕様を入れたのか
- 攻撃者はどこを突くのか
- 開発者・ペンテスターが取るべき対策
を 設計思想レベルから解説します。
SameSite の前提
Chrome の現在の基本挙動は以下です。
| Cookie の状態 | Chrome の扱い |
|---|---|
SameSite=Strict |
同一サイトのみ送信 |
SameSite=Lax |
トップレベル GET のみ送信 |
SameSite=None; Secure |
すべて送信 |
| SameSite 未指定 | Lax として扱う |
ここまでが「多くの人が知っている話」です。
問題の核心:2 分ルールとは?
公式仕様を一文で要約すると
SameSite 属性が指定されていない Cookie は、
設定または更新から 2 分以内であれば、
POST を含むクロスサイトリクエストでも送信される。
つまり Chrome は、
- Cookie が「新しすぎる」場合
- 一時的に SameSite 制限を緩和する
という動きをします。
なぜこんな例外が存在するのか?
背景:Web を壊さないための妥協
SameSite が導入された当初、現実の Web には次のようなサイトが大量に存在していました。
- SameSite を 一切指定していない
- ログイン直後に:
- POST フォーム送信
- OAuth コールバック
- iframe 連携
Chrome がいきなり
「SameSite 未指定 = Lax(POST 禁止)」
を厳格適用すると、
世界中の既存サイトが一斉に壊れる
という事態になります。
そこで Chrome は、移行猶予としての例外を設けました。
2 分ルールの正体(時間軸で理解)
T0 サーバーが Set-Cookie(SameSite 未指定)
↓
T0 ~ T+2 分 【例外期間】
├─ クロスサイト GET ✅
├─ クロスサイト POST ✅ ← 本来は禁止
└─ 挙動 ≒ SameSite=None
↓
T+2 分以降
├─ クロスサイト GET ✅
├─ クロスサイト POST ❌
└─ 挙動 = SameSite=Lax
- 変わるのは最初の 2 分だけ
- それ以外は通常の Lax
「更新」も 2 分対象になる理由
重要なのは、Chrome が見ているのは:
Cookie が“いつ作られたか”ではなく
“いつ変更されたか”
という点です。
2 分ウィンドウを再発動させる操作
- ログイン(Set-Cookie)
- ログアウト(Set-Cookie)
- セッション更新
- 状態フラグ更新(例:
isBanned,role)
攻撃者はこの「更新」を狙います
攻撃者視点:なぜ危険なのか?
2 分ルールがあることで、以下が成立します。
- ユーザーに GET リクエストを踏ませる
- Cookie が更新される
- 2 分以内にクロスサイト POST
- Chrome が Cookie を送信
- サーバーは正規操作と誤認
これは:
- XSS 不要
- Cookie 値の取得不要
- ブラウザ挙動は完全に正規
設計ミスがそのまま攻撃面になるパターンです。
よくある誤解
「これは Chrome の脆弱性では?」
→ いいえ。仕様です。
「Lax が破られている?」
→ Lax は守られている。例外条件があるだけ。
「対策はブラウザ任せでいい?」
→ 最も危険な考え方。
防御側の正しい理解
SameSite を必ず明示する
Set-Cookie: session=abc; SameSite=Strict; Secure; HttpOnly
未指定が最大のリスク
Cookie を認可・状態判断に使わない
❌ isAdmin=true
❌ isBanned=false
状態変更は必ず
- POST
- CSRF トークン
- サーバー側検証
ペンテスター向けチェックポイント
- SameSite 未指定 Cookie がある
- login / logout で Cookie が更新される
- POST API が Cookie 存在を前提にしている
- Cookie が状態や権限を持つ
2 分 CSRF チェーン成立の可能性あり
まとめ
Chrome の SameSite 2 分ルールは、
「古い Web を壊さないための安全装置」
ですが、同時に、
「理解していない実装を攻撃に変える装置」
でもあります。
最後に一文で締めます。
SameSite を書いていない Cookie は、
防御ではなく “期待” にすぎない。