概要
CGIの仕様として、クエリ文字列に等号を含めない場合は、クエリ文字列がCGIスクリプトのコマンドライン引数として指定されます。例えば、http://example.jp/test.cgi?foo+bar+bazという呼び出しに対しては、test.cgiは以下のコマンドラインで呼び出されます。
test.cgi foo bar bazこの仕様を悪用して、CGI版のPHPにコマンドライン引数としてPHPのオプションを指定できます。例えば、http://example.jp/test.php?-s というリクエストは、-sオプション(スクリプトソースを表示)と解釈され、PHPスクリプトを実行する代わりに、ソースを表示します(下図)。
これはPHPの脆弱性CVE-2012-1823と識別されています。
実証例
CVE-2012-1823の影響はスクリプトソースの表示だけではありません。PHPのオプションを組み合わせることにより、外部から任意のスクリプト実行が可能となります。具体的には、-dオプションを用いて、php.iniのディレクティブを外部から指定できます。metasploitminute.comで紹介されていたExploitを元に、攻撃例を紹介します。以下の2つのphp.iniディレクティブを指定します。allow_url_include=On最初のディレクティブは、includeするファイルをURL指定でリモートから読み出すことを許可するものです。2番目のディレクティブは、PHP実行に先立ち、スクリプトをincludeしておくものですが、ファイル名としてphp://inputを指定しているため、POSTパラメータとして送信した内容をPHPスクリプトとして実行します。両者の組み合わせにより、外部から指定したスクリプトを実行することができます。
auto_prepend_file=php://input
BurpSuiteのrepeater機能を用いて上記Exploitを実行した例を以下に示します。
影響
外部からスクリプト実行が可能であることから、機密性・完全性・可用性の全てで大きな影響があります。影響を受けるサイト(下記)は至急の対策を推奨します。影響を受けるサイト
当脆弱性の影響は、PHPをCGIとして実行しているサイトに限られます。ApacheモジュールやFastCGIとしてPHPを実行しているサイトには影響ありません。
回避策
当脆弱性の対策としては、ApacheモジュールまたはFastCGIへの移行を推奨します。どうしてもCGIのままにしなければならない場合は、php-cgiを呼び出すラッパー(/cgi-bin/php-wrapper)を以下のように記述します。実行権限を付与してください。php-cgiにはコマンドライン引数を渡さないところがポイントです。
#!/bin/shPHPの設定を以下のように変更します。/cgi-bin/ディレクトリにphp-cgi(CGI版PHP)がコピーしてある場合は削除してください。
exec /usr/local/bin/php-cgi
AddHandler application/x-httpd-php5 .phpすると、php-cgiにパラメータが渡されなくなることから、CVE-2012-1823の影響を回避することができます。php-cgiにコマンドライン引数を渡さなくてもPHPの実行に支障ありません。
Action application/x-httpd-php5 /cgi-bin/php-wrapper
参考
- http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/
- http://www.metasploitminute.com/2012/05/cve-2012-1823-php-cgi-bug.html
- [PHP]CVE-2012-1823の回避策
- [PHP]CVE-2012-1823に関する暫定メモ
注記
当脆弱性は極めて影響が大きい反面、影響を受けるサイトは限られます。当脆弱性が判明した時期が、日本の連休中にあたっていたため、対策に必要な最低限の情報のみ提供しておりましたが、海外では攻撃のための情報が流通し始めており、かつ日本での連休が明けたことから、詳細情報を公開しました。
[PR]HASHコンサルティングが提供するセキュリティ情報メールマガジン(無料)