Ricercatori di sicurezza di Qualys
Il problema è causato da un overflow di numeri interi nella funzione stralloc_readyplus(), che può verificarsi durante l'elaborazione di un messaggio molto grande. L'operazione richiedeva un sistema a 64 bit con più di 4 GB di memoria virtuale. Quando la vulnerabilità fu analizzata per la prima volta nel 2005, Daniel J. Bernstein sostenne che il presupposto nel codice secondo cui la dimensione dell'array allocato fosse sempre entro il valore di 32 bit si basava sul fatto che nessuno fornisce gigabyte di memoria a ciascun processo. Negli ultimi 15 anni, i sistemi a 64 bit sui server hanno sostituito i sistemi a 32 bit e la quantità di memoria fornita e la larghezza di banda di rete sono aumentate notevolmente.
I manutentori del pacchetto qmail hanno tenuto conto della nota di Bernstein e hanno limitato la memoria disponibile all'avvio del processo qmail-smtpd (ad esempio, in Debian 10 il limite è impostato a 7 MB). Ma gli ingegneri di Qualys hanno scoperto che questo non basta e che, oltre a qmail-smtpd, è possibile sferrare un attacco remoto anche al processo qmail-local, che in tutti i pacchetti testati è rimasto illimitato. Come prova è stato preparato un prototipo di exploit adatto ad attaccare il pacchetto Debian con qmail nella configurazione predefinita.
Per organizzare l'esecuzione del codice remoto durante un attacco, il server richiede 4 GB di spazio libero su disco e 8 GB di RAM.
L'exploit consente di eseguire qualsiasi comando shell con i diritti di qualsiasi utente del sistema, ad eccezione degli utenti root e di sistema che non hanno una propria sottodirectory nella directory "/home" (il processo qmail-local viene avviato con i diritti dell'utente locale a cui viene effettuata la consegna).
L'attacco viene effettuato
inviando un messaggio di posta molto grande, comprendente diverse righe di intestazione, che misurano circa 4 GB e 576 MB. L'elaborazione di tale stringa in qmail-local provoca un overflow di numeri interi quando si tenta di consegnare un messaggio all'utente locale. Un overflow di numeri interi porta quindi ad un overflow del buffer durante la copia dei dati e alla possibilità di sovrascrivere le pagine di memoria con codice libc. Manipolando la disposizione dei dati trasmessi è anche possibile riscrivere l'indirizzo della funzione “open()”, sostituendolo con l'indirizzo della funzione “system()”.
Successivamente, nel processo di chiamata di qmesearch() in qmail-local, il file “.qmail-extension” viene aperto tramite la funzione open(), che porta all'effettiva esecuzione della funzione
system(".qmail-estensione"). Ma poiché la parte "estensione" del file viene generata in base all'indirizzo del destinatario (ad esempio, "localuser-extension@localdomain"), gli aggressori possono organizzare l'invio del comando specificando l'utente "localuser-;command ;@localdomain” come destinatario del messaggio.
Durante l'analisi del codice sono state identificate due vulnerabilità anche nella patch aggiuntiva qmail-verify, che fa parte del pacchetto per Debian. Prima vulnerabilità (
Per aggirare il problema, Bernstein consiglia di eseguire i processi qmail con un limite totale di memoria disponibile (“softlimit -m12345678”), nel qual caso il problema viene bloccato. Come metodo di protezione alternativo viene menzionata anche la limitazione della dimensione massima del messaggio elaborato tramite il file “control/databytes” (per impostazione predefinita non viene creato con le impostazioni predefinite qmail rimane vulnerabile). Inoltre, "control/databytes" non protegge dagli attacchi locali da parte degli utenti del sistema, poiché il limite viene preso in considerazione solo da qmail-smtpd.
Il problema riguarda il pacchetto
Fonte: opennet.ru