
شرح مفصل لثغرة IDOR في Concrete CMS، يغطي نقطة النهاية message_detail، السبب الجذري لغياب التحقق من الصلاحيات، سيناريوهات الهجوم، التأثير، والإصلاح.
CVE-2026-8237 عبارة عن ثغرة مرجع كائن مباشر غير آمن (IDOR) ناتجة عن غياب فحوصات التفويض في Concrete CMS 9.5.0 والإصدارات الأقدم. يوجد الخلل في نقطة النهاية /ccm/frontend/conversations/message_detail، التي تُرجع المحتوى الكامل لرسائل المحادثة استنادًا فقط إلى معرّف رسالة يقدمه المستخدم. نظرًا لأن التطبيق لا يتحقق مما إذا كان الطالب مخولًا للوصول إلى الرسالة المحددة، يمكن لمهاجم غير مصادق تعداد معرّفات الرسائل واسترداد محتوى المحادثات الذي يجب أن يظل خاصًا. كما قد يتم الكشف عن روابط تنزيل المرفقات المرتبطة بتلك الرسائل. تم إصلاح المشكلة في Concrete CMS 9.5.1.
| الخاصية | القيمة |
|---|---|
| المنتج | Concrete CMS |
| الإصدارات المتأثرة | 9.5.0 والإصدارات الأقدم |
| الإصدار المُصلَح | 9.5.1 |
| نقطة النهاية المتأثرة | /ccm/frontend/conversations/message_detail |
تقوم نقطة النهاية باسترداد رسالة محادثة باستخدام معرّف رسالة يتحكم فيه العميل دون التحقق مما إذا كان المستخدم الحالي لديه إذن للوصول إلى تلك الرسالة المحددة.
سير العمل القابل للاستغلال من الناحية المفاهيمية هو:
يقدم المستخدم messageId
↓
يسترد الخادم الرسالة
↓
لا يوجد فحص تفويض
↓
يُرجع المحتوى الكامل للرسالة
نظرًا لعدم التحقق من الملكية أو أذونات الوصول أبدًا، يمكن للمهاجمين تغيير قيمة messageId للوصول إلى رسائل محادثة المستخدمين الآخرين.
افترض أن طلبًا شرعيًا يسترد الرسالة 150:
GET /ccm/frontend/conversations/message_detail?messageId=150
يقوم المهاجم ببساطة بتغيير المعرّف:
GET /ccm/frontend/conversations/message_detail?messageId=151
إذا استجاب الخادم بمحتويات الرسالة 151 بدلاً من رفض الوصول، يمكن للمهاجم مواصلة زيادة المعرّفات لتعداد المحادثات الخاصة والمرفقات المرتبطة بها.
قد يسمح الاستغلال الناجح للمهاجم بـ:
تؤثر الثغرة بشكل أساسي على السرية لأن المعلومات الحساسة يمكن كشفها دون تفويض.
| المقياس | الدرجة |
|---|---|
| CVSS v3.1 (NVD) | 5.3 (متوسطة) |
| CVSS v4.0 (Concrete CMS) |
ملاحظة: لم ينشر البائع الكود المصدري الفعلي القابل للاستغلال. المثال التالي يوضح نمط الثغرة فقط.
$messageId = $_GET['messageId'];
$message = $conversationRepository->find($messageId);
// Missing authorization check
return response()->json([
'message' => $message->getContent(),
'attachments' => $message->getAttachments()
]);
يثق التطبيق في messageId الذي يتحكم فيه المستخدم ويُعيد الرسالة المطلوبة دون التأكد من أن الطالب مخول للوصول إليها.
$messageId = $_GET['messageId'];
$message = $conversationRepository->find($messageId);
if (!$authorizationService->canView($currentUser, $message)) {
return response()->json([
'error' => 'Access denied'
], 403);
}
return response()->json([
'message' => $message->getContent(),
'attachments' => $message->getAttachments()
]);
ينفذ التنفيذ المصحح فحص تفويض من جانب الخادم قبل إرجاع أي بيانات محادثة. حتى إذا قام المهاجم بتعديل messageId، يتم رفض الطلب ما لم يكن لدى المستخدم إذن للوصول إلى تلك الرسالة المحددة. وهذا يمنع الكشف غير المصرح به عن محتويات المحادثات والمرفقات.
| 6.3 (متوسطة) |