mediaプラグインのGIFAR対策

Mediaプラグインは、アップロードファイルしたファイルそのもの(transfer/以下)への直接アクセス表示を非推奨として、代わりにfilter/以下に出力したVersionファイルの表示を推奨しています。
特に画像ファイル等に、セキュリティ上の理由があるためだそうですが、その例として上げられていた、「GIFAR」について、Versionファイル作成で対策になっているのか検証しました。


どうやらVersionファイル化することで、画像のGIFAR対策はOKのようです (^^)

直接アクセスした場合の問題

transferディレクトリへのアクセスを禁止する理由は、こちらの「4.」を参考にしました。
http://d.hatena.ne.jp/cake-memo/20091125

具体例として、以下の2つが挙げられています。

  1. IE MIME Sniffing

内容:IEのMIME Sniffing - てきとうなメモ
こちらは、Versionファイル作成の際、mineTypeチェック行なっているので対策になるのだろうと納得*1

  1. GIFAR

こちらが初耳でした。

GIFARって何?

調べてみると、ユーザにファイルアップロードさせるのが怖くなります。。。
GIFを隠れ蓑に悪性Javaを勝手に実行 | 日経 xTECH(クロステック)
https://www.netsecurity.ne.jp/3_13240.html
アップロードした画像表示だけでは問題ないのに・・・というあたりがイヤらしい (>_<)
GIFARの脅威って - 赤羽橋日記


上記、2番目と3番目の記事に、再現方法が記載してあったので、これらを参考にして検証してみました。

GIFAR画像の作成

まず、jarファイルを用意します。
HelloWorldを出力するだけの、ごく単純なjarです。

[cake@cake webroot]$ java -jar hello.jar
Hello World

このhello.jarを、GIF画像と繋ぎ合わせてGIFARを作ります。

[cake@cake webroot]$ cat Image3.gif hello.jar > gifarImage3.gif

これだけです。


これだけで、ファイル種類を調べると、元の画像と同じGIF。

[cake@cake webroot]$ file hello.jar
hello.jar: Zip archive data, at least v2.0 to extract
[cake@cake webroot]$ file Image3.gif
Image3.gif: GIF image data, version 89a, 100 x 100
[cake@cake webroot]$ file gifarImage3.gif
gifarImage3.gif: GIF image data, version 89a, 100 x 100

でも、Javaとして実行可能なGIFARファイルのできあがり・・・

[cake@cake webroot]$ java -jar gifarImage3.gif
Hello World

GIFARファイルをアップロード

このGIFARファイルをmediaプラグインでアップロードすると、一見なんの変哲もないGIF画像としてアップロードされました。

transfer以下の画像は、GIFファイルなのに、Javaとして実行可能なままで保管されていました。

[cake@cake webroot]$ file media/transfer/img/4b8395a6-2714-42a2-83aa-0a8bc0a80b08.gif
media/transfer/img/4b8395a6-2714-42a2-83aa-0a8bc0a80b08.gif: GIF image data, version 89a, 100 x 100

[cake@cake webroot]$ java -jar media/transfer/img/4b8395a6-2714-42a2-83aa-0a8bc0a80b08.gif
Hello World


では、filter以下に出力された画像は・・・?

[cake@cake webroot]$ file media/filter/m/transfer/img/4b8395a6-2714-42a2-83aa-0a8bc0a80b08.gif
media/filter/m/transfer/img/4b8395a6-2714-42a2-83aa-0a8bc0a80b08.gif: GIF image data, version 87a, 100 x 100

[cake@cake webroot]$ java -jar media/filter/m/transfer/img/4b8395a6-2714-42a2-83aa-0a8bc0a80b08.gif
Invalid or corrupt jarfile media/filter/m/transfer/img/4b8395a6-2714-42a2-83aa-0a8bc0a80b08.gif

みごと、Java実行エラーになりました!!

ブラウザ上でも、画像表示に問題ありませんでした。


その他、JPEG, PNGでも試して見ましたが、どちらも結果はGIFと同様でした。

[cake@cake webroot]$ cat Image1.jpg hello.jar > gifarImage1.jpg
[cake@cake webroot]$ java -jar gifarImage1.jpg
Hello World

[cake@cake webroot]$ java -jar media/transfer/img/4b839846-a0e0-4c76-a671-0a8dc0a80b08.jpg
Hello World
[cake@cake webroot]$ java -jar media/filter/m/transfer/img/4b839846-a0e0-4c76-a671-0a8dc0a80b08.jpg
Invalid or corrupt jarfile media/filter/m/transfer/img/4b839846-a0e0-4c76-a671-0a8dc0a80b08.jpg


[cake@cake webroot]$ cat Image2.png hello.jar > gifarImage2.png
[cake@cake webroot]$ java -jar gifarImage2.png
Hello World

[cake@cake webroot]$ java -jar media/transfer/img/4b8398c3-226c-4175-9e63-0a8ac0a80b08.png
Hello World
[cake@cake webroot]$ java -jar media/filter/m/transfer/img/4b8398c3-226c-4175-9e63-0a8ac0a80b08.png
Invalid or corrupt jarfile media/filter/m/transfer/img/4b8398c3-226c-4175-9e63-0a8ac0a80b08.png

結論

主要な画像ファイル(JPEG, GIF, PNG)に関しては、MediaプラグインでVersionファイルを作成し、それを表示すべし、です。

*1:アップロードの際もチェックしてますが・・・