【翻訳】Firefox における MIME Confusion Attack の防止
この記事は、2016 年 8 月 26 日付で Mozilla Security Blog に投稿された Mitigating MIME Confusion Attacks in Firefox(筆者: Christoph Kerschbaumer)の翻訳です。この翻訳は公式なものではありません。詳しくはこちらをご覧ください。
web サーバが Content-Type を指定しなくとも、web ブラウザはファイルの内容をスキャンしてファイル形式を判別することができます。例えば、スクリプトを受信するリクエストを Firefox から web サーバに投げた結果、web サーバが "image/jpg" の Content-Type でスクリプトを返した場合でも、Firefox は本来のファイル形式を判別できるのでスクリプトが実行されます。この技術は俗に「MIME スニッフィング」と呼ばれており、コンテンツのメタデータが間違っていたり、もしくは完全に欠落していたりしても、コンテンツの解釈に必要な情報を補うことができます。Firefox は正しいファイル形式を判別する際、文脈となる情報(該当する通信のきっかけとなった HTML 要素)を利用したり、ファイルの先頭バイトに書かれたメディアタイプを確認していました。MIME スニッフィングは多くのユーザの web 体験を向上させている一方、MIME confusion attack という攻撃の原因にもなっています。
ユーザから画像をアップロードできる web アプリケーションを例に考えてみましょう。ただし、ユーザが正しい画像を実際にアップロードしたかどうかは確認していないものとします(ファイルの拡張子のみを検査している場合など)。このとき攻撃者は、スクリプトを含むように細工した画像をアップロードできてしまうため、確認作業は十分ではありません。。ブラウザは細工されたファイルを HTML として表示してしまうため、クロスサイトスクリプティング(XSS)攻撃の起きる可能性があります。しかし残念ながら、ファイルが polyglots(2 通りのファイル形式で解釈できるもの)であるかもしれません。例えば、GIF ファイルを細工することにより、画像としても JavaScript としても正しいファイルにすることができます。すなわち、ファイル形式の正しい解釈はコンテキストに依存することになります。
Firefox 50 以降からは、サーバがレスポンスヘッダで "X-Content-Type-Options: nosniff" を送信した場合(仕様)、読み込まれた時のコンテキストと MIME タイプが一致しないスタイルシート、画像、スクリプトを破棄するようになります。より正確に言うと、Content-Type がコンテキストに一致しないファイルが Firefox によってブロックされます(ファイル形式と許可される Content-Type の一覧は下を参照してください)。これにより、先程のような MIME confusion attacks を防ぐことになり、コンソールには次のようなメッセージが表示されます。
スタイルシートの正しい Content-Type
- "text/css"
画像の正しい Content-Type
- "image/" から始まるもの
スクリプトの正しい Content-Type
- "application/javascript"
- "application/x-javascript"
- "application/ecmascript"
- "application/json"
- "text/ecmascript"
- "text/javascript"
- "text/json"