セキュリティ脆弱性の一つであるCSRF (クロス・サイト・リクエスト・フォージェリ) について簡単に纏めてみた。
CSRFを一言で言うと、攻撃者により、webサイトの利用者が意図しないリクエストがwebサイトに対して実行されてしまうセキュリティ脆弱性のこと。
攻撃のメカニズム
- ユーザはwebサイトA(正規のサイト)にログインしている状態。(前提条件)
- ユーザは攻撃者が用意したwebサイトB(悪意のあるサイト)にアクセスする。
- webサイトBからダウンロードされたJavaScriptがユーザのwebブラウザ上で動作し、そのJavaScriptがwebサイトAに対して、ユーザの意図しないリクエストを行う。これにより、例えば、webサイトAが掲示板の場合、ユーザが意図しない書き込み等が行われてしまう。
この攻撃は、ユーザはwebサイトAにログインしている状態であり、webサイトA側からすると正規のユーザからのリクエストに見えてしまうので、webサイトAでの権限チェックなどでは防げない。
なお、webサイトB由来のJavaScriptがwebサイトAに対してリクエストを出すのは「同一生成元ポリシー」に反するので、webブラウザ側でブロックできるのは?と思った。しかし、調べたところ、上記の 3. の攻撃で使用されるであろう form タグの action 属性には同一生成元ポリシーが適用されず、任意のURLを指定できるようなので、ブロックできないらしい。
対策
webサイト利用者側
攻撃の前提条件はwebサイトにログインしていることなので、利用が終わったwebサイトからはこまめにログインする。
webサイト側
フォームが入ったページをクライアント側に返す時はページにCSRFトークンを含めて、クライアントからフォームデータが来たら、それに含まれているトークンをチェックする。