MOPB-11-2007:PHP WDDX Session Deserialization Information Leak Vulnerability

(Last Updated On: )

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

■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser

■PoCまたは攻撃コード
MOPB-11-2007.php
http://www.php-security.org/MOPB/code/MOPB-11-2007.php

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

■サマリ
PHPのWDDX拡張モジュールにはWDDX形式のデータフォーマットをサポートするSessionモジュール用のシリアライゼーションハンドラーが付属します。(訳注:WDDXモジュールをロードしてもデフォルトでは”php”セッションシリアライザーが利用されます)この形式のデータフォーマットはkey_length変数が適切に処理されないと任意量のスタックデータをセッション配列キーにリークする問題が含まれていました。

この問題はスタック上の、オフセット、変数やコード(オフセットが必要となる更なる攻撃に有用)、スタックのカナリア値など、の重要な情報へのアクセスを許してしまいます。

■影響するバージョン
PHP 4.4.5未満、PHP 5.2.1未満

■詳細情報
WDDX内部の整数キーの取り扱いは壊れています。

            switch (hash_type) {
                case HASH_KEY_IS_LONG:
                    sprintf(tmp, "%ld", idx);
                    key = tmp;
                    /* fallthru */
                case HASH_KEY_IS_STRING:
                    php_set_session_var(key, key_length-1, *ent, NULL TSRMLS_CC);
                    PS_ADD_VAR(key);
            }

整数キーは128バイトのスタックバッファに書き込まれ、(フォールスルーがあるために)変数はセッションに追加されます。(訳注:PS_ADD_VAR()マクロはセッションに変数を追加するマクロ)残念ながら整数キーの場合はkey_lengthが適切に初期化されていません。最初の変数名にのみ初期化され、残りのkey_lengthバイトはスタックデータが直接利用されています。

攻撃者は文字列名の前に整数インデックスを置くことにより何バイトリークさせるか制御できます。key_lengthが変数名と同じ場合は完全に攻撃者の制御下にあります。

■PoC、攻撃または再現手順
添付のPoCはPHP変数に8192バイトのスタックデータをリークし、16進数ダンプを行います。

Stackdump
---------

00000000: 31 00 00 00 74 4f 9e bf b1 b7 e5 b7 2c 38 31 65 1...tO......,81e
00000010: 39 66 65 63 b6 01 00 00 19 00 00 00 00 30 fd b7 9fec.........0..
00000020: f4 8f f2 b7 f4 8f f2 b7 00 35 1f 08 0a 00 00 00 .........5......
00000030: 80 0e 1f 08 90 08 00 00 4c ef f1 b7 d1 84 e5 b7 ........L.......
00000040: b4 4f 9e bf 69 68 e5 b7 d1 84 e5 b7 00 30 fd b7 .O..ih.......0..
00000050: 20 00 00 00 40 04 00 00 20 00 00 00 00 30 fd b7  ...@... ....0..
00000060: f4 8f f2 b7 20 0d 1f 08 45 90 19 08 cc 4f 9e bf .... ...E....O..
00000070: 6b 95 e5 b7 20 0d 1f 08 f4 8f f2 b7 80 a8 f2 b7 k... ...........
00000080: 01 00 00 00 01 20 00 00 48 4f 9e bf 68 e8 1e 08 ..... ..HO..h...
00000090: 0c a0 1e 08 0c 0d 1f 08 d4 a9 1e 08 ec 9f 1e 08 ................
000000a0: 08 50 9e bf 8a 98 09 08 74 c7 1e 08 99 20 00 00 .P......t.... ..
000000b0: 18 50 9e bf 24 51 9e bf 00 00 00 00 ec 9f 1e 08 .P..$Q..........
000000c0: 38 50 9e bf b9 99 09 08 01 00 00 00 28 50 9e bf 8P..........(P..
000000d0: 0c 00 00 00 ec 9f 1e 08 2c c2 1e 08 68 46 ff 08 ........,...hF..
000000e0: d4 a9 1e 08 24 51 9e bf 00 00 00 00 60 50 9e bf ....$Q......`P..
000000f0: f8 59 9e bf 44 f4 15 08 01 00 00 00 ec 9f 1e 08 .Y..D...........
...

■備考
この脆弱性は、他の多くの脆弱性と同じように、MOPBがはじまる前にPHPプロジェクトに通知していた問題です。最新版では脆弱性は修正されています。この問題を修正する為には少なくともPHP 4.4.5またはPHP 5.2.1にアップグレードする事をお勧めします。

投稿者: yohgaki