Nel server di posta Exim critica (), che può portare all'esecuzione remota di codice sul server con privilegi di root durante l'elaborazione di una richiesta opportunamente formattata. La possibilità di sfruttare il problema è presente nelle versioni da 4.87 a 4.91 inclusive o in compilazioni con l'opzione EXPERIMENTAL_EVENT.
Nella configurazione predefinita, l'attacco può essere eseguito senza complicazioni da un utente locale, poiché viene applicata l'ACL «verify = recipient», che esegue controlli aggiuntivi per gli indirizzi esterni. L'esecuzione di attacchi remoti è possibile modificando le impostazioni, ad esempio, operando come secondo MX per un altro dominio, rimuovendo l'ACL «verify = recipient» o apportando modifiche specifiche a local_part_suffix). Può anche esserci la possibilità di attacco remoto se un malintenzionato riesce a mantenere aperta la connessione al server per 7 giorni (ad esempio, inviando un byte al minuto per superare la disconnessione per timeout). Non si esclude che esistano vettori di attacco più semplici per sfruttare il problema da remoto.
La vulnerabilità è causata da un controllo errato dell'indirizzo del destinatario nella funzione deliver_message(), definita nel file /src/deliver.c. Attraverso la manipolazione del formato dell'indirizzo, l'attaccante può ottenere l'inserimento dei propri dati negli argomenti del comando invocato tramite la funzione execv() con privilegi di root. Non è necessario utilizzare tecniche complesse, tipiche degli overflow di buffer o corruzione di memoria, basta semplicemente sostituire alcuni caratteri.
Il problema è legato all'uso della seguente costrutto per la trasformazione degli indirizzi:
deliver_localpart = expand_string(
string_sprintf("${local_part:%s}", new->address));
deliver_domain = expand_string(
string_sprintf("${domain:%s}", new->address));
La funzione expand_string() è un elaboratore sovraccarico, incluso il riconoscimento del comando "${run{comando argomenti}", che porta all'esecuzione di un elaboratore esterno. Pertanto, per attaccare durante una sessione SMTP, è sufficiente che un utente locale invii un comando del tipo ‘RCPT TO "username+${run{…}}@localhost"‘, dove localhost è uno degli host nella lista local_domains, e username è il nome di un utente locale esistente.
Se il server funziona come un relay di posta è sufficiente inviare da remoto il comando ‘RCPT TO «${run{…}}@relaydomain.com»‘, dove relaydomain.com è uno degli host elencati nella sezione delle impostazioni relay_to_domains. Poiché per impostazione predefinita in exim non viene applicata la modalità di azzeramento dei privilegi (deliver_drop_privilege = false), i comandi inviati tramite «${run{…}}» verranno eseguiti con i diritti di root.
È notevole che la vulnerabilità fosse nella versione rilasciata a febbraio 4.92 senza sottolineare che la correzione potrebbe comportare problemi di sicurezza. Non ci sono motivi per ritenere che ci sia stata una volontaria occultamento della vulnerabilità da parte degli sviluppatori di Exim, dato che il problema è stato risolto nell'ambito di un errore che si verifica durante la trasmissione di indirizzi non validi, e la vulnerabilità è stata scoperta dalla società Qualys durante un audit delle modifiche in Exim.
La correzione per le versioni precedenti, che continuano a essere utilizzate nelle distribuzioni, è attualmente disponibile solo in forma . Le release correttive per i rami precedenti con la risoluzione del problema sono programmate per l'11 giugno. Gli aggiornamenti dei pacchetti sono stati preparati per , , . e forniscono la versione 4.92, in cui il problema non si presenta. RHEL e CentOS non affrontano , poiché Exim non è incluso nel loro repository di pacchetti di default.
Fonte: opennet.ru
