2006年4月3日(月曜日)
CSRFとCSSXSSは分けて議論したい
スラッシュドットに「正しいCSRF対策、してますか? (slashdot.jp)」というトピックが立っているようですが、議論がかなり混乱しているように思います。「hiddenにセッションIDをセットする CSRF 対策は、CSSXSS があるので危険」という話なのですが、CSRF といわゆる CSSXSS は別の問題ですので、分けて議論したいですね。
簡単に言うと、
- hiddenにセッションIDをセットする方法は、CSRF対策としては正しい
- ただし現在、MSIE には HTML の内容をクロスドメインで読めてしまう脆弱性 (いわゆる CSSXSS) があるため、HTML に秘密情報をセットすることには別の危険がある
ということになります。
- hiddenにセッションIDをセットする方法でも、CSSXSS 対策ができていれば問題ない
- 何であれ、CSSXSS 対策ができていなければ危険
ということです。注意したいのは、いわゆる CSSXSS の問題は CSRF に限った話ではないということです。秘密情報は何であれ、CSSXSS 対策をする必要がある (たとえば、GET で得られる HTML の中に出力しないようにする) という話になります。「セッションID」や「CSRF対策のためのワンタイムトークン」などはもちろん、個人情報の編集画面であるとか、Webメールの画面であるとか、そういった画面もすべて問題になるはずです。CSRF 問題のないサイトだから CSSXSS は関係なさそうだ、と思ってしまったりしないように気をつけたいところです。
※ただ、実際には CSSXSS によって取得できるものは限定されていて、何でも取れるわけではありません。基本的には MSIE が CSS の宣言ブロックの中身であるとみなしたものだけが取れるので、たとえば Webメールの画面の本文全体を取る、といったことができるかというと難しいところです。ただ、攻撃者が {} を挿入することができる余地、多バイト文字の一部が {} に解釈される余地などを考えると、あまり安心できなかったりもします。
個人的には、いわゆる CSSXSS は CSRF とは別の問題としてきちんと議論して欲しいし、もっとクローズアップされても良いと思います。まあ、今回の話で十分に注目されていると思うので、それはそれで良いような気もしますけれど。
ちなみに、CSSXSS に対しては利用者側でできる対策があります。それは、
- MSIE を使う場合、スクリプトを無効にする
ということです。現在知られている CSSXSS の攻撃手法では、攻撃者のサイト上でスクリプトを介して cssText プロパティの値にアクセスすることになります。ですから、スクリプトを無効にしておけば CSSXSS の攻撃は受けません。もちろん、MSIE 必須かつスクリプト必須のサイトは利用できませんので、それについてはパッチ待ちとなります (まあ、そんなサイトそうそうありませんが)。
- 「CSRFとCSSXSSは分けて議論したい」へのコメント (9件)
- 前(古い): 2006年3月30日(Thursday)のえび日記
- 次(新しい): 2006年4月9日(Sunday)のえび日記