Bregusrwydd yn OpenSMTPD sy'n caniatáu gweithredu cod o bell gyda breintiau gwraidd

Yn y gweinydd post a ddatblygwyd gan y prosiect OpenBSD AgoredSMTPD a nodwyd bregusrwydd critigol (CVE-2020-7247), sy'n eich galluogi i weithredu gorchmynion cregyn o bell ar y gweinydd gyda hawliau defnyddiwr gwraidd. Nodwyd y bregusrwydd yn ystod ail-archwiliad a gynhaliwyd gan Qualys Security (archwiliad OpenSMTPD blaenorol ei gynnal yn 2015, ac mae'r bregusrwydd newydd wedi bod yn bresennol ers mis Mai 2018). Problem dileu mewn datganiad OpenSMTPD 6.6.2. Argymhellir bod pob defnyddiwr yn gosod y diweddariad ar unwaith (ar gyfer OpenBSD, gellir gosod y clwt trwy syspatch).

Cynigir dau opsiwn ymosodiad. Mae'r opsiwn cyntaf yn gweithio yn y ffurfweddiad OpenSMTPD rhagosodedig (derbyn ceisiadau gan localhost yn unig) ac yn caniatáu ichi ecsbloetio'r broblem yn lleol, pan fydd yr ymosodwr yn gallu cyrchu'r rhyngwyneb rhwydwaith lleol (loopback) ar y gweinydd (er enghraifft, ar systemau cynnal) . Mae'r ail opsiwn yn digwydd pan fydd OpenSMTPD wedi'i ffurfweddu i dderbyn ceisiadau rhwydwaith allanol (gweinydd post sy'n derbyn post trydydd parti). Mae ymchwilwyr wedi paratoi prototeip o gamfanteisio sy'n gweithio'n llwyddiannus gyda'r fersiwn OpenSMTPD sydd wedi'i chynnwys yn OpenBSD 6.6 a gyda fersiwn gludadwy ar gyfer systemau gweithredu eraill (a gynhaliwyd yn Debian Testing).

Achosir y broblem gan wall yn y swyddogaeth smtp_mailaddr(), a elwir i wirio cywirdeb y gwerthoedd yn y meysydd “POST Oddi” a “RCPT TO” sy'n diffinio'r anfonwr/derbynnydd ac sy'n cael eu pasio yn ystod y cysylltiad gyda'r gweinydd post. I wirio'r rhan o'r cyfeiriad e-bost sy'n dod cyn y symbol “@”, gelwir y swyddogaeth smtp_mailaddr()
valid_localpart(), sy'n derbyn (MAILADDR_ALLOWED) y nodau "!#$%&'*/?^`{|}~+-=_", fel sy'n ofynnol gan RFC 5322.

Yn yr achos hwn, mae dianc uniongyrchol o'r llinyn yn cael ei berfformio yn y swyddogaeth mda_expand_token(), sy'n disodli'r nodau “!#$%&'* yn unig?`{|}~” (MAILADDR_ESCAPE). Yn dilyn hynny, defnyddir y llinell a baratowyd yn mda_expand_token () wrth alw'r asiant dosbarthu (MDA) gan ddefnyddio'r gorchymyn 'execle ("/ bin/sh", "/ bin/sh", "-c", mda_command,...' . Mewn achos o osod llythyrau i mbox trwy /bin/sh, mae'r llinell “/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}” yn cael ei lansio, lle mae'r gwerth “% Mae {mbox.from}" yn cynnwys data sydd wedi'i ddianc o'r paramedr "MAIL FROM".

Hanfod y bregusrwydd yw bod gan smtp_mailaddr() wall rhesymegol, ac oherwydd hynny, os anfonir parth gwag i e-bost, mae'r swyddogaeth yn dychwelyd cod dilysu llwyddiannus, hyd yn oed os yw'r rhan o'r cyfeiriad cyn “@” yn cynnwys nodau annilys . Ymhellach, wrth baratoi llinyn, nid yw'r swyddogaeth mda_expand_token() yn dianc rhag pob nod arbennig cragen posib, ond dim ond nodau arbennig a ganiateir yn y cyfeiriad e-bost. Felly, i redeg eich gorchymyn, mae'n ddigon defnyddio'r symbol “;” yn rhan leol yr e-bost. a gofod, nad ydynt wedi'u cynnwys yn y set MAILADDR_ESCAPE ac nad ydynt yn dianc. Er enghraifft:

$nc 127.0.0.1 25

HELO athro.falken
POST GAN:
RCPT AT:
DATA
.
QUIT

Ar ôl y sesiwn hon, bydd OpenSMTPD, pan gaiff ei gyflwyno i mbox, yn lansio'r gorchymyn trwy'r gragen

/usr/libexec/mail.local -f; cysgu 66; gwraidd

Ar yr un pryd, mae'r posibiliadau ymosod wedi'u cyfyngu gan y ffaith na all rhan leol y cyfeiriad fod yn fwy na 64 nod, ac mae'r nodau arbennig '$' a '|' yn cael eu disodli gan ":" wrth ddianc. Er mwyn osgoi'r cyfyngiad hwn, rydym yn defnyddio'r ffaith bod corff y llythyr yn cael ei drosglwyddo ar ôl rhedeg /usr/libexec/mail.local drwy'r ffrwd mewnbwn, h.y. Trwy drin y cyfeiriad, dim ond y dehonglydd gorchymyn sh y gallwch chi ei lansio a defnyddio corff y llythyren fel set o gyfarwyddiadau. Gan fod penawdau SMTP gwasanaeth wedi'u nodi ar ddechrau'r llythyr, awgrymir defnyddio'r gorchymyn darllen mewn dolen i'w hepgor. Mae camfanteisio gweithredol yn edrych fel hyn:

$nc 192.168.56.143 25

HELO athro.falken
POST GAN:
RCPT I:<[e-bost wedi'i warchod]>
DATA
#0
#1
...
#d
canys i yn W O P R; gwneud
adlais -n "($i)" && id || torri
gwneud > / root/x." `id -u`." "$$"
.
QUIT

Ffynhonnell: opennet.ru

Ychwanegu sylw