gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

CSRF対策の謎

なんかゲームかアニメのようなタイトルにしてみましたが。んっと…状況が見えない(苦笑
いや、発端は http://slashdot.jp/comments.pl?sid=309361&threshold=-1&mode=thread&commentsort=3&op_change=%E5%A4%89%E6%9B%B4 のURL付近をご覧頂きたいのですが。
どうも、CSRF対策の手法をめぐって、某人物が「おかしい」と騒いで引っ込めて…っていう顛末があったようです。…私が見たときにはすでに発端のサイト http://www.jumperz.net/texts/csrf.htm が閉じてしまっていたので状況がじぇんじぇん見えんのですが(苦笑
とりあえず噛み砕くと大変なので、まずはURLを丸呑みしてみませう。
http://www.oiwa.jp/~yutaka/tdiary/20060330.html
http://www.oiwa.jp/~yutaka/tdiary/20060402.html#p01
http://blog.ohgaki.net/index.php/yohgaki/2006/04/02/a_ma_sa_sa_a_ia_ca_sa_rhtmleosa_ia_a_iea
http://d.hatena.ne.jp/hoshikuzu/20051204#P2005204MATANGILLON
このあたりを適宜ご覧くださいませ。
読んでいる限りですとCSSXSS*1ってのがIE6にある脆弱性のようで*2
で、このCSSXSSCSRFとがごっつ相性イイっぽい感じなので面倒である、と。概ねそんな理解ですかねぇ? しばらく業務忙しいんで、ネット上で概ね落ち着いた時点でエッセンスを吸収させてもらいたいとかヌルい事考えてる今日この頃(笑
っつか、いいからとっとと脆弱性直して欲しいもんです。


で。CSSXSSについて、ちと http://tdiary.ishinao.net/20060331.html から参照させていただきたく。

<link rel=stylesheet href="[URL]" type="text/css" />
などの方法で、(X)HTMLドキュメントから[URL]で指定された外部スタイルシートを参照すると、そのURLから返された内容がスタイルシートではなく、通常の(X)HTMLドキュメントであったとしても、JavaScript(などのIEが持つ拡張機能)を使ってその内容を取得することができる。
ただし、あらゆるドキュメントが取得できるわけではなく、その内容がある程度スタイルシート定義テキストに似ている(文字要素としてスタイルシート定義で使われる記号が含まれる、など)必要があるようだ。しかし、その細かい条件については定かではない。実験によってある程度は解析できるが、確実な条件は設定できない(=プログラムロジックで判別できない)。
また、上記linkで指定されたURLの内容をブラウザが取得しに行く際には、その時点でそのURL(ドメイン)に対してブラウザ(=閲覧者)が持つ権限が利用される。
たとえば、そのURLにアクセスするためには本来ログインが必要な場合でも、そのブラウザがそのURLで提供されるサービスにおいて、ログイン済みの状態になっているのならば、たとえ他サイト(サービス)上の本来認証しないとみられないはずの情報にも、アクセスすることができる。
具体的には、もしアクセス者がmixiはてなにログイン済みだった場合、http://free.example.com/cssxss.htmlなどに設置された攻撃コードから、http://mixi.jp/home.plhttp://www.hatena.ne.jp/などにアクセスすることで、各サービスにそのアクセス者が認証状態のときに表示されるページを構成するHTMLが取得でき、そこに表示された情報(たとえばアカウント名やプロフィール情報など)を読み取ることができる(本当に上記URLにCSSXSSアクセス可能かどうかは未確認)。
これだけでも大問題なのだが、さらに問題なのがCSRF攻撃と組み合わせた場合だ。
CSRF(Web上のサービスで提供されている機能を、他人の権限で操作する攻撃)に対する一般的な対策は、ある程度重要な機能を実行する前の認証チェックは、Cookieのようにアクセスしたら自動的にブラウザから送信される情報だけで行わず、フォームのhiddenフィールドなどを使って「攻撃者が知りえない」&「アクセスしただけで自動送信されない」認証情報を付与し、二重に認証チェックすることによって、攻撃を防ぐ方法だ。
ほかにも対策はあるが、この方法は利用者のユーザビリティをほとんど下げることなく、CSRF対策が行える。
しかしCSSXSSをつかえば、CSRF対策のためにフォームのhiddenフィールドなどにセットしたもう一つの認証情報を、攻撃者が盗むことが可能になる。そして、それを利用して外部サイトからCSRF攻撃を成功することが可能になる。
というように非常に重大な問題でありながらも、もう数カ月も修正されずにマイクロソフトによって放置されているCSSXSSだが、ブラウザ側の修正を待たずにサーバー側で対策を行うことは可能だろうか。
その答えとしては、ある特定された状況における問題を回避するように修正することは可能であろう。しかし、CSSXSSという問題に対して、抜本的な対策をサーバーサイドのみで行うことは、現在のWebアプリケーションの設計手法を根本から変えない限りは、不可能だ。

………やれやれ、である。

*1:いいけど…なっがいなぁ…

*2:ちなみに、現時点においてはIE7では「ない」っぽいとの報告がユーザ側からありました