SameSite=Lax と CSRF
ある Web アプリケーションは,セッション Cookie に SameSite=Lax を指定しているが,トークンなどの他の CSRF 対策は行っていない。また,会員の退会処理を GET /account/delete というリクエストで受け付けている。ログイン中の利用者を攻撃者が罠サイトに誘導した場合の記述として,適切なものはどれか。
- ア罠サイトのリンクから退会処理の URL へトップレベルの遷移をさせると,安全なメソッドである GET による遷移なので Cookie が送信され,退会処理が実行され得る。
- イSameSite=Lax の Cookie はクロスサイトのリクエストには一切送信されないので,罠サイトを経由した CSRF は成立しない。
- ウ罠サイトの img 要素の src 属性に退会処理の URL を指定すると,画像を読み込むリクエストに Cookie が送信され,退会処理が実行される。
- エCookie に Secure 属性も指定すれば,罠サイトから送られたリクエストには Cookie が付与されなくなるので,CSRF を防止できる。
正解と解説を見る
正解 ア
この問題の基礎知識
- CSRF は,ログイン中の利用者を罠サイトに誘導し,ブラウザが自動で付与するセッション Cookie を利用して,利用者の意図しないリクエストを Web アプリケーションに送らせる攻撃である。
- SameSite 属性はクロスサイトのリクエストに Cookie を付けるかを制御し,Strict は付けない,Lax は GET などの安全なメソッドによるトップレベル遷移でだけ付ける,None は常に付ける。
- トップレベル遷移とは,リンクの選択などでブラウザに表示するページ自体が移る遷移であり,img 要素などによるサブリソースの読込みは含まれない。
- Secure 属性は HTTPS 通信でだけ Cookie を送らせる属性,HttpOnly 属性は JavaScript からの読取りを禁止する属性であり,リクエストの発生元による送信の制御ではない。
ア罠サイトのリンクから退会処理の URL へトップレベルの遷移をさせると,安全なメソッドである GET による遷移なので Cookie が送信され,退会処理が実行され得る。正解
Lax の Cookie は,リンクの選択など安全な HTTP メソッドによるクロスサイトのトップレベル遷移では送信される。状態を変更する処理を GET で受け付けていると,SameSite=Lax だけでは CSRF を防げない。
イSameSite=Lax の Cookie はクロスサイトのリクエストには一切送信されないので,罠サイトを経由した CSRF は成立しない。
クロスサイトのリクエストに対して,外部のリンクからのトップレベル遷移も含めて Cookie を送らないのは SameSite=Strict である。Lax は安全なメソッドによるトップレベル遷移では Cookie を送信する。
ウ罠サイトの img 要素の src 属性に退会処理の URL を指定すると,画像を読み込むリクエストに Cookie が送信され,退会処理が実行される。
Lax の Cookie は,トップレベル遷移以外のクロスサイトのリクエストには送信されない。img 要素による画像の読込みはトップレベル遷移ではないので Cookie は付与されず,ログイン中の利用者として処理されない。
エCookie に Secure 属性も指定すれば,罠サイトから送られたリクエストには Cookie が付与されなくなるので,CSRF を防止できる。
Secure 属性は,Cookie を HTTPS などの安全な通信路でだけ送信させる属性であり,リクエストの発生元のサイトによって送信を制限するものではない。罠サイトから HTTPS で送られたリクエストにも Cookie は付与される。
検証用の出典出典照合済み
OWASP Cross-Site Request Forgery Prevention Cheat Sheet / draft-ietf-httpbis-rfc6265bis Cookies: HTTP State Management Mechanism照合の根拠(5 件)
- ア(正解)・イ(誤り): Lax の Cookie はクロスサイトのトップレベル遷移では送られる
If the value is "Lax", the cookie will be sent with same-site requests, and with "cross-site" top-level navigations, as described in Section 5.6.7.1 .
draft-ietf-httpbis-rfc6265bis-22 · Section 4.1.2.7(新しいタブで開きます) - イ(誤り): クロスサイトのリクエストに Cookie を送らないのは Strict
If the "SameSite" attribute's value is "Strict", the cookie will only be sent along with "same-site" requests.
draft-ietf-httpbis-rfc6265bis-22 · Section 4.1.2.7(新しいタブで開きます) - ア(正解)・ウ(誤り): 例外は安全なメソッドによるトップレベル遷移に限られ,img 要素による読込みには Cookie は付かない
exception which sends same-site cookies along with cross-site requests if and only if they are top-level navigations which use a "safe" (in the [ HTTP ] sense) HTTP method.
draft-ietf-httpbis-rfc6265bis-22 · Section 5.6.7.1(新しいタブで開きます) - ア(正解): Lax は安全でないメソッドによる CSRF への多層防御にとどまり,GET で状態を変える処理は守れない
Lax enforcement provides reasonable defense in depth against CSRF attacks that rely on unsafe HTTP methods (like POST ), but does not offer a robust defense against CSRF as a general category of attack:
draft-ietf-httpbis-rfc6265bis-22 · Section 5.6.7.1(新しいタブで開きます) - エ(誤り): Secure 属性は安全な通信路でだけ送る指定であり,リクエストの発生元サイトで送信を制限しない
When a cookie has the Secure attribute, the user agent will include the cookie in an HTTP request only if the request is transmitted over a secure channel
draft-ietf-httpbis-rfc6265bis-22 · Section 4.1.2.5(新しいタブで開きます)
退会処理を GET /account/delete で受け付けているので,罠サイトのリンクからのトップレベル遷移(安全なメソッド GET)には Lax の Cookie が付与され,退会処理が実行され得る。