
CVE-2026-8347 هي ثغرة مرجع مباشر غير آمن للكائنات (IDOR) مقترنة بثغرة مستوى تفويض خاطئ في إصدارات Concrete CMS 9.5.0 والإصدارات الأقدم. يكمن الخلل في مربع حوار إعادة ترتيب الارتباطات في Express، مما يسمح لمستخدم لا يملك سوى صلاحيات العرض على إدخال Express بتعديل ترتيب الارتباطات لكيان آخر.
CVE-2026-8347 هي ثغرة مرجع كائن مباشر غير آمن (IDOR) تؤثر على إصدارات Concrete CMS 9.5.0 والإصدارات الأقدم. تكمن المشكلة في وظيفة إعادة ترتيب الارتباطات في Express بسبب عدم كفاية فحوصات التفويض.
عندما يعيد المستخدم ترتيب الارتباطات، يتحقق التطبيق من أن المستخدم لديه صلاحية عرض إدخال Express ولكنه يفشل في التأكد من أن المستخدم مخوّل لتعديله. نتيجة لذلك، يمكن لمستخدم مصادق عليه بصلاحيات محدودة التلاعب بمعرّف كيان Express آخر وإعادة ترتيب ارتباطاته، حتى دون صلاحيات التحرير.
على عكس ثغرات حقن SQL أو تنفيذ التعليمات البرمجية عن بُعد، فإن هذا الخلل لا يتضمن حقن أوامر أو تعليمات برمجية خبيثة. بدلاً من ذلك، يستغل التحكم المكسور في الوصول عن طريق تغيير معرّف كائن يتحكم فيه المستخدم (مثل معرّف الكيان) للإشارة إلى مورد مستخدم آخر. نظرًا لأن الخادم لا يتحقق بشكل صحيح من التفويض للكائن المطلوب، فإنه ينفذ الإجراء على بيانات لا ينبغي أن يتمكن المهاجم من تعديلها.
// User requests to reorder associations $entityId = $_POST['entityId'];
$entity = $entityRepository->find($entityId);
// Only verifies that the user can access the entity if ($permissionChecker->canView($entity)) {
// Reorders associations without checking edit permission
$associationService->reorder($entity, $_POST['order']);
return response()->json([
'status' => 'success'
]);
}
يتحقق التطبيق فقط من صلاحية العرض قبل تنفيذ عملية تغيير الحالة.
يمكن للمهاجم تعديل معامل entityId في الطلب للإشارة إلى كيان مستخدم آخر. نظرًا لعدم إجراء أي فحص تفويض للتعديل نفسه، تنجح عملية إعادة الترتيب على مورد غير مصرح به.
قد يسمح الهجوم الناجح لمستخدم مصادق عليه بما يلي:
تؤثر الثغرة بشكل أساسي على سلامة البيانات ولا تسمح بطبيعتها بحقن SQL أو تنفيذ التعليمات البرمجية عن بُعد أو تجاوز المصادقة.
يجب على التطبيق التحقق من أن المستخدم المصادق عليه لديه صلاحية تعديل الكيان المحدد قبل معالجة طلب إعادة الترتيب.
$entityId = $_POST['entityId'];
$entity = $entityRepository->find($entityId);
// Verify modification permission if (!$permissionChecker->canEdit($entity)) {
return response()->json([
'error' => 'Access denied.'
], 403);
}
// User is authorized $associationService->reorder($entity, $_POST['order']);
return response()->json([ 'status' => 'success' ]);
قم بالترقية إلى Concrete CMS 9.5.1 أو إصدار أحدث. يجب على المطورين فرض فحوصات تفويض مناسبة من جانب الخادم لكل طلب يغيّر الحالة وضمان أن المستخدمين يمكنهم فقط تعديل الموارد المصرح لهم صراحةً بتحريرها.