
Cotonti CommentsWidget PHPオブジェクトインジェクション脆弱性(CAN-2026-2035973 / CVE-2026-71294)に対する安全なローカル概念実証。
Cotonti の CommentsWidget 実装で確認された PHP オブジェクトインジェクション問題に対する安全なローカル概念実証です。
plugins/comments/inc/CommentsWidget.php脆弱なコードパスは ci GET パラメータを受け取り、攻撃者が制御するデータを base64_decode() を経由して PHP の unserialize() に渡しますが、インスタンス化を許可するクラスを制限していません。
概念的には、脆弱な操作は次のとおりです。
$ci = @unserialize(base64_decode($ci));
シリアライズされたオブジェクトが渡されると、PHP は攻撃者が制御するクラスをインスタンス化し、__wakeup() などのマジックメソッドを呼び出す可能性があります。より大きなアプリケーションでは、適切なガジェットクラスが利用可能な場合に危険となり得ます。
提出された修正は、デシリアライズを次のように変更します。
$ci = @unserialize(base64_decode($ci), ['allowed_classes' => false]);
さらに、使用前に結果の値が期待される配列構造を持っていることを検証します。
poc.php は 3 つのローカルテストを実行します。
unserialize() が DangerousGadget をインスタンス化し、その __wakeup() メソッドをトリガーします。allowed_classes => false によりガジェットクラスのインスタンス化が防止され、したがって __wakeup() の副作用も防止されます。PoC は /tmp/pwned_by_cotonti_poc.txt を、__wakeup() が実行されたことを示す無害なセンチネルとしてのみ使用します。オペレーティングシステムのコマンドを実行することはありません。id && whoami という文字列は、ガジェットの command プロパティ内のプレースホルダー値としてのみ存在します。
serialize() / unserialize() をサポートする PHP CLI脆弱なデシリアライズ動作と修正済みのデシリアライズ動作が直接再現されるため、Cotonti のインストールは不要です。
リポジトリのディレクトリから:
php poc.php
期待される出力は次のようになります。
[!] DangerousGadget::__wakeup() triggered
[TEST 1] VULNERABLE: __wakeup() executed during unrestricted unserialize().
[TEST 2] FIXED: object instantiation was blocked; no sentinel was created.
[TEST 3] FIXED: invalid serialized structure rejected by validation.
Summary:
- Vulnerable path allows a serialized attacker-controlled object to be instantiated and invokes __wakeup().
- Fixed path uses allowed_classes=false, preventing the gadget class from being instantiated.
- Structural validation rejects values that do not match the expected array shape.
- No real command execution is performed by this PoC; the command property is only a placeholder.
スクリプトは終了前にセンチネルファイルを削除します。
攻撃者が制御するデータを、制限のない PHP の unserialize() でデシリアライズしないでください。
このコードパスに対して、実証された緩和策はクラスのインスタンス化を無効にすることです。
unserialize($data, ['allowed_classes' => false]);
また、デシリアライズされた値の内容を使用する前に、アプリケーションが期待する正確な構造と照合して検証する必要があります。
このリポジトリは、セキュリティ研究、検証、および防御的テストを目的としています。PoC は、あなたが所有する環境、または明示的にテストを許可された環境でのみ実行してください。許可なくシステムを標的にするために使用しないでください。
Harsh Raj Singhania — 脆弱性研究、概念実証、および開示。