Kwetsberens yn OpenSMTPD dy't útfiering fan koade op ôfstân mooglik makket mei root-privileges

Yn 'e e-posttsjinner ûntwikkele troch it OpenBSD-projekt Iepen SMTPD identifisearre kritysk kwetsberens (CVE-2020-7247), wêrtroch jo shell-kommando's op ôfstân kinne útfiere op 'e tsjinner mei root-brûkersrjochten. De kwetsberens waard identifisearre tidens in re-audit útfierd troch Qualys Security (foarige OpenSMTPD-kontrôle waard útfierd yn 2015, en de nije kwetsberens is sûnt maaie 2018 oanwêzich). Probleem eliminearre yn OpenSMTPD 6.6.2 release. Alle brûkers wurde oanrikkemandearre om de fernijing fuortendaliks te ynstallearjen (foar OpenBSD kin de patch ynstalleare wurde fia syspatch).

Twa oanfal opsjes wurde foarsteld. De earste opsje wurket yn 'e standert OpenSMTPD-konfiguraasje (allinich oanfragen akseptearje fan localhost) en kinne jo it probleem lokaal eksploitearje, as de oanfaller tagong hat ta de lokale netwurkynterface (loopback) op' e tsjinner (bygelyks op hostingsystemen) . De twadde opsje komt foar as OpenSMTPD is ynsteld om eksterne netwurkoanfragen te ûntfangen (in e-posttsjinner dy't e-post fan tredden akseptearret). Undersikers hawwe in prototype taret fan in eksploitaasje dy't suksesfol wurket sawol mei de OpenSMTPD-ferzje opnommen yn OpenBSD 6.6 en mei in draachbere ferzje foar oare bestjoeringssystemen (fierd yn Debian Testing).

It probleem wurdt feroarsake troch in flater yn 'e smtp_mailaddr() funksje, dy't neamd wurdt om de krektens fan' e wearden te kontrolearjen yn 'e "MAIL FROM" en "RCPT TO" fjilden dy't de stjoerder/ûntfanger definiearje en wurde trochjûn tidens de ferbining mei de mailtsjinner. Om it diel fan it e-mailadres te kontrolearjen dat foar it "@"-symboal komt, wurdt de funksje smtp_mailaddr() neamd
valid_localpart(), dy't akseptearret (MAILADDR_ALLOWED) de tekens "!#$%&'*/?^`{|}~+-=_", lykas fereaske troch RFC 5322.

Yn dit gefal wurdt direkte ûntsnapping fan 'e tekenrige útfierd yn' e funksje mda_expand_token (), dy't allinich de tekens "!#$%&'*?`{|}~" (MAILADDR_ESCAPE) ferfangt. Ferfolgens wurdt de line taret yn mda_expand_token() brûkt by it oproppen fan de leveringsagent (MDA) mei it kommando 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' Yn gefal fan it pleatsen fan letters nei mbox fia /bin/sh, wurdt de rigel "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}" lansearre, wêrby't de wearde "% {mbox.from}” befettet ûntsnapte gegevens fan de parameter "MAIL FROM".

De essinsje fan 'e kwetsberens is dat smtp_mailaddr() in logyske flater hat, wêrtroch't, as in leech domein nei e-post stjoerd wurdt, de funksje in suksesfolle ferifikaasjekoade weromjout, sels as it diel fan it adres foar "@" ûnjildige tekens befettet . Fierder, by it tarieden fan in tekenrige, ûntkomt de funksje mda_expand_token() net alle mooglike shell-spesjale tekens, mar allinich spesjale tekens dy't tastien binne yn it e-mailadres. Sa, om jo kommando út te fieren, is it genôch om it symboal ";" te brûken yn it lokale diel fan 'e e-post. en romte, dy't net opnommen binne yn 'e MAILADDR_ESCAPE-set en binne net ûntkommen. Bygelyks:

$nc 127.0.0.1 25

HELO professor.falken
MAIL FAN:<;sleep 66;>
RCPT TO:
DATA
.
OERJAAN

Nei dizze sesje sil OpenSMTPD, as levere oan mbox, it kommando starte fia de shell

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

Tagelyk wurde de oanfalsmooglikheden beheind troch it feit dat it lokale diel fan it adres net mear wêze kin as 64 tekens, en de spesjale tekens '$' en '|' wurde ferfongen troch ":" by ûntsnapping. Om dizze beheining te omgean, brûke wy it feit dat it lichem fan 'e brief wurdt ferstjoerd nei it útfieren fan /usr/libexec/mail.local troch de ynfierstream, d.w.s. Troch it adres te manipulearjen kinne jo allinich de sh kommando-tolk starte en it lichem fan 'e brief brûke as in set ynstruksjes. Sûnt tsjinst SMTP-koppen wurde oanjûn oan it begjin fan 'e brief, wurdt suggerearre om it lêzen kommando te brûken yn in lus om se oer te slaan. In wurkjende eksploitaasje sjocht der sa út:

$nc 192.168.56.143 25

HELO professor.falken
MAIL FROM:<;for i in 0 1 2 3 4 5 6 7 8 9 abcd;do read r;done;sh;exit 0;>
RCPT TO:[e-post beskerme]>
DATA
#0
#1
...
#d
foar i yn WOPR; dwaan
echo -n "($i) " && id || brekke
dien > /root/x."`id -u`.""$$"
.
OERJAAN

Boarne: opennet.ru

Add a comment