X-Content-Type-Options: nosniff つかわないやつは死ねばいいのに!


2011-01-06: IE8ということを追記 & ちょっと間違いを修正。
あけましておめでとうございます。
年明け早々ですが、Internet Explorerの話題です。IEはご存じの通り、Content-Type だけでなくコンテンツの内容なども sniff することでファイルタイプを決定しているため、画像ファイルやテキストファイルをHTMLと判定してしまい、クロスサイトスクリプティングが発生することが昔からたびたび報告されていました*1。現在は幾分マシになったとはいえ、IEのファイルタイプの判定アルゴリズムは非常に難解であり、現在でも状況によってはWebサイト運営者のまったく意図していないかたちでのXSSが発生する可能性があったりします。そういうわけで、IEがコンテンツを sniff してHTML以外のものをHTML扱いしてしまうことを防ぐために、動的にコンテンツを生成している場合には、とにかくあらゆるコンテンツのレスポンスヘッダに X-Content-Type-Options: nosniff を付与するようにしましょう。少なくとも、IE8以降ではHTML以外のものがHTML扱いされてXSSが発生する、ということはなくなります*2。これを付与することによる副作用は

  • 間違った Content-Type を吐きだした場合にIE上でも化けて表示される
  • レスポンスヘッダの分だけ、ちょっとだけレスポンスのサイズが大きくなる

くらいです。前者はそもそも間違えたContent-Typeを吐いているという状況がおかしいので、Webアプリケーション側が修正すべきで、後者についてはたかだか33バイトなので我慢してください。

X-Content-Type-Options: nosniff を使っていない場合に起こり得るXSSのシナリオとしては、サーバ側ではPDFを動的に生成(あるいはユーザからアップロード可能)となっていたが、被害者のWindowsにはPDF readerがインストールされていないので Content-Type: application/pdf は未知であり、HTMLと判定されてXSS が発生、などが考えられます。

まあ、死ぬべきは IE だというのはまっとうな意見ですね → https://twitter.com/#!/kazuho/status/22828878628126720