yohgaki's blog - 画像ファイルにPHPコードを埋め込む攻撃は既知の問題

土曜日は、普通の人なので普通のキャンプに行ったら普通以上に快晴だったので普通に河で泳いだりしてました。そんなどうでもよい話ははともかく。
今さらいうまでもないこと(と個人的には思っています)ですが、画像ファイルへのデータの埋め込みは、PHPのコードだけでなくHTMLやJavaScriptのコードなども埋め込むことができます。IEでそういったHTMLやスクリプトを埋め込んだ画像ファイルを開いた場合、Content-Type を無視してHTMLファイルであると判断することがあるため、XSSさせることができます。画像ファイルとして正しいデータを持たせつつスクリプトを埋め込むという方法を採ることで、


- ファイルの拡張子をチェックする
- イメージ関数等を利用して画像の種類を判別する
- ファイルヘッダを確認する
- ファイル種別を判別するコマンドを利用する
という検査を全て行ったとしても、検査を突破することができます。Webアプリケーション側での簡単かつ効果の高い防御方法としては、PHPコードの埋め込み対策として yohgaki さんが書かれている

完全な対策はこれらのチェックをした後、画像ファイルを別型式に変換し、元の形式に戻す方法です。例えば、GIFファイルのアップロードならGIF->PNG->GIFと変換します。変換の過程で攻撃コードは削除されます。
と同じ方法を適用できますが、アニメーションGIFには適用できないなどの制限もあります。
PHPのコードの埋め込みと異なり、IEのContent-Type無視についてはブラウザ側がきちんとContent-Typeに応じた処理をするように対応するべきだと思います。が、何度Microsoftに問い合わせても「仕様です」の回答ですので、Webアプリケーション側で対策するしかないのでしょう…。上に書いたように、アニメーションGIFの問題などもありどこにでも適用可能で簡単かつ効果的な方法というのは難しいのでしょうか…。
追記: 上記のような「画像として正しく表示可能であるものの、IEに対してはHTMLであると判断されるファイル」は、PNGおよびBMPで作成可能なことを確認しています。JPEGおよびGIFについては一部制限付きで作成可能なことを確認しました。