
Análisis detallado de IDOR para Concrete CMS, que cubre el endpoint message_detail, la causa raíz de la falta de autorización, escenarios de ataque, impacto y solución.
CVE-2026-8237 es una vulnerabilidad de Referencia Directa Insegura a Objetos (IDOR) causada por la falta de comprobaciones de autorización en Concrete CMS 9.5.0 y anteriores. La falla existe en el endpoint /ccm/frontend/conversations/message_detail, que devuelve el contenido completo de los mensajes de conversación basándose únicamente en un identificador de mensaje proporcionado por el usuario. Debido a que la aplicación no verifica si el solicitante está autorizado a acceder al mensaje especificado, un atacante no autenticado puede enumerar IDs de mensajes y recuperar contenido de conversaciones que debería permanecer privado. Las URLs de descarga de archivos adjuntos asociados a esos mensajes también pueden ser divulgadas. El problema se corrige en Concrete CMS 9.5.1.
| Propiedad | Valor |
|---|---|
| Producto | Concrete CMS |
| Versiones afectadas | 9.5.0 y anteriores |
| Versión corregida | 9.5.1 |
| Endpoint afectado | /ccm/frontend/conversations/message_detail |
El endpoint recupera un mensaje de conversación utilizando un ID de mensaje controlado por el cliente sin validar si el usuario actual tiene permiso para acceder a ese mensaje específico.
El flujo de trabajo vulnerable es conceptualmente:
El usuario proporciona messageId
↓
El servidor obtiene el mensaje
↓
No hay verificación de autorización
↓
Devuelve el contenido completo del mensaje
Debido a que la propiedad o los permisos de acceso nunca se verifican, los atacantes pueden cambiar el valor de messageId para acceder a los mensajes de conversación de otros usuarios.
Supongamos que una solicitud legítima recupera el mensaje 150:
GET /ccm/frontend/conversations/message_detail?messageId=150
Un atacante simplemente cambia el identificador:
GET /ccm/frontend/conversations/message_detail?messageId=151
Si el servidor responde con el contenido del mensaje 151 en lugar de denegar el acceso, el atacante puede seguir incrementando los IDs para enumerar conversaciones privadas y sus archivos adjuntos asociados.
La explotación exitosa puede permitir a un atacante:
La vulnerabilidad afecta principalmente a la confidencialidad porque se puede divulgar información sensible sin autorización.
| Métrica | Puntuación |
|---|---|
| CVSS v3.1 (NVD) | 5.3 (Media) |
| CVSS v4.0 (Concrete CMS) |
Nota: El proveedor no ha publicado el código fuente vulnerable real. El siguiente ejemplo ilustra únicamente el patrón de la vulnerabilidad.
$messageId = $_GET['messageId'];
$message = $conversationRepository->find($messageId);
// Missing authorization check
return response()->json([
'message' => $message->getContent(),
'attachments' => $message->getAttachments()
]);
La aplicación confía en el messageId controlado por el usuario y devuelve el mensaje solicitado sin confirmar que el solicitante está autorizado a acceder a él.
$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()
]);
La implementación corregida realiza una verificación de autorización del lado del servidor antes de devolver cualquier dato de conversación. Incluso si un atacante modifica el messageId, la solicitud se deniega a menos que el usuario tenga permiso para acceder a ese mensaje específico. Esto evita la divulgación no autorizada de contenidos de conversación y archivos adjuntos.
| 6.3 (Media) |