報告日: 2025年9月18日
CVE 割り当て日: 2025年10月9日
公開日: 2026年2月2日
CVE ID: CVE-2025-61505
発見者: Anas Abderrahman Benbarek
e107 CMS バージョン 2.3.3 のインストールスクリプト (install.php) において、PHP オブジェクトインジェクションの脆弱性 (CWE-502: 信頼できないデータのデシリアライゼーション) が発見されました。
この脆弱性により、認証されていないリモート攻撃者が悪意のあるシリアル化データを作成し、e107 コードベースまたはその依存関係に悪用可能なガジェットクラスが存在する場合、任意のコード実行、データ改ざん、その他の悪意のあるアクションにつながる可能性があります。
この問題は、PHP の unserialize() 関数を (allowed_classes オプションなどの) 制限なしにユーザー制御の入力に対して安全でない方法で使用していることに起因します。インストールフェーズに限定されているものの、公開サーバーでのセットアップ中に重大なリスクをもたらします。インストーラーはデータベース作成やファイル書き込みなどの機密操作を処理するためです。
install.php)e107 CMS のインストールプロセスはマルチステージです。ユーザー入力 (言語、データベース認証情報、管理者詳細など) は、previous_steps POST パラメータに保存されたシリアル化配列を使用してステップ間で保持されます。このデータは送信のために base64 エンコードされ、サーバー上でデコード/アンシリアライズされます。
核心的な問題は、検証、サニタイズ、またはクラスのホワイトリストなしで、デコードされたユーザー入力を unserialize() に直接渡すことです。これは2か所で発生します。
php if(isset($_POST['previous_steps'])) { $tmp = unserialize(base64_decode($_POST['previous_steps'])); $override = (isset($tmp['paths']) && isset($tmp['paths']['hash'])) ? array('site_path'=>$tmp['paths']['hash']) : array(); unset($tmp); }
スクリプトは、previous_steps に以前のフォームステップからの信頼されたシリアル化データが含まれていると想定しています。しかし、これは単なる POST パラメータであるため、攻撃者はそれを完全に制御できます。base64_decode() は入力をバイナリに変換し、unserialize() はそれを PHP オブジェクトまたは配列に再構築します。入力にオブジェクト表記 (O: で始まる) が含まれている場合、PHP はそのクラスが現在のスコープに存在するかオートロードされていれば、それらのクラスをインスタンス化します。これにより、即座に __wakeup() やその他のマジックメソッドがトリガーされ、ガジェットチェーンが存在する場合、ファイル書き込みや予期しないデータベース呼び出しなどの副作用を引き起こす可能性があります。 悪用可能性に関する注記: 成功は利用可能なガジェットクラスに依存します。それらがない場合、影響はクラッシュやデータ破損に限定される可能性があります。
PHPif(isset($_POST['previous_steps'])) { $this->previous_steps = unserialize(base64_decode($_POST['previous_steps'])); // ... (filtering and password restoration logic) unset($_POST['previous_steps']); }
このインスタンスはさらに危険です。なぜなら、デシリアライズされたデータはオブジェクトの状態 ($this->previous_steps) の一部となり、その後のインストーラーのアクション (MySQL セットアップ、管理者作成、設定ファイル生成) に影響を与えるからです。ここでのオブジェクトインジェクションはインストールプロセス全体にわたって持続し、高権限の操作に影響を与える可能性があります。繰り返しますが、allowed_classes の制限がないため、オートロードされた任意のクラス (コア、ハンドラ、プラグイン、ライブラリ) がインスタンス化される可能性があります。
悪用可能性に関する注記: 実際の悪用には通常、危険な動作 (コード実行など) に到達するために複数のオブジェクトを連鎖させる (「ガジェットチェーン」) 必要があります。たとえば、あるクラスの __wakeup() が、ユーザー制御の文字列を評価する別のメソッドを呼び出す可能性があります。そのようなチェーンがない場合、影響はサービス拒否 (デストラクタでのリソース枯渇など) に留まる可能性があります。インストーラーの高権限コンテキスト (e107_config.php の書き込み、ディレクトリ作成) はリスクを増幅させますが、インストール後にスクリプトを削除すれば長期的な露出は軽減されます。
この脆弱性は、セットアップ中のどの段階でも、認証されていない HTTP POST リクエストを /install.php に送信することで到達可能です。
unserialize() を json_decode() に置き換えるか、最低限次のように使用する:unserialize($data, ['allowed_classes' => false]);