Help us understand the problem. What is going on with this article?

X-Content-TypeOptionsについてと、それにまつわる脆弱性

X-Content-TypeOptionsとは

MIMEタイプの解釈を厳密にし、MIMEタイプをブラウザに誤認させるタイプの攻撃や、JSONハイジャック攻撃を防ぐことが出来るもの。

攻撃については下でざっくり説明しますが、アプリ側が想定してるMIMEタイプ(ContentType)とは違うタイプで誤認されてしまうと、これを使った攻撃ができちゃうよ!ということ。

どんな時に使うの?

古いIEはレスポンスヘッダContent-Typeを無視して、拡張子を元にMIMEタイプを判断する性質がある。
この脆弱性の対策として、IE8以降であればレスポンスヘッダに「X-Content-TypeOptions: nosniff」を設定することでレスポンスヘッダを元にMIMEタイプを判定するように修正することが可能。
ただこの指定を行なってもIE7以前では防げないので注意。

IE7以前でも対策したい場合は?

→ JSONの > や <のエスケープを行う。
JSON内にXSSを発生させる文字が出現しなくなるので、MIMEタイプの誤認が発生したしてもXSSは起こらなくなります。
ここまでやるのかは方針によってだと思いますが…。

ちなみにPHPの場合、json_encodeのオプションパラメータとして JSON_HEX_TAG などを指定することで、小なり記号などのエスケープが可能

設定方法は?

Apacheのhttp.confファイルに以下を記述
設定変更はApacheの再起動かけないと反映されないので注意

Header always append X-Content-Type-Options: nosniff

対策となる脆弱性の例

  1. MIMEタイプをブラウザに誤認させるタイプの攻撃
     - JSONを直接表示することによるXSS
     - ファイルダウンロードによるクロスサイト•スクリプティング

  2. JSONハイジャック攻撃

がメイン。
一つ一つ、ざっくり概要だけまとめます

1.JSONを直接表示することによるXSS(MIMEタイプをブラウザに誤認させるタイプの攻撃)

対象機能 JSONを生成するAPI
想定されるシーン メールに記載されている罠サイトや攻撃を受けたサイトなど、罠サイト閲覧により
リスク ユーザー側のブラウザで不正なJavaScriptが実行されたり、偽情報を表示されたりする

JSONを返す処理で、JSON以外のContent-Typeに誤認されることで、ファイル内のJavaScriptが実行されてしまう。
例えばJSONを返す処理なのにMIMEタイプの指定が抜けていたりすると、デフォルトのtext/htmlとして扱われてしまいファイル内のJavaScriptが実行されてしまったり…

JSONを返すwebAPIは通常XML HttpRequestによるアクセスを想定していますが、APIが返すレスポンスデータがブラウザで直接閲覧されることにより攻撃が可能になる場合があります

・攻撃が可能なパターン
正しくないMIMEタイプで認識されることでおこる。
基本的にはMIMEタイプを正しく設定していれば問題ありませんが、古いIEではリスクが残ってしまう

対策

優先度 対応内容
必須 MIMEタイプを正しく設定
強く推奨 レスポンスヘッダ「X-Content-TypeOptions: nosniff」を設定
推奨 小なり記号などをUnicodeエスケープ
推奨 XML HttpRequestなどCORS対応の機能だけから呼び出せるようにする

2.ファイルダウンロードによるXSS(MIMEタイプをブラウザに誤認させるタイプの攻撃)

対象となる機能 ファイルのアップロード、ダウンロード機能
リスク なりすまし。特にセッション管理や認証のあるページでは被害が大きい

アップロードしたファイルを利用者がダウンロードする際に、ブラウザがファイルタイプを誤認する場合がある。
例えばPDFファイルを想定しているにも関わらずPDFデータ内にHTMLタグが埋め込まれている場合、条件によってはブラウザかまHTMLファイルと誤認されてしまい、JavaScriptが埋め込まれていた場合に実行されてしまう。
(攻撃を仕掛ける場合は攻撃者がアプリケーション利用者に罠を仕掛けて誤認させるように仕向ける)

IEの動作について
ダウンロードコンテンツをIEが処理する場合、そのContent-Typeが IEの扱えるものかを判断し、扱えるものはC ontent-Typeに従って処理を行う。
しかし扱えない種類の場合、URLに含まれる拡張子からファイルタイプを判定していまう。

ファイルダウンロード時の対策

優先度 対応内容
必須 ファイルのContent-Typeを正しく設定する
必須 レスポンスヘッダX-Content-Options: nosniff を出力
必要に応じて ダウンロードを想定したファイルにはレスポンスヘッダとしてContent-Disposition:attachment を指定する(アプリ側で開かずダウンロードファイルの指定になる)

3.JSONハイジャック

対象となる機能 JSONを出力するAPIに秘密情報を提供しているもの
想定されるシーン リンクのクリックなど、罠サイトの閲覧により
リスク 情報を抜かれることで起こるなりすましなど

通常JSONデータをscript要素で受け取ることはできないが、JSONを script要素で受け取るための手法をJSONハイジャックという。
(例外: JSONPでは JSONをコールバック関数の引数にすることでアプリケーションからデータを受け取ることができる。)

基本的にはブラウザ側の脆弱性であり(過去古いfire Foxで脆弱性があった)、現在はブラウザ側で対応されていますが、JSONハイジャックの手法は常に考案されていてその度に対策する背景があるため、アプリ側でも対応しておく方がよい。

対策

優先度 対応内容
強く推奨 レスポンスヘッダ「X-Content-TypeOptions: nosniff」を設定
推奨 リクエストヘッダ X-Requested-With: XMLHttpRequestの確認
推奨 XMLHttpRequestなどCORS対応の機能だけから呼び出せるようにする

以上X-Content-TypeOptionsについてと、それにまつわる脆弱性の例でした。

hatomaru
勉強したことの備忘録です。 【言語】 PHP JavaScript HTML CSS 【OS】Linux 【DB】 Oracle MySQL 【フレームワーク】Laravel
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away