mediaプラグインのGIFAR対策
Mediaプラグインは、アップロードファイルしたファイルそのもの(transfer/以下)への直接アクセス表示を非推奨として、代わりにfilter/以下に出力したVersionファイルの表示を推奨しています。
特に画像ファイル等に、セキュリティ上の理由があるためだそうですが、その例として上げられていた、「GIFAR」について、Versionファイル作成で対策になっているのか検証しました。
どうやらVersionファイル化することで、画像のGIFAR対策はOKのようです (^^)
直接アクセスした場合の問題
transferディレクトリへのアクセスを禁止する理由は、こちらの「4.」を参考にしました。
http://d.hatena.ne.jp/cake-memo/20091125
具体例として、以下の2つが挙げられています。
内容:IEのMIME Sniffing - てきとうなメモ
こちらは、Versionファイル作成の際、mineTypeチェック行なっているので対策になるのだろうと納得*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
*1:アップロードの際もチェックしてますが・・・