
Разбор уязвимости безопасности IDOR в Concrete CMS, раскрывающей оценки разговоров из-за отсутствия авторизации на эндпоинте get_rating, с описанием первопричины, сценария атаки и исправления.
CVE-2026-8239 — это уязвимость типа Insecure Direct Object Reference (IDOR), затрагивающая Concrete CMS 9.5.0 и более ранние версии. Уязвимость присутствует в конечной точке /ccm/frontend/conversations/get_rating, которая позволяет атакующему определить, существует ли сообщение в переписке, и получить его рейтинговую оценку, указав произвольный ID сообщения. Конечная точка не выполняет надлежащих проверок авторизации перед возвратом запрошенной информации.
Продукт: Concrete CMS Затронутые версии: 9.5.0 и более ранние Исправленная версия: 9.5.1 Конечная точка: /ccm/frontend/conversations/get_rating Тип уязвимости Категория: Insecure Direct Object Reference (IDOR) CWE-862: Отсутствие авторизации
Конечная точка принимает ID сообщения от клиента и возвращает информацию об этом сообщении, не проверяя, авторизован ли запрашивающий пользователь для доступа к нему.
Вместо проверки владения или разрешений приложение доверяет идентификатору, предоставленному пользователем.
Концептуально:
Пользователь указывает messageId ↓ Сервер находит сообщение ↓ Проверка авторизации отсутствует ↓ Возвращается рейтинг сообщения
Поскольку проверка авторизации отсутствует, атакующий может перебирать ID сообщений и получать информацию о переписках, к которым у него не должно быть доступа.
Предположим, приложение хранит сообщения переписок с числовыми ID.
Легитимный запрос может ссылаться на:
GET /ccm/frontend/conversations/get_rating?messageId=125
Атакующий может просто изменить идентификатор:
GET /ccm/frontend/conversations/get_rating?messageId=126
Если приложение отвечает рейтинговой оценкой вместо 403 Forbidden или 404 Not Found, атакующий может подтвердить, что сообщение существует, и получить информацию о его рейтинге.
Это классический IDOR, поскольку изменяется только идентификатор объекта — не требуется ни вредоносной полезной нагрузки, ни внедрённых команд.
Атакующий может:
Перебирать валидные ID сообщений переписок. Подтверждать существование конкретных сообщений. Получать рейтинговые оценки сообщений, к которым он не авторизован. Получать ограниченную информацию о приватных переписках.
Уязвимость в первую очередь влияет на конфиденциальность, поскольку неавторизованные пользователи могут получать доступ к информации, которая должна быть защищена.
Метрика Оценка CVSS v3.1 (NVD) 5.3 – Средний CVSS v4.0 (Concrete CMS CNA) 6.3 – Средний
Вендор не публиковал фактический уязвимый исходный код. Следующий пример лишь иллюстрирует паттерн уязвимости.
$messageId = $_GET['messageId'];
$message = $conversationRepository->findMessage($messageId);
// No authorization check return response()->json([ 'rating' => $message->getRating() ]);
Приложение извлекает сообщение, основываясь исключительно на предоставленном пользователем ID, и немедленно возвращает его рейтинг. Оно никогда не проверяет, разрешено ли текущему пользователю доступ к этому сообщению.
$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() ]);
Исправленная реализация проверяет наличие у аутентифицированного пользователя разрешения на просмотр запрошенного сообщения перед возвратом его рейтинга. Даже если атакующий изменит messageId, сервер применяет авторизацию и отклоняет неавторизованные запросы ответом HTTP 403 Forbidden. Это предотвращает IDOR, гарантируя, что пользователи могут получать доступ только к тем ресурсам, которые им разрешено просматривать.