IEのMIME Sniffing
Internet Explorer の悪名高い Content-Type: 無視という仕様を利用すると、Atom や RDF/RSS を利用してXSSを発生できることがあります。
Atom や RDF を利用したXSS - 葉っぱ日記
そもそもIEがContent-Typeを無視するということを知らなかったので,ちょっと調べてみた.
公式文書にはこのような感じに書かれている.
要約するとこんな感じかな.
IEは以下の4つのデータをもとにMIME Typeを判断する.
- サーバが返すContent-Typeヘッダの値
- 実際のファイルの中身
- ファイルネーム(URLから取得できる)
- レジストリの設定
MIME TypeはIEの内部で既知,未知,曖昧の3種類に分類される.既知はIEにハードコードされたMIMEチェックのテストが書かれているもの,曖昧はtext/plainとapplication/octet-streamと空文字とnull,未知は既知でも曖昧でもないものを意味する.
で,IEは以下の順にチェックする
- Content-Typeが未知のMIME Typeならば,その値が最終的なMIME Typeになる
- Content-Typeが既知もしくは曖昧なMIME Typeならば,ファイルの中身を調べて自動判定した結果が最終的なMIME-Typeになる
- Content-Typeが既知のMIME Typeならば,そのMIME Typeと実際のファイルがバイナリかテキストかをチェックする.共にバイナリもしくは共にテキストであれば,Content-Typeの値が最終的なMIME-Typeになる.
- Content-Typeが既知もしくは曖昧なMIME Typeならば,ファイルの拡張子を取得し,レジストリからMIME Typeを辞書引きし,その値が未知であれば最終的なMIME Typeになる
- レジストリにファイルの拡張子が何らかのアプリケーションに関連づけられていれば,最終的なMIME Typeはapplication/octet-streamになる
- 以上のテストが全て失敗したとき,ファイルの中身がバイナリならapplication/octet-stream,テキストならばtext/plainになる.
要約終わり.
え〜と,なんだか非常にわかりにくい.大抵の場合は1か2なんだと思う.2が問題で,jpegやpngでもHTMLっぽいコードが入っているとHTMLと認識され,そこに悪意あるコードがあればXSSが起こってしまう.その例が以下の記事でも指摘されている.
また,ここに書かれている通りに本当に動作するかというと,1の場合が結構怪しくて,IE7でテストしてみるとファイルの拡張子の方が優先されるっぽい.最初に紹介した記事やこの記事では,拡張子によってIEがMIME Typeを判断することが書かれてある.IE6の場合,未知のものは未知の物としてダウンロードのダイアログが開かれたんだが,MultipleIEsを使ってテストしたので,ちょっと微妙ではある.
以下はIE側の意見.分からなくもないがどうにかならないかなと思う.
During XPSP2 betas, we had the mimesniffing mitigation enabled in all zones by default. We tested the waters with applying the "server knows best, so treat the server-suggested mimetype as authoritative" concept for text/plain mimetype. This led to an outcry on the newsgroups about different file types being rendered as text on XPSP2, and we had to disable the mitigation in the internet zone. One can only imagine the app-compat backlash if we stopped sniffing for all reported mimetypes. Yes, instead of handling that by sniffing in the browser, we could go about asking everybody to fix their servers but not everyone can do that easily. In addition to this, several apps depend on IE to launch them after sniffing the correct clsid from their compound file (OLE structured storage). Its one thing to ask new apps to do the right thing, but a whole different ball-game if you want to switch the entire installed base.
IE content-type logic - IEBlog - Site Home - MSDN Blogs
(追記) IE8以降については以下参照