
Análisis de seguridad de un IDOR en Concrete CMS que expone las calificaciones de conversaciones mediante la falta de autorización en el endpoint get_rating, con causa raíz, escenario de ataque y solución.
CVE-2026-8239 es una vulnerabilidad de Referencia Directa a Objetos Insegura (IDOR) que afecta a Concrete CMS 9.5.0 y anteriores.La vulnerabilidad existe en el endpoint /ccm/frontend/conversations/get_rating, que permite a un atacante determinar si existe un mensaje de conversación y recuperar su calificación proporcionando un ID de mensaje arbitrario. El endpoint no realiza comprobaciones de autorización adecuadas antes de devolver la información solicitada.
Producto: Concrete CMS Versiones afectadas: 9.5.0 y anteriores Versión corregida: 9.5.1 Endpoint: /ccm/frontend/conversations/get_rating Tipo de vulnerabilidad Categoría: Referencia directa a objetos insegura (IDOR) CWE-862: Autorización faltante
El endpoint acepta un ID de mensaje del cliente y devuelve información sobre ese mensaje sin verificar si el usuario solicitante está autorizado a acceder a él.
En lugar de validar la propiedad o los permisos, la aplicación confía en el identificador proporcionado por el usuario.
Conceptualmente:
El usuario proporciona messageId ↓ El servidor localiza el mensaje ↓ Sin verificación de autorización ↓ Devuelve la calificación del mensaje
Debido a que falta la comprobación de autorización, un atacante puede enumerar IDs de mensajes y obtener información sobre conversaciones a las que no debería poder acceder.
Supongamos que la aplicación almacena mensajes de conversación con IDs numéricos.
Una solicitud legítima puede hacer referencia a:
GET /ccm/frontend/conversations/get_rating?messageId=125
Un atacante puede simplemente modificar el identificador:
GET /ccm/frontend/conversations/get_rating?messageId=126
Si la aplicación responde con la calificación en lugar de devolver 403 Forbidden o 404 Not Found, el atacante puede confirmar que el mensaje existe y recuperar su información de calificación.
Este es un IDOR clásico porque solo cambia el identificador del objeto—no se requiere ningún payload malicioso ni comandos inyectados.
&
Un atacante puede:
Enumerar IDs válidos de mensajes de conversación. Confirmar si existen mensajes específicos. Recuperar las calificaciones de mensajes a los que no está autorizado a acceder. Obtener información limitada sobre conversaciones privadas.
La vulnerabilidad afecta principalmente a la confidencialidad, ya que los usuarios no autorizados pueden acceder a información que debería estar protegida.
Métrica Puntuación CVSS v3.1 (NVD) 5.3 – Media CVSS v4.0 (Concrete CMS CNA) 6.3 – Media
El proveedor no ha publicado el código fuente vulnerable real. El siguiente ejemplo ilustra únicamente el patrón de vulnerabilidad.
$messageId = $_GET['messageId'];
$message = $conversationRepository->findMessage($messageId);
// No authorization check
return response()->json([
'rating' => $message->getRating()
]);
La aplicación recupera el mensaje basándose únicamente en el ID proporcionado por el usuario y devuelve inmediatamente su calificación. Nunca comprueba si el usuario actual tiene permiso para acceder a ese mensaje.
$messageId = $_GET['messageId'];
$message = $conversationRepository->findMessage($messageId);
if (!$authorizationService->canViewMessage($currentUser, $message)) {
return response()->json([
'error' => 'Access denied.'
], 403);
}
return response()->json([
'rating' => $message->getRating()
]);
La implementación corregida valida que el usuario autenticado tenga permiso para ver el mensaje solicitado antes de devolver su calificación. Incluso si un atacante cambia el messageId, el servidor aplica la autorización y rechaza las solicitudes no autorizadas con una respuesta HTTP 403 Forbidden. Esto previene el IDOR al garantizar que los usuarios solo puedan acceder a los recursos que tienen permitido ver.