金利0無利息キャッシング – キャッシングできます

 | 

2011-04-23

XSSフィルタの誤検出とその対策について

14:36 | XSSフィルタの誤検出とその対策について - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - XSSフィルタの誤検出とその対策について - 金利0無利息キャッシング – キャッシングできます

たまに「XSSフィルタが反応した」ことを指して、そのサービスにはXSSがあると考えてしまう素人や情弱やバカやマヌケがいる。XSSフィルタはその動作原理上、誤検出がつきもので、XSSフィルタが反応したからと言ってそのサービスにXSSがあるとは限らない。この文章ではXSSフィルタが反応したときにWebサービス開発者側がどういった対策を取るべきかについて述べる。

誤検出の問題

自分もIEXSSフィルタには悩まされてきた。技術的な詳細があまり公開されておらず、どういったケースで反応するのかがイマイチわからない部分がある。

基本的な考え方としては

  • ユーザーから送られてくるデータ(及びそれをデコードした結果など)が、レスポンスにそのまま含まれていて
  • 送られたデータにscript実行につながる可能性があるパターンと一致する部分があると

IEXSSフィルタが反応する。

たまたまユーザーから送られてきたクエリが、元々出力されるHTML内に含まれているケースというのがある。典型的にはこういったケース。

そのページのHTMLに元々含まれているscriptタグを送ってしまえば、XSSフィルタは「元々存在していたものなのか」「XSSによって挿入されたものなのか」区別することが困難だからだ。ちなみに、こういった典型的な誤検出に対して自分は「放っておくべき」だと考えている。そんな文字列で実際に検索したがるユーザーはそうそういないだろうし、大きな弊害が無いから(馬鹿なユーザーがFUDをまき散らかさなければ)。ちなみにこのケースではSafariGoogle ChromeXSSフィルタは反応しない。詳しく調べてはいないのだが、WebkitXSSフィルタDOM構造が破壊されて、新しく(危険な)タグが作られた場合に反応するようだ。

SafariGoogle ChromeXSSフィルタが反応しないようなケースでも、IEXSSフィルタが反応するということがある。こういったことを指してIEXSSフィルタバグってると考えている人も多いのではないかと思うのだが、自分はIEXSSフィルタは「より安全側に倒した実装になっていて」「その代わり誤検出も多い」と考えている。WebkitXSSフィルタが検出しないようなXSSを、IEXSSフィルタであればブロックするようなケースが「多く」ある。

誤検出に対する対策

「とりあえずX-XSS-Protectionを付けておけばいいよ」ということは言わないようにしてる。なぜかというと実際にそのサービスにXSSがあったりするからだ。

XSSフィルタが反応するということは、ユーザーから送られてきたデータ(QUERY_STRINGやPOSTされたフォームのデータ)を、レスポンス内のどこかに「そのまま」あるいは「危険な形で」埋め込んでいる箇所があるからで、恣意的に誤検出を引き起こすようなクエリを送っていないにもかかわらずXSSフィルタが反応するのであれば、ユーザーから送られてきたクエリを、どこに、どのように埋め込んでいるのかを入念に確認すべきだ。

X-XSS-Protectionヘッダを使ってXSSフィルタを無効化する必要があると考えているのは以下のようなケース

例えば、ユーザーが送ったデータを一度サーバー側に「保存して」から、リダイレクトして表示するという実装にすれば、ユーザーが送ったデータに依存しないでレスポンスを表示しているので、XSSフィルタの検出は避けられるだろう。ただ「XSSフィルタが反応するのを避ける」というためだけに、面倒な回避手段を取るのであれば、単純にX-XSS-Protectionヘッダを使うのが良いだろう、と考えている。

ほとんどのケースで問題がないが クエリに ( ) が含まれるケースでXSSフィルタが反応して問題が起きる、ということもあった。これは "( + 任意の文字列 + )" というパターンをJavaScript関数呼び出しに使われると判断してフィルタが発動しているようだった。

  • 「ユーザーから送られてきたデータをJavaScript内に動的に埋め込む」という実装を避ければ、こういった誤検出を引き起こす可能性は減るだろう
  • そういった実装は、実際にXSSが起こりがちな部分でもある。

参考文献

mayukimayuki2011/04/23 19:46IEのXSSフィルター発動条件はこの辺が参考になるかもですね。たとえば同サイト内なら効かないとか。
http://blogs.technet.com/b/srd/archive/2008/08/19/ie-8-xss-filter-architecture-implementation.aspx

 |