PHPセキュリティ・レスポンス・チームを離脱したPHP開発者のStefan Esser氏が,3月にPHPのバグを公表し続けた活動「Month of PHP Bugs(PHPバグ月間)」をご存じだろう(関連記事:「3月は「PHPバグ月間」,元開発者がバグを毎日公開へ」,「PHPのぜい弱性を毎日公表するプロジェクト,ユーザ会のメンバーが日本語訳公開」)。Stefan Esser氏が公開したバグのいくつかは,危険な関数を無効にすることで回避可能である。

 もし読者が自身のサーバーでPHPを使っている場合,エンジンの意図しない部分まで公開されていないか,その構成をチェックする必要がある。もしぜい弱な部分が公開されている場合は,そこからシステム全体,ひいては使っているネットワークの他の部分まで公開されてしまう可能性があるからだ。

 使っているWebシステムが閉じている(つまり,他のユーザーによるファイルのアップロードや作成を禁じている)場合は,閉じていない場合よりも潜在的なセキュリティ・リスクは限定的である。ただしどちらの場合も,予防策として,使用する必要がない機能は使用禁止に設定しておく必要がある。

 例えば,PHPではexec関数とshell_exec関数の使用を許可できる。どちらも基本的には,OSコマンドを実行して,その出力を取得するという処理を実行する。筆者もshell_exec関数の機能を活用した経験がある。以前,筆者がアカウントを登録しているWebホスティング企業のサーバーで,動作速度が低下してほとんどアクセスできなくなるという事態が頻繁に発生していた。サポート・スタッフからこの状況についてあいまいな説明しか得られなかったことに業を煮やした筆者は,問題を自分自身で調査しようと決意した。

 PHPでshell_exec関数(とその他いくつかの関数)を使ってサーバーの様々な動作特性を調べた結果,ボトルネックを発見できたので,サポート・スタッフに問題点をそれとなく伝えた。恐らくサポート・スタッフは,筆者がどうやってサーバーの動作状況を知れたのか,しばらく悩んだのだろう。数カ月後にようやく気づいたと見えて,shell_exec関数が使えないようになった。

 もう1つ例を示そう。ここで具体的な名前は書けないのだが,ある人気サイトのブログに登録したときのことだ。あるブログ機能を使いたかったのだが,そのサイトではその機能を使えなかったので,その制限を回避する方法がないか探ることにした。すると,このサイトではいくつもの危険な関数が使用可能であることがわかった。ちょっとした作業をするだけで,サーバー・ディスク・サブシステムのほぼ全体を思いのままに探索し,構成ファイルを読み取り,パス情報を入手できた。そうやって集めた情報を使って,自作のカスタム・スクリプトを実行することによって,使いたいと思っていた機能を筆者のブログに追加できた。結局,そのサイトのスタッフは筆者がしたことに気づいて,いくつもの危険な関数を使えないようにした。

 危険な関数には,exec関数とshell_exec関数のほかにも,suexec,passthru,proc_open,proc_close,proc_get_status,proc_nice,proc_terminate,system,popen,pclose,dl,ini_set,virtual,set_time_limit,apache_child_terminate,posix_kill,posix_mkfifo,posix_setpgid,posix_setsid,posix_setuid,escapeshellcmd,escapeshellargがある。ここに挙げた以外の潜在的な危険のある関数については,「PHP Builder」のWebサイトにある「Functions restricted/disabled by safe mode」という記事を参照してほしい。

 関数を無効にするには,php.iniファイルに次のような行を挿入(または編集)すればよい。

disable_functions = "shell_exec, suexec, passthru"

 PHPの構成については,下記のサイトが参考になる。

Ayman Hourieh's Blog

WEB-DOT-DEV--PHP Configuration

PHP Manual

PHP Security Consortium's PhpSecInfo

 最後に,PHP Security ConsortiumのWebサイトに役に立つリンク(書籍情報を含む)が多数掲載されているページがあるので,紹介しておこう。

PHP Security Consortium: Library