あなたのサイトの PHPは,CGI方式ですか? Module方式ですか?

もどる

PHP-CGI の query string の処理の脆弱性が,軽く世を賑わしました.なお,PHPは,脆弱性に対する脇が甘く.時々爆弾が炸裂します.phpを利用する場合は,注意深くメンテする必要があります.

PHPは,ApacheなどのWEBサーバと組み合わせて利用している場合,PHPコードを CGI方式,または,Module方式かで実行しています.この両者の違いをはっきりと述べていないサイト・本が多く,酷いものです.そこで,以下に簡単にまとめておきます.

Webサーバ(ほぼapacheです)におけるPHPコードの実行方式は,2つに大別される

また,cgi方式は,さらに,以下のように分類できます.

※CGI Type(Script)は,応答用のHTTPヘッダ出力をPHPコードとして書いておくのか,それともHTTPヘッダ生成機能付きのPHP (phpコンパイル時のconfiguration にて設定可能)を使うに分類される.

今回の脆弱性で問題になったのは,CGI方式で,phpおよび,php-cgiでの引数の解釈に問題がありました.このため,極端な話,php-cgiでなくても,CGI方式で実行しているならば,リスクがあったということになります.

どういう設定ならCGI方式ですか?

CGI方式は,apacheの場合,httpd.conf等の mime_module等に,

AddHandler cgii-script .hoh
Action cgii-script /cgi-bin/php-cgi

のように, .hohなら, それは,cgii-scriptというラベルを,AddHandlerにて定義し,cgii-scriptなら,/cgi-bin/php-cgi へ引き渡すという記載があります.

また,PHPコード自体を, /cgi-bin等に配置し,実行ビットが立っていても同様です.

※apacheでは,php-cgiという実行ファイルや,実行ビットつき phpを配置したディレクトリ(例えば,/cgi-bin等)に対して,.htaccessや,httpd.conf等において, Options +ExecCGI  許可を出さないと,Internal Server Error等が発生します.

おいらのサーバは,phpinfo()したら,Server API : Apache 2.0 Handler だったので安心ですか?

大きな誤りです.php設定のhow to 物では, CGI版かModule版かを切り替えるようなものであると「錯誤」させる記述があります.しかし,両者は共存できるのです.両者は,呼び出し方の違いででしかなく,「実行方式を切り替えて使ってる」という物ではありません.

以下に例を示します.

hoge.phpと,hoge.hoh というファイルを以下の内容で作成し,

<?php
phpinfo();
?>

mod_php環境のapacheにおいて,以下のAddHandler を httpd.confに追加します.(/cgi-bin は,+ExecCGIされており,php-cgi を /cgi-binにcpしてあることを想定)

<IfModule mime_module>
(略)
AddHandler cgii-script .hoh
Action cgii-script /cgi-bin/php-cgi
(略)
</IfModule>

同じサーバ上にて,hoge.phpを読み込むと,

Server API Apache 2.0 Handler

と(抜粋),module版(mod_php)であることがわかり,hoge.hohならば,

Server API CGI/FastCGI

と,CGI版であることがわかります.また,今回の脆弱性である点をつかって,

http://example/hoge.hoh?-s               

へアクセスすると,php -s hoge.hohされてしまい,

<?php
phpinfo
();
?>

とソースファイルが表示されることを確認できます.

よって,How toで設定する時には,設定内容の理解が重要なのです.ドキッとしちゃった人は,エリをタダして,サーバをメンテナンスするようにする.それが,インターネットにサーバを運用する者の責務だとおもいます.もちろん,How toを書いている人もです.

おおえまさふみ