Vulnerabilità critica in Exim che consente l'esecuzione del codice sul server con privilegi di root

Nel server di posta Exim identificato critico vulnerabilità (CVE-2019-10149), che può portare all'esecuzione di codice in modalità remota sul server con diritti di root durante l'elaborazione di una richiesta appositamente predisposta. La possibilità di sfruttamento del problema è stata notata nelle versioni dalla 4.87 alla 4.91 comprese o durante la creazione con l'opzione EXPERIMENTAL_EVENT.

Nella configurazione predefinita l'attacco può essere effettuato senza inutili complicazioni da un utente locale, poiché viene applicata l'ACL "verify = recipient" che esegue controlli aggiuntivi per gli indirizzi esterni. Un attacco remoto può verificarsi quando le impostazioni vengono modificate, ad esempio agendo come MX secondario per un altro dominio, rimuovendo l'ACL "verify=recipient" o alcune modifiche a local_part_suffix). Un attacco remoto è possibile anche se l'aggressore riesce a mantenere aperta la connessione al server per 7 giorni (ad esempio inviando un byte al minuto per aggirare un timeout). Allo stesso tempo, è possibile che esistano vettori di attacco più semplici per lo sfruttamento remoto del problema.

La vulnerabilità è causata da un'errata verifica dell'indirizzo del destinatario nella funzione deliver_message() definita nel file /src/deliver.c. Manipolando la formattazione dell'indirizzo, un utente malintenzionato può ottenere la sostituzione dei suoi dati negli argomenti di un comando richiamato tramite la funzione execv() con diritti di root. Il funzionamento non richiede l'uso di tecniche complesse utilizzate per i buffer overflow o il danneggiamento della memoria; è sufficiente la semplice sostituzione dei caratteri.

Il problema è legato all'uso del costrutto per la conversione degli indirizzi:

consegna_partelocale = espandi_stringa(
string_sprintf("${local_part:%s}", nuovo->indirizzo));
consegna_dominio = espandi_stringa(
string_sprintf("${dominio:%s}", nuovo->indirizzo));

La funzione expand_string() è un combinatore eccessivamente complicato, incluso il riconoscimento del comando "${run{command topics}", che porta al lancio di un gestore esterno. Pertanto, per attaccare all'interno di una sessione SMTP, un utente locale deve solo inviare un comando come 'RCPT TO “username+${run{...}}@localhost”', dove localhost è uno degli host dall'elenco local_domains, e nomeutente è il nome di un utente locale esistente.

Se il server funziona come relè di posta, è sufficiente inviare da remoto il comando 'RCPT TO "${run{...}}@relaydomain.com"', dove Relaydomain.com è uno degli host elencati in Relay_to_domains sezione Impostazioni. Poiché Exim non rinuncia automaticamente alla modalità privilegio (deliver_drop_privilege = false), i comandi passati tramite "${run{...}}" verranno eseguiti come root.

È interessante notare che la vulnerabilità era eliminato nella versione 4.92 rilasciata a febbraio, senza sottolineare che la correzione potrebbe portare a problemi di sicurezza. Non c'è motivo di credere che gli sviluppatori di Exim abbiano nascosto deliberatamente la vulnerabilità, poiché il problema è stato risolto durante correzioni errore che si verifica quando vengono trasmessi indirizzi errati e la vulnerabilità è stata identificata da Qualys durante un controllo delle modifiche in Exim.

Una correzione per le versioni precedenti che continuano a essere utilizzate nelle distribuzioni è attualmente disponibile solo come toppa. I rilasci correttivi per i rami precedenti per risolvere il problema sono previsti per l'11 giugno. Gli aggiornamenti del pacchetto sono pronti per Debian, Ubuntu, openSUSE. Arch Linux и Fedora Forniscono la versione 4.92, nella quale il problema non si presenta. Problema RHEL e CentOS non suscettibile, poiché Exim non è incluso nel loro normale repository di pacchetti.

Fonte: opennet.ru

Aggiungi un commento