
Concrete CMS의 심층 IDOR 분석 보고서: message_detail 엔드포인트, 권한 검증 누락의 근본 원인, 공격 시나리오, 영향 및 수정 방법을 다룹니다.
CVE-2026-8237은 Concrete CMS 9.5.0 및 이전 버전에서 권한 부여 검사 누락으로 인해 발생하는 IDOR(Insecure Direct Object Reference) 취약점입니다. 이 결함은 /ccm/frontend/conversations/message_detail 엔드포인트에 존재하며, 사용자가 제공한 메시지 식별자만으로 대화 메시지의 전체 내용을 반환합니다. 애플리케이션이 요청자가 해당 메시지에 접근할 권한이 있는지 확인하지 않기 때문에, 인증되지 않은 공격자가 메시지 ID를 열거하고 비공개로 유지되어야 하는 대화 내용을 검색할 수 있습니다. 해당 메시지와 연결된 파일 첨부 다운로드 URL도 노출될 수 있습니다. 이 문제는 Concrete CMS 9.5.1에서 수정되었습니다.
| 속성 | 값 |
|---|---|
| 제품 | Concrete CMS |
| 영향을 받는 버전 | 9.5.0 및 이전 버전 |
| 수정된 버전 | 9.5.1 |
| 영향을 받는 엔드포인트 | /ccm/frontend/conversations/message_detail |
이 엔드포인트는 클라이언트가 제어하는 메시지 ID를 사용하여 대화 메시지를 검색하며, 현재 사용자가 해당 특정 메시지에 접근할 권한이 있는지 검증하지 않습니다.
취약한 작업 흐름은 개념적으로 다음과 같습니다:
사용자가 messageId를 제공합니다
↓
서버가 메시지를 가져옵니다
↓
권한 부여 검사 없음
↓
전체 메시지 내용을 반환합니다
소유권이나 접근 권한이 검증되지 않으므로, 공격자는 messageId 값을 변경하여 다른 사용자의 대화 메시지에 접근할 수 있습니다.
정상적인 요청이 메시지 150을 검색한다고 가정합니다:
GET /ccm/frontend/conversations/message_detail?messageId=150
공격자는 단순히 식별자를 변경합니다:
GET /ccm/frontend/conversations/message_detail?messageId=151
서버가 접근을 거부하는 대신 메시지 151의 내용으로 응답하면, 공격자는 ID를 계속 증가시켜 비공개 대화와 관련 첨부 파일을 열거할 수 있습니다.
성공적인 악용 시 공격자는 다음을 수행할 수 있습니다:
이 취약점은 권한 없이 민감한 정보가 노출될 수 있으므로 주로 기밀성에 영향을 미칩니다.
| 지표 | 점수 |
|---|---|
| CVSS v3.1 (NVD) | 5.3 (중간) |
| CVSS v4.0 (Concrete CMS) | 6.3 (중간) |
참고: 공급업체는 실제 취약한 소스 코드를 공개하지 않았습니다. 다음 예제는 취약점 패턴만을 설명합니다.
$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를 변경하더라도, 사용자가 해당 특정 메시지에 접근할 권한이 없으면 요청이 거부됩니다. 이를 통해 대화 내용과 첨부 파일의 무단 노출을 방지합니다.