CSRFとその対策

最近、縁あってIPAの安全な「ウェブサイトの作り方」を読んでいた。
http://www.ipa.go.jp/security/vuln/websecurity.html

その中で、いまさらながら知らない単語がいくつか出てきていて、中でも「CSRF」が気になったので、メモを残しておく。

CSRF = Cross-site Request Forgery, リクエスト強要
「別のサイトに用意したコンテンツ上の罠のリンクを踏ませること等をきっかけとして、インターネットショッピングの最終決済や退会等Webアプリケーションの重要な処理を呼び出すようユーザを誘導し、被害をもたらす攻撃である。」
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/301.html

標的は、ユーザ管理を行っているようなサイト。
被害を受けるのは、サイトのユーザ。
被害は、ユーザに成りすまして、さまざまな処理(ユーザ登録情報の変更、購入処理など)をされる。

攻撃方法は、主に以下。
セッションにログインしている状態で、悪意サイトに誘導(セッション管理状態で閲覧できるページに悪意サイトのURLを張るなど)。
悪意サイトでは、クライアントの機能を使って、サイトのログイン状態を保ったまま行える処理を書いておく(リンクをクリックすると購入処理を動かすようなリンクを書いておく)。
ユーザが、悪意サイトのリンクをクリックすると、その処理が実行されてしまう。

対策方法は以下。
処理対象ページに、セッションID以外の別の情報(ページトークンIDなど)を埋め込んでおく。この情報は一度だけ使えるワンタイムトークンとしておく。
#ジャックするのが困難な情報をつけてチェックすることで防ぐ。
http://www.jumperz.net/texts/csrf.htm
リファラーを見て制限をかける。
#通常の攻撃は変なページ遷移をしているはずなので、これで防げる。
#実際には、リファラーを返してくれないWebブラウザもある(特に携帯電話)ので、これだけではだめかも。
http://www.ipa.go.jp/security/vuln/documents/website_security.pdf

昔、このようなことができることを利用して、ページ遷移をさせていたことがあったが、やっぱりセキュリティ的にまずいよなぁと改めて思った。