今回は,ついに正式公開されたPHP5.0.0,脆弱性修正のために緊急リリースされた PHP 4.3系の最新版PHP 4.3.8,そして,その他のPHP関連の情報としてPHPプログラマ認定試験に関して紹介する。

セキュリティ上の問題を修正したPHP 4.3.8がリリース

 PHP 4.3.7以前において2件の深刻な脆弱性が発見され,修正版としてPHP 4.3.8が2004年7月13日に緊急リリースされた。なお,PHP 5.0.0リリース候補版3においても同様の問題が存在したが,同じ日に正式リリースされたPHP 5.0.0ではPHP 4.3.8と同様の対策が講じられている。

 これらの脆弱性は,ドイツのIT企業e-mattersのStefan Esser氏が報告したもので,memory_limitオプションに関するものとstrip_tags()関数に関するものである。以下にこれらの脆弱性に関する詳細について説明する。

memory_limitに関する脆弱性

 この問題は,スクリプトが消費するメモリーの最大量を指定する設定オプションmemory_limitを有効にしている場合にのみ発生する。

 このオプションはconfigureに--enable-memory-limitを指定してPHPを構築した場合に使用可能となる。このmemory-limitオプションによるメモリー消費量制限機能は,POST入力などを介して大量のデータがクライアントから送信されることによりサーバーがリソースを大量に消費してダウンする,いわゆるDoS (Denial-of-service)攻撃を防止するために有用な機能である。この機能は多くのrpmパッケージで有効となっており,多くのWebサイトで使用されているものと思われる。

 この機能により,設定ファイルphp.iniのmemory_limitディレクティブに指定した制限値を超えるメモリーが必要なスクリプトの実行は中止される。例えば,php.iniに以下のように記述するとスクリプトが消費するメモリーは8Mバイト以下となる。

memory_limit = 8M

 PHPでは実行時にスクリプト実行に必要なメモリーがこの制限値を越えるかどうかを確認する。しかし,この確認を行っている時にあるタイミングでスクリプトのリクエストが中断されると,メモリーがリモートから書き換えられる危険性が生じる可能性がある。メモリーが書き換えられることで任意のコードを実行されたり,サーバーを乗っ取られる危険性も発生する。

 この問題の対策は,最新バージョンであるPHP 4.3.8(またはPHP 5.0.0)に更新するか,memory_limitオプションを無効にすることである。ただし後者の対策では,DoS攻撃を受ける危険性が増大することになる。 

strip_tags()関数に関する脆弱性

 クロスサイト・スクリプティング対策としてユーザー入力に含まれるHTMLタグなどを除去するために使用されるstrip_tags()関数において脆弱性が見つかっている。この問題は,PHP 4.3.7以前(およびPHP 5.0.0RC3以前)と一部のWWWブラウザ(インターネットエクスプローラおよびSafari)の組み合わせで発生する。以下その内容を説明する。

 strip_tags()関数では,引数に含まれるurl'; // 対象文字列
$out = strip_tags($str,''); // 以外のタグを削除
print $out; // 出力:alert("Danger!")
url
?>

 しかし,対象文字列の中のタグに\0(NULLバイト)を含めることで,このタグの検出機能をすり抜けられるという問題が発見された。この問題はオプションの第二引数を指定している場合に発生する。

 これにより,例えば,