▼2012年5月7日月曜日CGI版PHPにリモートからスクリプト実行を許す脆弱性(CVE-2012-1823)CGI環境でPHPを動作させているサイトには、リモートからスクリプト実行を許してしまう脆弱性があります。5.4.2)は不完全なため、該当するサイトは至急回避策を導入することを推奨します。概要CGIの仕様として、クエリ文字列に等号を含めない場合は、クエリ文字列がCGIスクリプトのコマンドライン引数として指定されます。http://example.jp/test.cgi?foo+bar+bazという呼び出しに対しては、test.cgiは以下のコマンドラインで呼び出されます。bazこの仕様を悪用して、CGI版のPHPにコマンドライン引数としてPHPのオプションを指定できます。いうリクエストは、-sオプション(スクリプトソースを表示)と解釈され、PHPスクリプトを実行する代わりに、ソースを表示します(下図)。これはPHPの脆弱性CVE-2012-1823と識別されています。実証例CVE-2012-1823の影響はスクリプトソースの表示だけではありません。PHPのオプションを組み合わせることにより、外部から任意のスクリプト実行が可能となります。具体的には、-dオプションを用いて、php.iniのディレクティブを外部から指定できます。metasploitminute.comで紹介されていたExploitを元に、攻撃例を紹介します。以下の2つのphp.iniディレクティブを指定します。allow_url_include=Onauto_prepend_file=php://input最初のディレクティブは、includeするファイルをURL指定でリモートから読み出すことを許可するものです。2番目のディレクティブは、PHP実行に先立ち、スクリプトをincludeしておくものですが、ファイル名としてphp://inputを指定しているため、POSTパラメータとして送信した内容をPHPスクリプトとして実行します。両者の組み合わせにより、外部から指定したスクリプトを実行することができます。BurpSuiteのrepeater機能を用いて上記Exploitを実行した例を以下に示します。readfile('/etc/passwd');により、/etc/passwdファイルが表示されています。X-Powered-Byヘッダから分かるように、上記はPHP5.4.2で実行されており、改修が不完全であることが分かります。全てで大きな影響があります。影響を受けるサイト(下記)は至急の対策を推奨します。影響を受けるサイト当脆弱性の影響は、PHPをCGIとして実行しているサイトに限られます。対策としては、ApacheモジュールまたはFastCGIへの移行を推奨します。してもCGIのままにしなければならない場合は、php-cgiを呼び出すラッパー(/cgi-bin/php-wrapper)を以下のように記述します。実行権限を付与してください。php-cgiにはコマンドライン引数を渡さないところがポイントです。/usr/local/bin/php-cgiPHPの設定を以下のように変更します。/cgi-bin/ディレクトリにphp-cgi(CGI版PHP)がコピーしてある場合は削除してください。/cgi-bin/php-wrapperすると、php-cgiにパラメータが渡されなくなることから、CVE-2012-1823の影響を回避することができます。php-cgiにコマンドライン引数を渡さなくてもPHPの実行に支障ありません。当脆弱性は極めて影響が大きい反面、影響を受けるサイトは限られます。当脆弱性が判明した時期が、日本の連休中にあたっていたため、対策に必要な最低限の情報のみ提供しておりましたが、海外では攻撃のための情報が流通し始めており、かつ日本での連休が明けたことから、詳細情報を公開しました。