[[セキュリティーニュース]]
PHPのアップロード機能で、セキュリティーホールが見つかったらしい。
安全なディレクトリーに、ファイルをアップロードさせるようにしないといけないと。
http://d.hatena.ne.jp/ockeghem/20110620
*PHPにおけるファイルアップロードの脆弱性CVE-2011-2202 [#d1bee9ab]
> PHPの現行バーション(PHP5.3.6以前)には、ファイルアップロード時のファイル名がルート直下の場合、先頭のスラッシュを除去しないでファイル名が渡される問題があります。[[CVE-2011-2202>http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-2202]]として報告されています。
> 次バージョンPHP5.3.7のRC1で修正されていることを確認しましたので、PHP5.3.7正式版が公開され次第、できるだけ早期に導入することを推奨します。
**概要 [#x63d13da]
PHPにはファイルアップロードの機能が提供されています。アップロード時のリクエストに付与される元ファイル名は、PHPスクリプトでは、$_FILES[]['name']で受け取れますが、この際にはファイルのディレクトリ名やドライブレター(C:のような)は除去され、ファイル名と拡張子だけがアプリケーションに渡される仕様です。
しかし、「/upload.png」のようにルート直下のファイル名を指定した場合は、先頭のスラッシュ「/」は除去されず、フルパスでファイル名が渡されます。これがCVE-2011-2202脆弱性です。
**この脆弱性の影響 [#zccd399d]
$_FILES[]['name']が絶対パス名を返した場合、このファイル名の使い方次第では問題になる可能性があります。
影響がでるPHPスクリプトは以下の条件の両方を満たすものであると考えられます。
- $_FILES[]['name']をそのまま使ってmove_uploaded_fileによりファイルを移動している
- PHPスクリプトが、Webサーバーのルートディレクトリに対して書き込み権限をもつユーザで実行している
前者は、具体的には以下のようなスクリプトです。
#code(php){{
move_uploaded_file($_FILES["imgfile"]["tmp_name"], $_FILES["imgfile"]["name"]);
}}
**対策 [#f21452a4]
上記の二条件に当てはまるPHPスクリプトは至急対策が必要ですが、CVE-2011-2202以前にWebアプリケーションの脆弱性であるからです。以下の対処を推奨します。
- アップロードされたファイルを安全な場所に移動する(徳丸本4.12節参照)
- Apache等を管理者権限のないユーザで動作させる