Vundebleco en OpenSMTPD kiu permesas foran kodekzekuton kun radikaj privilegioj

En la poŝtservilo disvolvita de la projekto OpenBSD OpenSMTPD identigita kritika vundebleco (CVE-2020-7247), kiu ebligas al vi malproksime ekzekuti ŝelkomandojn sur la servilo kun radikaj uzantrajtoj. La vundebleco estis identigita dum rekontrolo farita de Qualys Security (antaŭa OpenSMTPD-revizio estis efektivigita en 2015, kaj la nova vundebleco ĉeestas ekde majo 2018). Problemo eliminita en OpenSMTPD 6.6.2 eldono. Ĉiuj uzantoj rekomendas tuj instali la ĝisdatigon (por OpenBSD, la flikaĵo povas esti instalita per syspatch).

Du atakopcioj estas proponitaj. La unua opcio funkcias en la defaŭlta agordo OpenSMTPD (akceptante petojn nur de localhost) kaj permesas vin ekspluati la problemon loke, kiam la atakanto povas aliri la lokan retan interfacon (loopback) sur la servilo (ekzemple, sur gastigaj sistemoj) . La dua opcio okazas kiam OpenSMTPD estas agordita por ricevi eksterajn retajn petojn (poŝtservilo kiu akceptas triajn poŝtojn). Esploristoj preparis prototipon de ekspluato, kiu funkcias sukcese kaj kun la OpenSMTPD-versio inkluzivita en OpenBSD 6.6 kaj kun portebla versio por aliaj operaciumoj (farita en Debian Testing).

La problemo estas kaŭzita de eraro en la funkcio smtp_mailaddr(), kiu estas vokita por kontroli la ĝustecon de la valoroj en la kampoj "MAIL FROM" kaj "RCPT TO", kiuj difinas la sendinton/ricevanton kaj estas transdonitaj dum la konekto. kun la poŝtservilo. Por kontroli la parton de la retadreso kiu venas antaŭ la simbolo “@”, la funkcio smtp_mailaddr() estas nomita
valid_localpart(), kiu akceptas (MAILADDR_ALLOWED) la signojn "!#$%&'*/?^`{|}~+-=_", kiel postulas RFC 5322.

En ĉi tiu kazo, rekta eskapo de la ĉeno estas farita en la funkcio mda_expand_token(), kiu anstataŭigas nur la signojn “!#$%&’*?`{|}~” (MAILADDR_ESCAPE). Poste, la linio preparita en mda_expand_token() estas uzata kiam oni vokas la liveran agenton (MDA) uzante la komandon 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' En kazo de meti leterojn al mbox per /bin/sh, la linio “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” estas lanĉita, kie la valoro “% {mbox.from}” inkluzivas eskapitajn datumojn de la parametro "MAIL FROM".

La esenco de la vundebleco estas, ke smtp_mailaddr() havas logikan eraron, pro kiu, se malplena domajno estas sendita al retpoŝto, la funkcio resendas sukcesan konfirmkodon, eĉ se la parto de la adreso antaŭ "@" enhavas nevalidajn signojn. . Plue, kiam oni preparas ĉenon, la funkcio mda_expand_token() ne eskapas ĉiujn eblajn ŝelajn specialajn signojn, sed nur specialajn signojn permesitajn en la retadreso. Tiel, por ruli vian komandon, sufiĉas uzi la simbolon ";" en la loka parto de la retpoŝto. kaj spaco, kiuj ne estas inkluzivitaj en la aro MAILADDR_ESCAPE kaj ne estas eskapataj. Ekzemple:

$nc 127.0.0.1 25

HELO profesoro.falken
POŜTO DE:
RCPT TO:
DATUMOJ
.
QUIT

Post ĉi tiu sesio, OpenSMTPD, kiam liverita al mbox, lanĉos la komandon tra la ŝelo

/usr/libexec/mail.local -f ;dormo 66; radiko

Samtempe, la atakebloj estas limigitaj pro tio, ke la loka parto de la adreso ne povas superi 64 signojn, kaj la specialaj signoj ‘$’ kaj ‘|’ estas anstataŭigitaj per “:” dum eskapo. Por preteriri ĉi tiun limigon, ni uzas la fakton, ke la korpo de la letero estas transdonita post rulado /usr/libexec/mail.local tra la eniga fluo, t.e. Manipulante la adreson, vi povas nur lanĉi la sh komandan interpretilon kaj uzi la korpon de la letero kiel aron de instrukcioj. Ĉar servo SMTP-kapoj estas indikitaj komence de la letero, estas sugestite uzi la legan komandon en buklo por preterlasi ilin. Laboranta ekspluato aspektas kiel ĉi tio:

$nc 192.168.56.143 25

HELO profesoro.falken
MAIL DE:
RCPT AL:<[retpoŝte protektita]>
DATUMOJ
#0
#1
...
#d
por i en W O P R; faru
echo -n "($i) " && id || rompi
farita > /root/x."`id -u`.""$$"
.
QUIT

fonto: opennet.ru

Aldoni komenton