セキュリティ機能強化版PHP:Suhosin公開

Suhosinとは?

 PHPに関するセキュリティ強化機能用のパッチとして,Hardended PHP ProjectからPHPのセキュリティ強化を機能するパッチSuhosinが8月23日にリリースされた。Suhosinは,従来より同プロジェクトで公開されているHardened Patchの派生版にあたる。SuhosinはPHPエクステンションに関してバイナリ互換であるため,Zend Optimizerなどのサードパーティ製のエクステンションを使用できる。

 Suhosinは,以下の2つのパートから構成されている。

Suhosin-Patch
 バッファオーバーフローや文字列フォーマットの脆弱性対策などを行うコアパートに対するパッチ

Suhosinエクステンション
 PHPのセキュリティを強化するためのエクステンション

 Suhosinが提供する主な機能を以下に紹介する。

1.バッファーオーバーフロー攻撃などからのスクリプトエンジンの保護
2.リモートインクルード攻撃に対する保護(ホワイトリスト/ブラックリスト)
3.preg_replace()の/e修飾子,eval()関数の無効化
4.再帰処理の最大深さの設定
5.仮想ホスト/ディレクトリごとに使用可能な関数を定義可能(ホワイトリスト/ブラックリスト)
6.mail()関数への改行攻撃等への保護
7.暗号化などによるCookie/セッション情報の保護
8.入力(POST/GET/Cookie)のフィルタリング
9.攻撃に関するアラートのログ機能

 Suhosinは,このようにセキュリティ関連の様々な防御手段を提供している。使用可能な関数を制限する機能では,使用を許可するものを指定するホワイトリスト方式での指定が可能である。このホワイトリスト方式は,許可しないものを指定するブラックリスト方式と比べると制約が強く,設定もれのリスクが少ないことが特徴である。

 こうした制約の付加により,Suhosinをインストールすると既存のWebアプリケーションが動作しなくなる可能性がある。Suhosinでは,このような環境で事前にテストを行うために,アラートのみを発生し,制約を適用しないシミュレーションモードがサポートされている。php.iniに以下のように指定することでシミュレーションモードが有効になる。

suhosin.simulation=On

 なお,Suhosinでは,使用環境に適した動作を行うために,多くの設定オプションが用意されている。設定の詳細については,SuhosinのWebサイトの関連ページを参照していただきたい。

Suhosinのインストールと設定

 Suhosinは,Hardened PHP ProjectのWebサイトの関連ページから入手可能である。以下,インストールと設定の手順について解説する。

 まず,Suhosin PatchとSuhosin Extensionの最新版を上記URLよりダウンロードする。Suhosin Patchは,適用するバージョンごとに作成されているため,使用するバージョン用のパッチを入手する必要がある。ここでは,PHP 5.1.6に適用することを考え,本稿執筆時点で最新のSuhosin Patch 0.9.3とSuhosin Extension 0.9.2を使用する。

 パッチの適用および構築手順を以下に示す。

#> tar xzvf php-5.1.6.tar.gz
#>tar xzvf suhosin-0.9.2.tgz
#>mv suhosin-0.9.2 php-5.1.6/ext/suhosin
#> cd php-5.1.6
#> gzip -cd ../suhosin-patch-5.1.6-0.9.3.patch | patch -p1
#> ./buildconf --force
#> ./configure --enable-suhosin [その他のオプション]
#> make

 Suhosinエクステンションは,シェアードエクステンションとして作成することも可能である。この場合の手順を以下に示す。

#> tar xzvf suhosin-0.9.2.tgz
#> cd suhosin-0.9.2
#> phpize
#> ./configure
#> make

 作成されたエクステンションは,通常のエクステンションと同様php.iniで指定することで読み込むことができる。

extension=suhosin.so

 なお,現在の版では,エクステンションのコンパイル時にmbstring関連のヘッダーファイルの読み込みエラーを発生する場合がある。この場合は,mbstring関連のヘッダーファイルをPHPのヘッダーファイルのインストール先にコピーしてほしい。

 なお,間もなくリリース予定のPHP 5.2.0では,インストール時に必要なヘッダファイルがコピーされるようになるため,この問題は解消する予定である。

 Apache SAPIのインストール後に例えば,以下のスクリプトを実行すると,

include('http://localhost/php/test.php');
?>

 以下のようなエラーがsyslogに記録される。

Sep 23 20:12:47 hostname suhosin[7333]: ALERT - Include filename ('http://localhost/php/test.php') is an URL that is not allowed (attacker '::1',file '/home/foo/public_html/php/test.php',line 6)

 また,Webサーバーへのログ機能を有効にしている場合,Webサーバーのログ(Apacheのerrorlog)にも以下のような情報が記録される。

[Sat Sep 23 20:12:47 2006] [error] [client ::1] ALERT - Include filename ('http://localhost/php/test.php') is an URL that is not allowed (attacker '::1',file '/home/foo/public_html/php/test.php',line 6)

 攻撃に関する防御を行うためには,攻撃を検知することが第一歩となる。こうした詳細なログ機能のサポートは,セキュリティ対策を行うためには非常に重要な機能である。

 現在のSuhosinはWin32環境がサポートされていないなど,まだ発展途上にあるが,少なくともUnix互換環境では十分実用レベルにある。

 Suhosinでは,メモリーチェックなどを厳重に行うため,パッチを適用する前と比べてパフォーマンスの低下が懸念される。パッチ適用前後のベンチマークテスト結果がSuhosinのWebサイトで公開されているが,これによると,性能低下は約9%となっている。ただし,実際のWeb環境では,データベースなどの応答時間も含まれるため,パッチ適用による応答速度低下は無視できるレベルのものになると思われる。

 ホワイトリストに基づくアクティブなセキュリティポリシーを実践可能なSuhosinは,PHPで運用されるWebアプリケーションのセキュリティレベルを高めるために有効であろう。

 次に,Zend Framework関連情報を紹介する。

この先は会員の登録が必要です。今なら有料会員(月額プラン)は12月末まで無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら