
CVE-2024-29296 - Перечисление пользователей в Portainer CE - 2.19.4
Уязвимость перечисления пользователей была обнаружена в Portainer CE 2.19.4. Эта проблема возникает в процессе аутентификации пользователей, когда разница во времени ответа может позволить удаленному неаутентифицированному злоумышленнику определить, существует ли имя пользователя.
Эта уязвимость исправлена в решении #11736 проекта Portainer, которое было включено в версии Portainer CE 2.19.5 и 2.20.2.
Я обнаружил эту уязвимость, когда пытался провести атаку перебором паролей (password spray) на странице входа экземпляра Portainer. Я отправлял множество запросов с разными именами пользователей и паролями на форму входа приложения Portainer.
Независимо от существования пользователя, если комбинация «имя пользователя + пароль» неверна, серверная часть приложения Portainer отвечает одинаковым HTTP-статусом. Это соответствует лучшему подходу для предотвращения — или затруднения — попыток перечисления действительных пользователей.
Однако, изучая результаты моей атаки, я заметил, что попытки входа для некоторых имён пользователей последовательно занимают определённое среднее время, в то время как попытки входа для других имён пользователей последовательно занимают заметно большее среднее время.
Системе необходимо проверять правильность пароля для существующих пользователей, но этого не требуется, если имя пользователя изначально недействительно. Поэтому я предположил, что заметное изменение среднего времени попытки входа связано именно с этим. Затем я установил локальную копию Portainer CE 2.19.4 и попытался воспроизвести поведение, получив тот же результат.
Это формат запроса, который я отправлял. Поля имени пользователя и пароля были выбраны для вставки полезной нагрузки.

Вот имена пользователей, которые я вставлял в поле имени пользователя. В этом тесте действительными были только пользователи «admin» и «felipe». Все остальные имена пользователей в списке не соответствовали существующим.

А вот пароли, которые я вставлял в поле пароля.

Для каждой уникальной пары «имя пользователя — пароль» на сервер отправлялся один запрос. Результаты показаны ниже.

Когда имя пользователя соответствует существующему пользователю, попытки входа последовательно и заметно занимают больше времени по сравнению с попытками входа для несуществующих пользователей.
Это означает, что система Portainer в этой версии подвержена перечислению действительных пользователей: по времени, которое серверная часть тратит на ответ на попытки входа, злоумышленник может перечислить пользователей приложения.