IE8 XSS Filterの仕様が微妙に変更されていた。

先日、Google 日本語入力のHTTPを見てた id:tokuhirom さんに、HTTPレスポンスヘッダに「X-XSS-Protection: 1; mode=block」というのが含まれるというのを教えてもらったけど、"mode=block" というのが何か分からなかったので調べてみた。
結論としては、今月3月のセキュリティ更新 マイクロソフト セキュリティ情報 MS10-018 - 緊急 : Internet Explorer 用の累積的なセキュリティ更新プログラム (980182) で追加された機能だった。


この累積的な更新プログラムには、そのほかのセキュリティ関連の変更が含まれますか?
この更新プログラムには X-XSS-Protection HTTP ヘッダーへの多層防御の更新が含まれています。具体的には、新しい "mode=block" 構文により、非継続的な誘導によるクロスサイト スクリプティング (reflected cross-site scripting) が検出された場合、XSS フィルターによってページを完全に無効化します。フィルターにページのコンテンツを完全に無効にさせます。例: X-XSS-Protection: 1; mode=block

以前の XSS Filter では、スクリプトをブロックしたときに、スクリプトのソースがブラウザ上で丸見えになってしまい、ユーザに余計な不安感を与えることがあった(例:http://twitter.com/bulkneets/status/15722740655)。今回、MS10-018による変更で、mode=blockがつかない従来どおりの場合でも、ブロックされたスクリプト部分がブラウザ上で表示されることはなくなったし、また mode=block が指定された場合には、ブラウザ上にはスクリプトだけではなくHTML部分も含め何も表示されなくなった(正確には、「#」の1文字だけが表示される)。何も表示されないとそれはそれでユーザが混乱すると思われるので、XSSによるユーザの被害を少しでも減らしたいサイトでは、これまでどおり X-XSS-Protection: 1 を指定しておけばいいように思う。

(追記)
なぜこのような変更が入ったかというと、今年の春の Black Hat EU にて IE8 の XSS Filter がXSSを誤検出したときの挙動を利用して任意のサイトでXSSを発生させるという発表「Universal XSS via IE8s XSS Filters」があったからだと思う。例えば、このスライドの54ページ目には

<img src="http://0x.lv/onerror=alert(1)//">

という文字列が、XSS Filterを誤検知させて通過させると

<img src#"http: 0x.lv onerror=alert(1)//">

となり、XSSするといった例が挙げられている。これらに対する修正と同時に、念には念を入れてHTMLとしてコンテンツを何も表示しないモード(mode=block)が追加されたのだろうと推測される。