Vulnerabilità in OpenSMTPD, che consente l'esecuzione remota di codice con privilegi di root

Nel progetto in fase di sviluppo del server di posta OpenBSD OpenSMTPD identificata vulnerabilità critica (CVE-2020-7247), che consente di eseguire comandi shell in remoto sul server con i diritti dell'utente root. La vulnerabilità è stata identificata durante un audit di follow-up effettuato dalla società Qualys Security (precedente audit di OpenSMTPD effettuato nel 2015, mentre la nuova vulnerabilità è presente dal maggio 2018). Il problema è stato risolto si trova nella versione OpenSMTPD 6.6.2. Si raccomanda a tutti gli utenti di installare urgentemente l'aggiornamento (per OpenBSD la correzione può essere installata tramite syspatch).

Sono stati suggeriti due metodi di attacco. Il primo metodo funziona nella configurazione predefinita di OpenSMTPD (ricezione delle richieste solo da localhost) e consente di sfruttare il problema localmente, quando l'attaccante ha la possibilità di accedere all'interfaccia di rete locale (loopback) sul server (ad esempio, nei sistemi di hosting). Il secondo metodo si manifesta nel caso in cui OpenSMTPD sia configurato per ricevere richieste di rete esterne (server di posta che riceve email esterne). I ricercatori hanno preparato un prototipo di exploit, che funziona con successo sia con la versione di OpenSMTPD inclusa in OpenBSD 6.6, sia con la versione portabile per altri sistemi operativi (testato su Debian Testing).

Il problema è causato da un errore nella funzione smtp_mailaddr(), chiamata per verificare la correttezza dei valori nei campi «MAIL FROM» e «RCPT TO», che definiscono il mittente/il destinatario e vengono trasmessi durante la connessione con il server di posta. Per verificare la parte dell'indirizzo email che precede il simbolo «@», nella smtp_mailaddr() viene chiamata la funzione
valid_localpart(), che considera simboli consentiti (MAILADDR_ALLOWED) «!#$%&’*?/^`{|}~+-=_», in conformità con i requisiti RFC 5322.

In questo caso, l'escaping diretto della stringa viene effettuato nella funzione mda_expand_token(), che sostituisce solo i simboli «!#$%&’*?`{|}~» (MAILADDR_ESCAPE). Successivamente, la stringa preparata in mda_expand_token() viene utilizzata quando si chiama l'agente di consegna (MDA) tramite il comando ‘execle(«/bin/sh», «/bin/sh», «-c», mda_command,…’. Nel caso in cui la mail venga inserita in mbox tramite /bin/sh, viene eseguita la stringa «/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}», dove il valore «%{mbox.from}» include dati eseguiti dal parametro «MAIL FROM».

La vulnerabilità consiste nel fatto che smtp_mailaddr() presenta un errore logico, per cui nel caso in cui venga fornito un dominio vuoto nell'email, la funzione restituisce un codice di verifica successo, anche se la parte dell'indirizzo prima di «@» contiene caratteri non validi. Successivamente, durante la preparazione della stringa con la funzione mda_expand_token(), non vengono eseguite l'escapement di tutti i possibili caratteri speciali della shell, ma solo i caratteri speciali consentiti nell'indirizzo email. Dunque, per eseguire il proprio comando, è sufficiente utilizzare nella parte locale dell'email il carattere «;» e uno spazio, che non fanno parte del set MAILADDR_ESCAPE e non vengono eseguiti in escape. Ad esempio:

$ nc 127.0.0.1 25

HELO professor.falken
MAIL FROM:<;sleep 66;>
RCPT TO:<root>
DATA
.
QUIT

Dopo questa sessione, OpenSMTPD eseguirà un comando tramite shell durante la consegna in mbox

/usr/libexec/mail.local -f ;sleep 66; root

Le possibilità di attacco sono limitate dal fatto che la parte locale dell'indirizzo non può superare i 64 caratteri e i caratteri speciali ‘$’ e ‘|’ vengono sostituiti con «:» durante l'escapement. Per aggirare questa limitazione, è stato sfruttato il fatto che il corpo dell'email viene trasferito dopo l'avvio di /usr/libexec/mail.local attraverso un flusso di input, cioè attraverso manipolazioni con l'indirizzo è possibile avviare solo l'interprete dei comandi sh e utilizzare il corpo dell'email come un insieme di istruzioni. Poiché all'inizio dell'email vengono specificati gli header SMTP, per saltarli si propone di utilizzare il comando read in un ciclo. L'exploit funzionante assume circa il seguente aspetto:

$ nc 192.168.56.143 25

HELO professor.falken
MAIL FROM:<;for i in 0 1 2 3 4 5 6 7 8 9 a b c d;do read r;done;sh;exit 0;>
RCPT TO:<root@example.org>
DATA
#0
#1

#d
for i in W O P R; do
echo -n «($i) » && id || break
done > /root/x.»`id -u`».»$$»
.
QUIT

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster