MOPB-31-2007:PHP _SESSION Deserialization Overwrite Vulnerability

(Last Updated On: 2018年8月16日)

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

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

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

■リファレンス
なし

■サマリ
register_globalsが有効されている場合、セッションデータのアンシリアライズは、$_SESSION配列を含め、全てのグローバル変数を書き換え可能です。この為、特別なスクリプトを用意すると任意コードの実行が可能となります。

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

■詳細情報
サマリで全てを解説しています。詳しくは攻撃コードを参照してください。

■PoC、攻撃コードまたは再現手順
添付のPoCコードはsubstr_compare()関数の情報リークを利用してシェルコードへのオフセットと書き換えが必要なNULLポインタのアドレスを取得しています。そして、解説した$_SESSION配列の上書き脆弱性を偽のハッシュテーブルを使いコード実行を行います。

■備考
通常の状況ではローカルからのみ攻撃可能です。しかし、リモートからの攻撃者がアプリケーションの脆弱性を利用してセッションデータファイルを挿入できるかも知れません。(訳注:UNIX系OSの場合、デフォルトでは/tmpにセッションデータが保存されるので偽のセッションデータファイルを配置できればリモートからも攻撃可能)多くのアプリケーションがこの様なセキュリティホールを持っています。

この脆弱性によりセキュリティホールを持つサーバでは任意コード実行が可能です。Suhosinモジュールはこのような攻撃からデフォルト設定で、暗号化され簡単に改ざんできないよう、保護されるようになっています。

投稿者: yohgaki