MOPB-02-2007:PHP Executor Deep Recursion Stack Overflow

(更新日: 2007/03/04)

“the Month of PHP Bugs”をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。

■クレジット
発見者:不明
実証コード:不必要

■PoCまたは攻撃コード
不必要

■リファレンス
CVE-2006-1549
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-1549

■サマリ
MOPBの初日は既知の問題でも修正されていない脆弱性を取り扱っています。このカテゴリの次のバグはPHPが深すぎる再帰呼び出しの防御を行っていない問題です。(訳注:PHPは再帰呼び出しが深すぎるとクラッシュする。Ruby、Pythonは再帰呼び出しの回数を制限し、Perlはシステムが許す限りのリソースを使う)PHPアプリケーションが非常に多くの再帰呼び出しを行い、スタックを使い切るとクラッシュします。この問題は非常に古い問題ですが昨年CVE名が割り当てられました。

■影響するバージョン
すべてのPHP

■詳細情報
多くの最近のPHPアプリケーションはユーザ入力にたいしてチェックや利用のための準備を行っています。例としてmagic_quotes_gpcが有効なサーバ上でその効果を取り除いたり、register_globals=on/off状況をエミュレートするPHPアプリケーションは珍しくありません。

ユーザ入力を必要な状態に整える為に簡単な再帰呼び出し関数が利用されることが多くあります。しかし、PHPは非常にネストレベルが深い配列構造を受け付けるようになっています。そのような配列が渡されると、例えばphpMyAdminのようなPHPアプリケーションは、ユーザ入力はスタックが溢れクラッシュするまで再帰的に処理されます。

このリクエストを送ったApacheのプロセスをgdbで見ると

このバックトレースとレジスタから、スタックポインタがクラッシュを発生させる非ページメモリアドレスを参照する関数呼び出しを行おうとしている事が解かります。

■PoC、攻撃コードまたは再現手順
詳細情報を参照。

■備考
PHP開発者はこの問題を修正しようと思っていません。数えきれないほどの議論がありましたがPHP開発者はどの解決策も受け入れようとしませんでした。

PHPユーザとしてはいくつかのワークアラウンドが選択できます。Suhosin(またはxdebug)(訳注:xdebugはデバッグ用のモジュールで運用サーバに導入するのはお勧めできません)のようなアプリケーションによる深すぎる再帰呼び出しを制限しクラッシュを回避するモジュールをインストールするか、同様の機能をPHPのコアに直接パッチする事ができます。

Comments

comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です