In u servitore di mail sviluppatu da u prughjettu OpenBSD identificatu (CVE-2020-7247), chì vi permette di eseguisce remotamente cumandamenti di shell in u servitore cù diritti d'utilizatore root. A vulnerabilità hè stata identificata durante una re-audit realizata da Qualys Security (precedente audit OpenSMTPD in 2015, è a nova vulnerabilità hè presente da maghju 2018). Prublemu in a versione OpenSMTPD 6.6.2. Tutti l'utilizatori sò cunsigliati per installà immediatamente l'aghjurnamentu (per OpenBSD, u patch pò esse installatu via syspatch).
Dui varianti d'attaccu sò state pruposte. A prima variante funziona cù a cunfigurazione predefinita di OpenSMTPD (riceve richieste solu da localhost) è permette u sfruttamentu lucale quandu l'attaccante hà accessu à l'interfaccia di rete lucale (loopback) nantu à u servitore (per esempiu, nantu à i sistemi di hosting). A seconda variante si verifica quandu OpenSMTPD hè cunfiguratu per riceve richieste di rete esterne (un servitore di posta chì accetta posta di terze parti). I circadori anu preparatu un prototipu di exploit chì funziona cù successu sia cù a variante OpenSMTPD inclusa cù OpenBSD 6.6 sia cù a versione portatile per altri sistemi operativi (realizzata in Debian Testu).
U prublema hè causatu da un errore in a funzione smtp_mailaddr(), chì hè chjamatu per verificà a correttezza di i valori in i campi "MAIL FROM" è "RCPT TO" chì definiscenu u mittente / destinatariu è sò passati durante a cunnessione. cù u servitore di mail. Per verificà a parte di l'indirizzu email chì vene prima di u simbulu "@", a funzione smtp_mailaddr() hè chjamata
valid_localpart(), chì accetta (MAILADDR_ALLOWED) i caratteri "!#$%&'*/?^`{|}~+-=_", cum'è dumandatu da RFC 5322.
In questu casu, a scappata diretta di a stringa hè realizata in a funzione mda_expand_token(), chì rimpiazza solu i caratteri "!#$%&'*?`{|}~" (MAILADDR_ESCAPE). In seguitu, a linea preparata in mda_expand_token() hè aduprata quandu si chjama l'agente di consegna (MDA) cù u cumandimu 'execle ("/bin/sh", "/bin/sh", "-c", mda_command,...' . In casu di mette lettere à mbox via /bin/sh, a linea "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}" hè lanciata, induve u valore "% . {mbox.from}" include dati scappati da u paràmetru "MAIL FROM".
L'essenza di a vulnerabilità hè chì smtp_mailaddr() hà un errore logicu, per via di quale, se un duminiu viotu hè mandatu per email, a funzione torna un codice di verificazione successu, ancu s'è a parte di l'indirizzu prima di "@" cuntene caratteri invalidi. . In più, quandu preparanu una stringa, a funzione mda_expand_token() ùn scappa micca tutti i pussibuli caratteri speciali di shell, ma solu caratteri speciali permessi in l'indirizzu email. Cusì, per eseguisce u vostru cumandamentu, hè abbastanza per aduprà u simbulu ";" in a parte locale di l'email. è spaziu, chì ùn sò micca inclusi in u set MAILADDR_ESCAPE è ùn sò micca scappati. Per esempiu:
$nc 127.0.0.1 25
HELO prufissore.falken
MAIL FROM:<;sleep 66;>
RCPT à:
DATA
.
QUITÀ
Dopu à sta sessione, OpenSMTPD, quandu hè mandatu à mbox, lanciarà u cumandamentu attraversu a cunchiglia
/usr/libexec/mail.local -f ;sleep 66; radica
À u listessu tempu, e pussibulità di l'attaccu sò limitati da u fattu chì a parte lucale di l'indirizzu ùn pò esse più di 64 caratteri, è i caratteri speciali '$' è '|' sò rimpiazzati cù ":" quandu scappa. Per scaccià sta limitazione, usemu u fattu chì u corpu di a lettera hè trasmessa dopu à eseguisce /usr/libexec/mail.local attraversu u flussu di input, i.e. Manipulendu l'indirizzu, pudete solu lancià l'interprete di cumandamentu sh è aduprà u corpu di a lettera cum'è un set di struzzioni. Siccomu l'intestazione SMTP di u serviziu sò indicati à l'iniziu di a lettera, hè cunsigliatu di utilizà l'ordine di lettura in un ciclu per saltà. Un sfruttamentu di travagliu s'assumiglia à questu:
$nc 192.168.56.143 25
HELO prufissore.falken
MAIL FROM:<;per i in 0 1 2 3 4 5 6 7 8 9 abcd;do leghje r;fattu;sh;exit 0;>
RICEVUTA À:
DATA
#0
#1
...
#d
per i in WOPR; fà
echo -n "($i) " && id || ruttura
finitu > /root/x."`id -u`.""$$"
.
QUITÀ
Source: opennet.ru
