MIME スニッフィング
MIME スニッフィング とは何ですか?
MIME スニッフィングブラウザがレスポンスのバイト列からコンテンツタイプを推測する挙動。攻撃者にアップロードファイルをスクリプトとして実行されるリスクがある。
MIME スニッフィングは、ブラウザがレスポンスの先頭バイトを調べ、サーバーが宣言した Content-Type ヘッダーを上書きしてリソースをより有用に描画する、レガシーなブラウザ機能です。アプリケーションがユーザーのアップロードファイルを誤ったタイプや汎用的なタイプで配信すると、攻撃者はこれを悪用します。HTML や JavaScript を含むファイルが text/html としてスニッフされ、被害者のオリジンで実行されて、保存型 XSS を引き起こす可能性があります。
この挙動は初期の Internet Explorer にさかのぼり、その積極的なスニッフィングは「コンテンツタイプ混同」による XSS の悪名高い原因でした。Microsoft は IE8(2008 年)でオプトアウトの X-Content-Type-Options: nosniff を導入し、現在では WHATWG Fetch 仕様の MIME Sniffing Standard によって標準化されています。nosniff を送信すると、ブラウザは宣言されたタイプを尊重するよう強制され、Content-Type がリクエストの宛先と一致しないスクリプトやスタイルシートの実行を拒否します。最新のハードニングでは複数の対策を重ねます。ユーザー提供のすべてのファイルを正確で具体的な Content-Type で配信し、必要に応じて Content-Disposition: attachment を付与すること、ユーザーコンテンツを分離したサンドボックスオリジンでホストすること、そして厳格な Content-Security-Policy を適用することです。セキュリティスキャナーやヘッダー評価ツール(例えば Mozilla Observatory)は、nosniff を欠いた HTML レスポンスを指摘します。
flowchart TD
A[ユーザーがファイルをアップロード] --> B[アプリが誤った/汎用的な<br/>タイプで返却]
B --> C{X-Content-Type-Options:<br/>nosniff は設定済み?}
C -- いいえ --> D[ブラウザがバイト列をスニッフし<br/>text/html として描画]
D --> E[保存型 XSS が<br/>被害者のオリジンで実行]
C -- はい --> F[ブラウザが宣言された<br/>タイプを尊重]
F --> G[ファイルはダウンロードされ、実行されない]● 例
- 01
X-Content-Type-Options: nosniff
- 02
アバターアップロードのエンドポイントが image/png を返すが、ファイルの中身は HTML。nosniff がないと、ブラウザはそれをページとして実行してしまう。
● よくある質問
MIME スニッフィング とは何ですか?
ブラウザがレスポンスのバイト列からコンテンツタイプを推測する挙動。攻撃者にアップロードファイルをスクリプトとして実行されるリスクがある。 サイバーセキュリティの アプリケーションセキュリティ カテゴリに属します。
MIME スニッフィング とはどういう意味ですか?
ブラウザがレスポンスのバイト列からコンテンツタイプを推測する挙動。攻撃者にアップロードファイルをスクリプトとして実行されるリスクがある。
MIME スニッフィング からどのように防御しますか?
MIME スニッフィング に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。