
Concrete CMS의 get_rating 엔드포인트에 대한 인가 누락으로 대화 평점이 노출되는 IDOR 취약점에 대한 보안 분석 글로, 근본 원인, 공격 시나리오 및 수정 방법을 포함합니다.
CVE-2026-8239는 Concrete CMS 9.5.0 및 이전 버전에 영향을 미치는 안전하지 않은 직접 객체 참조(IDOR) 취약점입니다. 이 취약점은 /ccm/frontend/conversations/get_rating 엔드포인트에 존재하며, 공격자가 임의의 메시지 ID를 제공하여 대화 메시지의 존재 여부를 확인하고 평점 점수를 검색할 수 있게 합니다. 해당 엔드포인트는 요청된 정보를 반환하기 전에 적절한 권한 검사를 수행하지 않습니다.
제품: Concrete CMS 영향받는 버전: 9.5.0 및 이전 버전 수정 버전: 9.5.1 엔드포인트: /ccm/frontend/conversations/get_rating
취약점 유형
카테고리: 안전하지 않은 직접 객체 참조(IDOR) CWE-862: 누락된 권한 부여
엔드포인트는 클라이언트로부터 메시지 ID를 전달받아, 요청한 사용자가 해당 메시지에 접근할 권한이 있는지 확인하지 않고 해당 메시지에 대한 정보를 반환합니다.
애플리케이션은 소유권이나 권한을 검증하는 대신 사용자가 제공한 식별자를 신뢰합니다.
개념적으로:
User supplies messageId ↓ Server locates message ↓ No authorization check ↓ Returns message rating
권한 검사가 누락되어 있기 때문에 공격자는 메시지 ID를 열거하여 접근할 수 없어야 하는 대화에 대한 정보를 얻을 수 있습니다.
애플리케이션이 대화 메시지를 숫자 ID로 저장한다고 가정합니다.
정상적인 요청은 다음과 같이 표현될 수 있습니다:
GET /ccm/frontend/conversations/get_rating?messageId=125
공격자는 식별자를 간단히 수정할 수 있습니다:
GET /ccm/frontend/conversations/get_rating?messageId=126
애플리케이션이 403 Forbidden 또는 404 Not Found를 반환하는 대신 평점 점수로 응답하면, 공격자는 해당 메시지가 존재함을 확인하고 평점 정보를 검색할 수 있습니다.
객체 식별자만 변경될 뿐 악성 페이로드나 주입된 명령이 필요하지 않기 때문에 이는 전형적인 IDOR입니다.
공격자는 다음을 수행할 수 있습니다:
이 취약점은 주로 기밀성에 영향을 미칩니다. 권한이 없는 사용자가 보호되어야 할 정보에 접근할 수 있기 때문입니다.
| 지표 | 점수 |
|---|---|
| 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을 방지합니다.