23
15

More than 3 years have passed since last update.

SameSite属性の付与によるCSRF脆弱性対策

Last updated at Posted at 2020-06-03

概要

CookieにSameSite属性を付与することで、CSRF脆弱性1に対していくらかの防御ができる。

  • SameSite属性はStrict,Lax,Noneの3つの値を取り、設定値により効果の範囲は異なる
    • Strictを設定することで、CSRFを防げる。ただし、Webサイトの使いやすさが損なわれる場合がある
    • Laxを設定することで、POSTメソッドのリクエストのみを受け付ける処理でCSRFを防げる
    • None は従来通りの動作であり、外部サイトからCookieを送信する
    • Webサイトのセキュリティ要件により、設定すべき値が異なる
  • SameSite属性は主要なブラウザすべてで対応されている

SameSite属性の付与がCSRF脆弱性への防御とならないケース

SameSite=StrictとSameSite=Laxの違い

Cookieを発行してセッション情報を保持するようなWebサイトにおいて、ログイン済みの状態でアクセスした際の挙動が異なる。

SameSite=Strict

外部サイトからは常にCookieを送信しない。
POSTメソッドだけでなく、GETメソッドでの遷移時(Top Level Navigation)にも送信されなくなる。

このため、ログイン済みのサイトに対して、外部サイトから遷移し直すと、未ログイン状態として処理される。
過度に不便なようにも思えるが、銀行などのWebサイトでは、ログイン済みのページに対する外部サイトからのリンクを望んでいないため、最も適切とされる。

SameSite=Lax

外部サイトからのGETメソッドでの遷移時(Top Level Navigation)のみ、Cookieを送信する。
これにより、Webサイトの使いやすさとセキュリティを両立させることができる。

外部サイトからのPOSTメソッドや画像読み込み、Ajaxで用いられるXMLHttpRequest(XHR)、iframeでの埋め込みによるリクエストでは、Cookieを送信しない。
このため、該当の処理の実行がCookieを必要としており、POSTメソッドのリクエストのみを受け付けるように制御できていれば、CSRFを防げる。

ただし、Top Level Navigationとなる攻撃手法への耐性はない
このため、GETメソッドのリクエストを受け付ける処理に対しては、依然としてToken Based Mitigationなどの対策が必要となる。

ミドルウェアでのSameSite属性の付与方法

Tomcat

Tomcat 9.0.21または8.5.42以降では、CookieProcessorを利用して付与することができる。

META-INF/content.xml
<Context>
 <CookieProcessor sameSiteCookies="strict" />
</Context>

Apache HTTP Server

Apache HTTP Server
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=Strict
Apache HTTP Server 2.2.4未満
Header set Set-Cookie HttpOnly;Secure;SameSite=Strict

参考資料

23
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
15