
CakePHP 5.4.2 - 高 - リモート - アンシリアライズ - キャッシュエンジンがクラス許可リストなしでオブジェクトをアンシリアライズする
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-cache-unserialize
クラス: オブジェクトインジェクション 到達範囲: リモート (Redis/Memcached 書き込み) / ローカル (FileEngine)
CakePHP 5.4.2 (887b641) - Cake Software Foundation
5.3.7 ではこの理由から Redis の allowedClasses が追加され、後方互換性のためにデフォルトは true (すべて許可) のままでした。RedisEngine は、そのデフォルトが適用される場合、依然として素の unserialize() を呼び出します。FileEngine には許可リストがまったくありません。MemcachedEngine は依然として serialize のデフォルトを php にしています。
Redis 上で cake_ キーを SET できる、またはキャッシュファイルを書き込める攻撃者は、シリアライズされたオブジェクトを仕込みます。次の Cache::read (または CacheSession のロード) が、それを PHP ワーカー内で実行します。
| ID | CVE 未割り当て |
| クラス | オブジェクトインジェクション |
| 到達範囲 | 攻撃者から Redis または Memcached に書き込み可能な場合は リモート。tmp/cache 上の FileEngine の場合は ローカル。 |
| CWE | CWE-502 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H (キャッシュストアへの書き込みが必要)。FileEngine は AV:L。 |
| 製品 | CakePHP |
| 影響を受けるバージョン | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| 認証 | キャッシュストアへの書き込み (Redis SET、Memcached set、またはキャッシュファイル)。ロックダウンされた localhost Redis への未認証 HTTP ではありません。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
アプリケーションキャッシュにシリアライズされたオブジェクトを仕込みます。次の読み取りが、PHP ワーカー内でそれを実行します。このラボは証拠ファイルの作成で止まります。ガジェットチェーンやシェルは実証しません。
ラボで実証済み (完全性)
cake_<key> の後に Cache::read。 デフォルトのプレフィックスは cake_。RedisEngine の unserialize() は、allowedClasses がデフォルトの true の場合、素の unserialize($value) を使用します。LabMarker としてインスタンス化された仕込み済みの LabMarker オブジェクトと __wakeup が、PHP の UID で証拠ファイルを書き込みました。{expiry}\n{serialize($obj)} を仕込む。 FileEngine::get() は依然として素の unserialize($data) を呼び出します。同じマーカー、同じ証拠。ファイル名は prefix とキー (cake_labfile) です。allowedClasses => false はオブジェクトを拒否する。 同じ Redis ペイロードは __PHP_Incomplete_Class として返されました。__wakeup は実行されませんでした。証拠ファイルは存在しませんでした。推測 (ここでは実行していない)
defaults => cache の場合、CacheSession::read は同じシンクです。すべてのセッションロードが、攻撃者が制御するキャッシュバイトの unserialize になります。serialize => php は同種のバグです。このラボでは Memcached を起動していません。クローズ済み / この残存問題ではないもの
cakephp/app への未認証 HTTP。allowedClasses => false (または厳格なリスト) は、運用者が設定すればすでにオブジェクトをブロックします。これはデフォルトではありません。同じピンの残存問題: window SQLi、collate SQLi、attachment CRLF。
2026 年の FunctionsBuilder / jsonValue / Smtp CRLF / View element の波の後、cakephp/cakephp 5.4.2 をピン留めしました。RedisEngine はこのオプションを文書化しながら、依然としてデフォルトで開いたままにしています:
* - `allowedClasses` ... Defaults to `true` (allow all) for backwards compatibility.
...
'allowedClasses' => true,
読み取りパス:
protected function unserialize(string $value): mixed
{
if (preg_match('/^[-]?\d+$/', $value)) {
return (int)$value;
}
$allowedClasses = $this->getConfig('allowedClasses');
if ($allowedClasses !== true) {
return unserialize($value, ['allowed_classes' => $allowedClasses]);
}
return unserialize($value);
}
FileEngine には同等のオプションがありません:
if ($data !== '' && !empty($this->_config['serialize'])) {
$data = unserialize($data);
すでに記録済みの誤った道: ロックダウンされた localhost Redis を未認証 HTTP RCE として扱うこと、ガジェットチェーンを提供すること、FileEngine をリモートと主張すること、リバースシェル。すべて見せかけです。オラクルは、フラグファイルを書き込むマーカーの __wakeup です。
python3 cakephp-cache-unserialize-Abraxas-Labs.py
または
cd lab
./run.sh
対象は 127.0.0.1:19470 のみ。Docker 内のタグ 5.4.2 からのライブ CakePHP 5.4.2。ホストが SET できるように protected-mode をオフにした Redis 7。ext-redis 付きの PHP 8.3。/tmp/CAKEPHP-CACHE-UNSERIALIZE-WITNESS を書き込む __wakeup を持つマーカークラス LabMarker。シェルはありません。
SUCCESS cakephp-cache-unserialize redis-default-wakeup=yes redis-denied-wakeup=no file-wakeup=yes pin=5.4.2 sha=887b641de9f7aba06071f98f17edcbc573cbcf63 how=live CAKEPHP-CACHE-UNSERIALIZE-WITNESS
Redis の allowedClasses のデフォルトを false、またはアプリが実際に保存するクラスの厳格なリストにします。同じオプションを FileEngine に追加し、get() でそれを尊重します。Memcached の serialize のデフォルトを json にします。CacheSession がキャッシュエンジンの unserialize ポリシーを継承することを文書化します。
887b641de9f7aba06071f98f17edcbc573cbcf63)RedisEngine.php · FileEngine.phpGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。