Në projektin e zhvilluar OpenBSD për serverin e postës u identifikua (CVE-2020-7247), e cila lejon ekzekutimin e komandave shell në server me të drejtat e përdoruesit root. Vulnerabiliteti u identifikua gjatë një auditi të ripërsëritur, të kryer nga kompania Qualys Security (auditi i mëparshëm i OpenSMTPD ishte kryer në vitin 2015, ndërsa vulnerabiliteti i ri është prezent që nga maji i vitit 2018). në vitin 2015, dhe vulnerabiliteti i ri është prezent që nga maji i vitit 2018). Problemi janë lëshuar në versionin OpenSMTPD 6.6.2. Të gjithë përdoruesve u rekomandohet të instalojnë menjëherë përditësimin (për OpenBSD, rregullimi mund të instalohet përmes syspatch).
Janë propozuar dy variante sulmi. Varianti i parë funksionon në konfigurimin e paracaktuar të OpenSMTPD (pranimi i kërkesave vetëm nga localhost) dhe lejon shfrytëzimin e problemit në mënyrë lokale, kur sulmuesi ka mundësinë të qasje në ndërfaqen lokale të rrjetit (loopback) në server (p.sh., në sistemet e hostimit). Varianti i dytë shfaqet në rastin e konfigurimit të OpenSMTPD për pranimin e kërkesave të jashtme të rrjetit (serveri i postës, që pranon email nga palë të treta). Kërkuesit kanë përgatitur një prototip të eksploitit, i cili funksionon me sukses si me variantin OpenSMTPD të përfshirë në OpenBSD 6.6, ashtu edhe me versionin e portuar për sisteme të tjera operative (i testuar në Debian Testing).
Problemi shkaktohet nga një gabim në funksionin smtp_mailaddr(), i cili thirret për të kontrolluar saktësinë e vlerave në fushat 'MAIL FROM' dhe 'RCPT TO', që përcaktojnë dërguesin/marrësin dhe që kalohen gjatë lidhjes me serverin e postës. Për të kontrolluar pjesën e adresës së postës, që vjen para simbolit '@', në smtp_mailaddr() thirret funksioni
valid_localpart(), i cili konsideron si tĂ« lejuar (MAILADDR_ALLOWED) karakteret '!#$%&â*?/^`{|}~+-=_', nĂ« pĂ«rputhje me kĂ«rkesat e RFC 5322.
NĂ« kĂ«tĂ« rast, ekrani i drejtpĂ«rdrejtĂ« i vargut bĂ«het nĂ« funksionin mda_expand_token(), i cili zĂ«vendĂ«son vetĂ«m karakteret '!#$%&â*?`{|}~' (MAILADDR_ESCAPE). MĂ« pas, vargu i pĂ«rgatitur nĂ« mda_expand_token() pĂ«rdoret gjatĂ« thirrjes sĂ« agjentit tĂ« dĂ«rgesĂ«s (MDA), pĂ«rmes komandĂ«s 'execle("/bin/sh", "/bin/sh", "-c", mda_command,âŠ'. NĂ« rastin e vendosjes sĂ« njĂ« mesazhi nĂ« mbox pĂ«rmes /bin/sh, komandĂ« e ekzekutuar do tĂ« jetĂ« '/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}', ku vlera '%{mbox.from}' pĂ«rmban tĂ« dhĂ«nat e ekranuara nga parametri 'MAIL FROM'.
Kernel i vulnerabilitetit qëndron në faktin se smtp_mailaddr() ka një gabim logjik, i cili bën që kur kalon një domain të zbrazët në email, funksioni kthen një kod të suksesshëm verifikimi, edhe kur pjesa e adresës përpara '@' përmban karaktere të papërshtatshme. Më tej, gjatë përgatitjes së vargut nga funksioni mda_expand_token(), nuk ekzistojnë të gjitha karakteret speciale të mundshme për shell, por vetëm ato speciale të lejueshme në adresën e postës. Kështu, për të ekzekutuar komandën e tij, është e mjaftueshme të përdoren karakteri ';' dhe hapësira në pjesën lokale të emailit, të cilat nuk janë përfshirë në grupin MAILADDR_ESCAPE dhe nuk ekranuar. Për shembull:
$ nc 127.0.0.1 25
HELO professor.falken
MAIL FROM:
RCPT TO:
DATA
.
QUIT
Pas kësaj seance, OpenSMTPD do të ekzekutojë në mbox komandën përmes shell
/usr/libexec/mail.local -f ;sleep 66; root
Kohëzgjatja e mundësive të sulmit është e kufizuar nga fakti që pjesa lokale e adresës nuk mund të kalojë 64 karaktere, dhe karakteret speciale '$' dhe '|' zëvendësohen me ':' gjatë ekranimit. Për të kaluar këtë kufizim, është përdorur fakti se trupi i emailit kalon pas ekzekutimit të /usr/libexec/mail.local përmes rrjedhës hyrëse, dmth. përmes manipulimeve me adresën, është e mundur të ekzekutohet vetëm interpreti i komandave sh dhe të përdoret trupi i emailit si një set instrukcionesh. Duke qenë se në fillim të emailit përmenden titujt shërbyes SMTP, për të anashkaluar ato propozohet përdorimi i thirrjes së komandës read në cikël. Eksploit i funksionueshëm merr formë rreth kësaj:
$ nc 192.168.56.143 25
HELO professor.falken
MAIL FROM:
RCPT TO:
DATA
#0
#1
âŠ
#d
for i in W O P R; do
echo -n '($i) ' && id || break
done > /root/x.`id -u`.$$$
.
QUIT
Burimi: opennet.ru
