CakePHP 5.4.2 - عالي - عن بُعد - Unserialize - محركات التخزين المؤقت تقوم بإلغاء تسلسل الكائنات دون قائمة فئات مسموح بها
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.
من يستطيع تعيين مفتاح cake_ على Redis، أو كتابة ملف ذاكرة تخزين مؤقت، يزرع كائنًا مُسلسلًا. عند تنفيذ Cache::read التالي (أو تحميل CacheSession) يتم تشغيله في عامل PHP.
| المعرّف | لا يوجد CVE بعد |
| الفئة | حقن الكائنات |
| الوصول | عن بُعد عندما يكون Redis أو Memcached قابلًا للكتابة من المهاجم. محلي بالنسبة لـ FileEngine على tmp/cache. |
| CWE | CWE-502 |
| CVSS | مرتفع: 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، أو ملف ذاكرة تخزين مؤقت). ليس HTTP غير مُصادق عليه إلى Redis محلي مُقيّد. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
زرع كائن مُسلسل في ذاكرة التخزين المؤقت للتطبيق. عند القراءة التالية يتم تشغيل PHP في العامل. يتوقف هذا المختبر عند ملف إثبات. لا يُظهر سلسلة أدوات (gadget chain) أو صدفة.
مُثبت في المختبر (السلامة)
cake_<key> ثم Cache::read. البادئة الافتراضية هي cake_. يستخدم RedisEngine unserialize() المجرّدة unserialize($value) عندما تكون allowedClasses على القيمة الافتراضية true. كائن LabMarker مزروع تم إنشاؤه كـ LabMarker وكتب __wakeup ملف الإثبات بمعرّف مستخدم PHP.{expiry}\n{serialize($obj)} تحت مسار الذاكرة المؤقتة. لا يزال FileEngine::get() يستدعي unserialize($data) المجرّدة. نفس العلامة، نفس الإثبات. اسم الملف هو prefix بالإضافة إلى المفتاح (cake_labfile).allowedClasses => false يرفض الكائنات. عادت نفس حمولة Redis كـ __PHP_Incomplete_Class. لم يتم تشغيل __wakeup. كان ملف الإثبات غائبًا.مُستنتج (لم يُنفَّذ هنا)
CacheSession::read هو نفس نقطة الوصول عندما تكون الجلسة defaults => cache. يصبح كل تحميل جلسة عملية unserialize لبايتات ذاكرة تخزين مؤقت يتحكم بها المهاجم.serialize => php هو نفس فئة الخلل. لم يشغّل هذا المختبر Memcached.مغلق / ليس هذه البقايا
cakephp/app القياسي الذي لا يكشف Redis.allowedClasses => false (أو قائمة ضيقة) يحجب الكائنات بالفعل عندما يضبطها المشغّل. إنها ليست القيمة الافتراضية.بقايا نفس التثبيت: window SQLi، collate SQLi، attachment CRLF.
ثبّتت cakephp/cakephp 5.4.2 بعد موجة 2026 FunctionsBuilder / jsonValue / Smtp CRLF / View element. يوثّق 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);
منعطفات خاطئة مسجّلة بالفعل: التعامل مع Redis محلي مُقيّد كـ RCE عبر HTTP غير مُصادق عليه؛ تسليم سلسلة أدوات؛ الادعاء بأن FileEngine عن بُعد؛ صدفة عكسية. مسرح. الأوراكل هو علامة __wakeup تكتب ملف علم.
python3 cakephp-cache-unserialize-Abraxas-Labs.py
أو
cd lab
./run.sh
الهدف فقط 127.0.0.1:19470. CakePHP 5.4.2 مباشر من وسم 5.4.2 داخل Docker. Redis 7 مع إيقاف protected-mode حتى يتمكن المضيف من SET. PHP 8.3 مع ext-redis. فئة العلامة LabMarker مع __wakeup تكتب /tmp/CAKEPHP-CACHE-UNSERIALIZE-WITNESS. لا صدفة.
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. مختبر loopback فقط. لا ضمان.