
في أبريل 2025، اكتشفت Orange Cyberdefense ثغرة أمنية خطيرة في Craft CMS أثناء التحقيق في حادثة، والتي يتم تتبعها الآن تحت الرمز CVE-2025-32432. تتيح هذه الثغرة تنفيذ تعليمات برمجية عن بُعد (RCE) غير مصدق عليها، مع درجة خطورة قصوى تبلغ 10.0 (حرجة) وفقًا لمقياس CVSS v3.1 من قاعدة بيانات الثغرات الأمنية الوطنية (NVD).
كجزء من برنامج زمالة الخريجين في مجال أمن البنية التحتيةOPSWAT أجرى زملاؤنا دراسة شاملة لهذه الثغرة الأمنية، بما في ذلك إعادة إنتاج الاستغلال، والتحقق من تأثيره، وتقييم المخاطر التنظيمية، وتحليل استراتيجيات الحماية الموصى بها.
يقدم هذا المدونة تحليلاً شاملاً ومتعمقاً لـ CVE-2025-32432، حيث يحلل أسبابه الجذرية وتدفق الاستغلال وآثاره الأمنية الأوسع نطاقاً، مع تقديم إرشادات عملية للمؤسسات للدفاع ضد هذا التهديد.
CVE-2025-32432 مقدمة
يؤثر CVE-2025-32432 على إصدارات Craft CMS من 3.0.0-RC1 إلى 3.9.14، ومن 4.0.0-RC1 إلى 4.14.14، ومن 5.0.0-RC1 إلى 5.6.16. تم تصنيف هذا الخلل على أنه CWE-94: حقن التعليمات البرمجية، وينشأ عن المعالجة غير السليمة للمدخلات غير الموثوقة، مما يؤدي في النهاية إلى تمكين RCE غير المصادق عليه.

نظام إدارة المحتوى Craft CMS وإطار عمل Yii
Craft CMS هو نظام حديث لإدارة المحتوى يمكّن المطورين وفرق المحتوى من إنشاء مواقع ويب مرنة ومخصصة بالكامل بدلاً من الاعتماد على قوالب جامدة ومحددة مسبقًا. مع اعتماده في أكثر من 46,000 موقع ويب حول العالم، فهو مستخدم على نطاق واسع ويشكل هدفًا متكررًا للمهاجمين الباحثين عن نقاط ضعف ذات تأثير كبير.
تم بناء Craft CMS على أساس Yii Framework، وهو إطار عمل PHP سريع وقوي مصمم لتطوير الويب الحديث. يوفر Yii الهيكل الأساسي والأدوات، بينما يوسع Craft CMS نطاقه لتقديم نظام إدارة محتوى مرن.

إحدى الميزات الأساسية لإطار عمل Yii هي حاوية Dependency Injection (DI). Dependency Injection هو نمط تصميم يزود المكونات بالموارد التي تحتاجها، بدلاً من مطالبتهم ببناء تلك الموارد بأنفسهم. تتميز حاوية DI في Yii بمرونة عالية، وهي قادرة على بناء كائنات معقدة من قواعد تكوين بسيطة نسبيًا.
ومع ذلك، فإن هذه المرونة تنطوي على مخاطر. في حالة CVE-2025-32432، تم إساءة استخدام حاوية DI بالاقتران مع مدخلات مستخدم غير موثوق بها، مما أدى إلى إنشاء مسار لتنفيذ التعليمات البرمجية عن بُعد. توضح هذه الحالة أن ميزات إطار العمل الآمنة والقوية يمكن أن تصبح خطيرة إذا تم دمجها دون فهم كامل لتداعياتها الأمنية.
تعمق في CVE-2025-32432
يتضمن Craft CMS ميزة تسمى Image Transforms، وهي مصممة لتحسين الأداء عن طريق إنشاء صور بحجم مختلف مباشرة على الخادم. بدلاً من تقديم صورة كبيرة بحجم 4.5 ميجابايت لعرضها كصورة مصغرة بحجم 300×300، يقوم Craft CMS تلقائيًا بإنشاء وتقديم نسخة أصغر حجمًا ومحسّنة. يقلل هذا النهج من استخدام النطاق الترددي ويحسن سرعة تحميل الصفحة بشكل كبير.
لجعل هذه الوظيفة متاحة على نطاق واسع، يعرض Craft CMS نقطة النهاية actions/assets/generate-transform دون الحاجة إلى المصادقة. وفي حين أن هذا يضمن أن المستخدمين المصادق عليهم والمجهولين على حد سواء يمكنهم الاستفادة من الصور المحسّنة، فإنه يوفر أيضًا سطح هجوم يمكن الوصول إليه بشكل عام حيث يمكن لأي شخص تقديم مدخلات مصممة خصيصًا للتطبيق.

من خلال تحليل مفصل لسير العمل هذا، توصل زملاؤنا إلى أن الطريقة AssetsController::actionGenerateTransform يتم استدعاؤها كلما تم إرسال طلب POST إلى نقطة النهاية المكشوفة. تسترد هذه الوظيفة معلمة المقبض مباشرة من نص الطلب وتقوم بإعادة توجيهها إلى المرحلة التالية لمزيد من المعالجة.

في الخطوة التالية، يتم استدعاء الأسلوب ImageTransforms::normalizeTransform(). يأخذ هذا الأسلوب المعلمة handle التي يوفرها المستخدم ويحولها إلى كائن ImageTransform. ونظرًا لأن الكائن يتم إنشاؤه مباشرةً من مدخلات غير موثوقة، فإن هذا يمثل نقطة خطر حرجة في تدفق التنفيذ.

خلال هذه العملية، يتم دمج جميع أزواج القيم الرئيسية من المصفوفة $transform التي يتحكم فيها المستخدم (والتي تنشأ من معلمة handle) في مصفوفة تكوين. ثم تقوم طريقة normalizeTransform بتمرير هذه المصفوفة إلى Craft::createObject()، المسؤولة عن إنشاء مثيل جديد لكائن ImageTransform.

تنبع هذه الثغرة الأمنية من الطريقة التي تعالج بها Craft::createObject() ( التي تغلف Yii::createObject() في Yii) مصفوفات التكوين. ونظرًا لأن هذه الآلية تستخدم حاوية DI لإنشاء وتكوين الكائنات مباشرةً من المصفوفة غير المصدق عليها، فقد يتمكن المهاجمون من السيطرة على عملية إنشاء الكائنات.

عندما يتم تمرير حمولة ضارة، يقوم منشئ الكائن (الموروث من فئة Model ) باستدعاء طريقة App::configure().

تكرر هذه الطريقة كل خاصية في المصفوفة التي يتحكم فيها المهاجم وتعيّنها إلى الكائن الجديد.

When App::configure() assigns properties from the attacker-controlled configuration array, most keys are mapped directly onto the object. However, if a key begins with the prefix as, the assignment is routed through Component::__set, Yii’s magic setter. This method interprets as <name> as an instruction to attach a behavior (mixin) to the object.
يمكن تصميم أحد هذه الحمولات الضارة لاستغلال الطريقة التي يعالج بها Component::__set الخصائص المسبوقة بـ as، مثل as exploit:

من تحليلنا، يتضمن تنفيذ Component::__set إجراءً وقائياً: عندما يتم إرفاق سلوك من خلال خاصية كهذه، يتحقق الإطار من أن الفئة المحددة في مصفوفة التكوين هي فئة فرعية صالحة لـ yii\base\Behavior. يهدف هذا الفحص إلى منع إرفاق فئات عشوائية مباشرة بالمكونات.

ومع ذلك، فإن هذه الحماية ليست فعالة كما تبدو. وتكمن نقطة الضعف في كيفية تعامل Yii::createObject مع مصفوفات التكوين.
عند إنشاء مثيل لكائن، يعطي Yii::createObject الأولوية للمعلمة الخاصة __class. إذا كان هذا المفتاح موجودًا، يتم استخدام قيمته كفئة هدف لإنشاء المثيل، ويتم تجاهل مفتاح الفئة القياسي في مصفوفة التكوين.

يمكن للمهاجم إنشاء حمولة لسلوك الاستغلال تتضمن مفتاحين:
- 'class' => '\craft\behaviors\FieldLayoutBehavior' - فئة شرعية تمتد yii\base\Behavior. توجد هذه القيمة فقط لتلبية متطلبات فحص is_subclass_of في Component::__set، مما يسمح باستمرار التنفيذ دون إثارة أي خطأ.
- '__class' => '\yii\rbac\PhpManager' - الهدف الفعلي للمهاجم. هذه هي فئة "الأداة" التي يريدون إنشاء مثيل لها.
عند تنفيذ الكود، يجتاز Component::__set فحص الأمان لأنه يفحص مفتاح الفئة فقط. ومع ذلك، عندما يستدعي إطار العمل لاحقًا Yii::createObject لإرفاق السلوك، فإنه يعطي الأسبقية لـ __class، مما يؤدي إلى إنشاء مثيل الكائن \yii\rbac\PhpManager الذي اختاره المهاجم بدلاً من ذلك.
استخدام \yii\rbac\PhpManager هو أمر مقصود. لا يكفي إنشاء كائن فقط للاستغلال؛ لتحقيق RCE، يلزم وجود فئة أداة ذات آثار جانبية يمكن استخدامها كسلاح. يعد PhpManager هدفًا شائعًا في هجمات POI (PHP Object Injection) بسبب تدفق التهيئة الخاص به. عند الإنشاء، تستدعي طريقة init() الخاصة به load()، والتي تستدعي بدورها loadFromFile($this->itemFile). من خلال التحكم في $this->itemFile، يمكن للمهاجم إجبار التطبيق على تحميل ملف ضار، وتحويل إنشاء الكائن إلى تنفيذ كود.

يكمن الخطر في طريقة loadFromFile. في PHP، يقوم require بتنفيذ الملف المستهدف كرمز، لذا إذا كان المهاجم يتحكم في مسار الملف، فيمكنه تشغيل تنفيذ رمز عشوائي.
لوضع رمز ضار على الخادم، يستغل المهاجم ملفات جلسة PHP. عن طريق حقن PHP في معلمة الطلب، يقوم Craft CMS بحفظ الحمولة في ملف جلسة أثناء عملية إعادة التوجيه. لاحقًا، عندما يقوم PhpManager بتحميل هذا الملف، يمكن تنفيذ رمز المهاجم.

تعمل سلسلة الهجوم الكاملة على ثلاث مراحل. أولاً، يزرع المهاجم PHP ضارًا عن طريق إرسال عنوان URL مصمم خصيصًا، والذي يحفظه Craft CMS في ملف جلسة. بعد ذلك، يستغلون تجاوز __class في نقطة نهاية تحويل الصورة لتحميل أداة PhpManager وتوجيهها نحو ملف الجلسة الملوث. أخيرًا، عندما يقوم PhpManager بتحميل الملف، يتم تنفيذ حمولة المهاجم، مما يمنحه RCE والتحكم الكامل في الخادم — غالبًا من خلال webshell أو reverse shell.



التخفيف والمعالجة
للتخفيف بشكل فعال من المخاطر المرتبطة بـ CVE-2025-32432، تحتاج المؤسسات إلى رؤية واضحة ومراقبة لمكوناتها مفتوحة المصدر. بدون جرد واضح للمكونات، يصبح إصلاح الثغرات الأمنية مجرد تخمين.
تقوم OPSWAT وهي تقنية خاصةبمنصة MetaDefender®، بتلبية هذه الحاجة من خلال توفير قائمة بجميع مكونات البرامج والمكتبات وحاويات Docker والتبعيات المستخدمة. وهي تتيح للمؤسسات تتبع مكوناتها وتأمينها وتحديثها بشكل استباقي.


في المثال أعلاه، قامتتقنية SBOM في MetaDefender بمسح حزمة nginx-ingress-controller التي تحتوي على الثغرة الأمنية CVE-2025-32432. قام النظام تلقائيًا بتمييز المشكلة على أنها حرجة وقدم إرشادات حول الإصدارات الثابتة المتاحة، مما مكن الفرق من تحديد الأولويات بسرعة وتصحيح الثغرة الأمنية قبل أن يتم استغلالها.
OPSWAT متوفر في MetaDefender Core و MetaDefender Software Chain™،مما يتيح لفرق الأمن تحديد الثغرات الأمنية والتصرف بشأنها بشكل أسرع. باستخدام OPSWAT يمكن لفرق الأمن:
- تحديد المكونات المعرضة للخطر بسرعة - تحديد المكونات مفتوحة المصدر المتأثرة بهجمات إزالة التسلسل على الفور. وهذا يضمن اتخاذ إجراءات سريعة إما لتصحيح أو استبدال المكتبات المعرضة للخطر.
- ضمان إجراء التصحيحات والتحديثات بشكل استباقي - مراقبة المكونات مفتوحة المصدر باستمرار من خلال OPSWAT للبقاء في صدارة مكافحة ثغرات إزالة التسلسل. يمكن لـ OPSWAT اكتشاف المكونات القديمة أو غير الآمنة، مما يتيح إجراء التحديثات في الوقت المناسب وتقليل التعرض للهجمات.
- الحفاظ على الامتثال وإعداد التقارير – يساعد OPSWAT المؤسسات على تلبية متطلبات الامتثال، حيث تفرض الأطر التنظيمية بشكل متزايد الشفافية في سلاسل توريد البرمجيات.
هل أنت مستعد لتعزيز سلسلة توريد البرامج الخاصة بك ضد التهديدات الناشئة؟
