Erro pribilegioekin urruneko kodea exekutatzeko aukera ematen duen OpenSMTPD-n ahultasuna

OpenBSD proiektuak garatutako posta zerbitzarian OpenSMTPD identifikatu ahultasun kritikoa (CVE-2020-7247), root erabiltzailearen eskubideekin zerbitzarian shell komandoak urrunetik exekutatzeko aukera ematen duena. Ahultasuna Qualys Security-k egindako berrikusketa batean identifikatu zen (aurreko OpenSMTPD auditoria burutu zen 2015ean, eta ahultasun berria 2018ko maiatzetik dago). Arazoa ezabatuta OpenSMTPD 6.6.2 bertsioan. Erabiltzaile guztiei eguneraketa berehala instalatzea gomendatzen zaie (OpenBSDrako, adabakia syspatch bidez instalatu daiteke).

Bi eraso aukera proposatzen dira. Lehenengo aukerak OpenSMTPD konfigurazio lehenetsian funtzionatzen du (localhost-en eskaerak bakarrik onartzen ditu) eta arazoa lokalean ustiatzeko aukera ematen du, erasotzaileak zerbitzariko sare lokaleko interfazera (loopback) sartzeko gai denean (adibidez, ostalaritza sistemetan) . Bigarren aukera OpenSMTPD kanpoko sareko eskaerak jasotzeko konfiguratuta dagoenean gertatzen da (hirugarrenen posta onartzen duen posta zerbitzaria). Ikertzaileek arrakastaz funtzionatzen duen ustiapen baten prototipoa prestatu dute, bai OpenSMTPD bertsioarekin OpenBSD 6.6-n sartuta, bai beste sistema eragileetarako bertsio eramangarri batekin (Debian Testing-en egindakoa).

Arazoa smtp_mailaddr() funtzioaren errore batek eragiten du, zeina "MAIL FROM" eta "RCPT TO" eremuetako balioen zuzentasuna egiaztatzeko deitzen dena, igorlea/hartzailea definitzen duten eta konexioan zehar pasatzen diren. posta zerbitzariarekin. β€œ@” sinboloaren aurretik dagoen helbide elektronikoaren zatia egiaztatzeko, smtp_mailaddr() funtzioa deitzen da
valid_localpart(), zeinak (MAILADDR_ALLOWED) "!#$%&'*/?^`{|}~+-=_" karaktereak onartzen ditu, RFC 5322-k eskatzen duen moduan.

Kasu honetan, katearen ihes zuzena egiten da mda_expand_token() funtzioan, β€œ!#$%&’*?`{|}~” (MAILADDR_ESCAPE) karaktereak soilik ordezkatzen dituena. Ondoren, mda_expand_token()-en prestatutako lerroa erabiltzen da entrega-agenteari (MDA) deitzean 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...') komandoa erabiliz. . /bin/sh bidez mbox-i letrak jarriz gero, "/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}" lerroa abiarazten da, non "%" balioa. {mbox.from}"-k "MAIL FROM" parametroko ihes datuak biltzen ditu.

Ahultasunaren funtsa smtp_mailaddr()-ek errore logiko bat duela da, eta horren ondorioz, domeinu huts bat posta elektronikora bidaltzen bada, funtzioak egiaztapen-kode arrakastatsua itzultzen du, nahiz eta "@"-ren aurreko helbidearen zatiak karaktere baliogabeak dituen. . Gainera, kate bat prestatzerakoan, mda_expand_token() funtzioak ez du shell-eko karaktere berezi posible guztietatik ihes egiten, helbide elektronikoan onartzen diren karaktere berezietatik soilik. Horrela, zure komandoa exekutatzeko, nahikoa da mezu elektronikoaren tokiko zatian β€œ;” ikurra erabiltzea. eta espazioa, MAILADDR_ESCAPE multzoan sartzen ez direnak eta ihes egiten ez direnak. Adibidez:

$nc 127.0.0.1 25

HELO irakaslea.falken
POSTA:
RCPT TO:
DATUAK
.
QUIT

Saio honen ostean, OpenSMTPD-k, mbox-era entregatuta, komandoa abiaraziko du shell bidez

/usr/libexec/mail.local -f ;lo 66; erroa

Aldi berean, eraso-aukerak mugatuta daude helbidearen tokiko zatiak 64 karaktere baino gehiago ezin dituelako, eta '$' eta '|' karaktere bereziak ":"-rekin ordezkatzen dira ihes egitean. Muga hori saihesteko, gutunaren gorputza /usr/libexec/mail.local exekutatu ondoren sarrerako korrontearen bidez transmititzen dela erabiltzen dugu, hau da. Helbidea manipulatuz, sh komandoen interpretea soilik abiarazi dezakezu eta letraren gorputza argibide multzo gisa erabil dezakezu. Zerbitzuaren SMTP goiburuak letraren hasieran adierazten direnez, irakurtzeko komandoa begizta batean erabiltzea gomendatzen da horiek saltatzeko. Lan-explotazio batek honelako itxura du:

$nc 192.168.56.143 25

HELO irakaslea.falken
MAIL FROM:
RCPT TO:<[posta elektroniko bidez babestua]>
DATUAK
#0
#1
...
#d
i-rentzat W O P R-n; egin
oihartzuna -n "($i) " && id || hautsi
done > /root/x."`id -u`.""$$"
.
QUIT

Iturria: opennet.ru

Gehitu iruzkin berria