MIMEスニッフィングを利用した脆弱性とその対策方法

この記事は GMOアドマーケティング Advent Calendar 2022 9日目の記事です。

こんにちは、GMOアドマーケティングのR.Yです。
普段はRuby on RailsによるWebサービスの開発やそれらの脆弱性診断などをやっています。

今回はContent-TypeMIMEスニッフィングを悪用した脆弱性とその対策方法について書いていきたいと思います。

Content-Typeとは

Content-TypeはHTTPヘッダーのフィールドになります。Content-Typeには本体(body)として送信するデータが「どんなファイルなのか」がMIMEタイプとして保持されています。そして、WebサーバとWebブラウザ間でファイルのやりとりをする場合はMIMEタイプを参照し、そのファイルをどのように扱うか決めています。

MIMEタイプには
  • text/plain プレーンテキスト
  • text/html HTML文章
  • text/css CSSスタイルシート
  • image/jpeg JPEG画像
  • application/pdf PDF文章
などが含まれます

MIMEスニッフィングとは

MIMEスニッフィングとは、サーバとブラウザがやりとりするファイルのMIMEタイプをブラウザが推定する手法になります。
例えば、レスポンスデータを作成するときContent-Typeヘッダーが欠落しているもしくは、Content-Typeヘッダーに指定されたMIMEタイプと送信されたデータのMIMEタイプが違う場合、ブラウザはMIMEスニッフィングを行い正しいMIMEタイプを推定します。これによりContent-Typeに欠陥があった場合でも問題なくサーバとブラウザ間でやりとりすることができます。

このように一見便利そうに見えるMIMEスニッフィングですが脆弱性を誘発する場合があります。

MIMEスニッフィングを利用した脆弱性の例

前提

・画像を保存/共有するアルバムの機能を持ったWebサービス
・X-Content-Type-Options: nosniff(後述)が設定されていない状態
・通常は今回の例のように画像をアップロードできないことがほとんどなので参考までに

実行例

悪意のあるユーザが「拡張子が.pngのHTMLファイル」を用意し、攻撃用JavaScriptを仕込んでアップロード。
アップロードしたファイルのダウンロードURLを第三者に送信
URLを開いてしまったユーザがサイトにファイルを要求
MIMEスニッフィングによりHTMLファイルとしてブラウザで実行されてしまい、攻撃用JavaScriptが実行される


上記で示した攻撃例は古いバージョンのIEやChromeで実行した場合にしか再現しません。しかし、条件が揃うと容易にセキュリティホールになりうるので対策が必要になります。

対策

この脆弱性はレスポンスヘッダーにX-Content-Type-Options: nosniffを設定することで対策することができます。X-Content-Type-Options: nosniffを設定することによってMIMEスニッフィングを防ぐことができ、先述のような脆弱性を防止することができます。

まとめ

今回はMIMEスニッフィングを利用した脆弱性について書いてみました。最近セキュリティ関連のモチベーションが上がっているので、機会があったらまた別の脆弱性について書きたいと思います。

ここまで読んでいただきありがとうございました!!

明日は@zakisanbaimanさんによる「費用ベースの確約利用割引(Flexible CUD)について」です。
GMOアドマーケティング Advent Calendar 2022をお楽しみください!

■学生インターン募集中!
https://note.gmo-ap.jp/n/nc42c8a60afaf

■エンジニア採用ページはこちら!
https://note.gmo-ap.jp/n/n02cbeb6edb0d

■GMOアドパートナーズ 公式noteはこちら!
https://note.gmo-ap.jp/