Zraniteľnosť v OpenSMTPD, ktorá umožňuje vzdialené vykonanie kódu s právami root

V rozvíjanom projekte OpenBSD poštovom serveri OpenSMTPD bola zistená kritická zraniteľnosť (CVE-2020-7247), ktorá umožňuje vzdialene vykonávať shell príkazy na serveri s právami používateľa root. Zraniteľnosť bola zistená počas opätovného auditu, ktorý vykonala spoločnosť Qualys Security (predchádzajúci audit OpenSMTPD sa uskutočnil v roku 2015, a nová zraniteľnosť je prítomná od mája 2018). Problém bola odstránená v vydaní OpenSMTPD 6.6.2. Všetkým používateľom sa odporúča naliehavo nainštalovať aktualizáciu (pre OpenBSD je oprava k dispozícii cez syspatch).

Boli navrhnuté dve varianty útoku. Prvý variant funguje v predvolenej konfigurácii OpenSMTPD (prijímanie požiadaviek iba z localhostu) a umožňuje lokálne zneužitie problému, keď má útočník možnosť pristupovať k lokálnemu sieťovému rozhraniu (loopback) na serveri (napríklad na hostingových systémoch). Druhý variant sa prejaví v prípade, že je OpenSMTPD nastavený na prijímanie vonkajších sieťových požiadaviek (poštový server prijímajúci externú poštu). Výskumníci pripravili prototyp exploit, ktorý úspešne funguje ako s variantom OpenSMTPD zo súčasťou OpenBSD 6.6, tak aj s prenosnou verziou pre iné operačné systémy (vykonané v Debian Testing).

Problém je spôsobený chybou vo funkcii smtp_mailaddr(), ktorá sa volá na overenie správnosti hodnôt v poliach „MAIL FROM“ a „RCPT TO“, určujúcich odosielateľa/prijímateľa a prenášaných počas pripojenia k poštovému serveru. Na overenie časti poštovej adresy, ktorá predchádza znaku „@“, sa v smtp_mailaddr() volá funkcia
valid_localpart(), ktorá považuje za platné (MAILADDR_ALLOWED) znaky „!#$%&’*\/¿?^`{|}~+-=_“, v súlade s požiadavkami RFC 5322.

Pri tom samotné escaping reťazca sa vykonáva vo funkcii mda_expand_token(), ktorá nahrádza iba znaky „!#$%&’*?`{|}~“ (MAILADDR_ESCAPE). Následne sa reťazec pripravený v mda_expand_token() používa pri volaní agenta dodania (MDA) prostredníctvom príkazu 'execle(„/bin/sh“, „/bin/sh“, „-c“, mda_command,…'. V prípade umiestnenia správy do mbox cez /bin/sh sa spúšťa reťazec „/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}“, kde hodnota „%{mbox.from}“ obsahuje escaped údaje z parametra „MAIL FROM“.

Podstata zraniteľnosti spočíva v tom, že smtp_mailaddr() má logickú chybu, kvôli ktorej v prípade odoslania prázdnej domény v e-maile funkcia vráti úspešný kód kontroly, aj keď časť adresy pred „@“ obsahuje neplatné znaky. Následne pri príprave reťazca funkciou mda_expand_token() nie sú všetky možné špeciálne znaky shellu escapované, ale iba špeciálne znaky povolené v e-mailovej adrese. Týmto spôsobom na spustenie svojej príkazovej sekvencie stačí použiť v lokálnej časti e-mailu znak „;“ a medzeru, ktoré nepatria do súboru MAILADDR_ESCAPE a nie sú escapované. Napríklad:

$ nc 127.0.0.1 25

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

Po tomto sedení OpenSMTPD pri dodávaní do mbox spustí cez shell príkaz

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

Pri tom sú možnosti útoku obmedzené na to, že lokálna časť adresy nemôže presiahnuť 64 znakov, a špeciálne znaky ‘$’ a ‘|’ sú pri escapovaní nahradené znakom „:“. Na obídenie tohto obmedzenia sa využíva fakt, že telo správy sa prenáša po spustení /usr/libexec/mail.local cez vstupný tok, t.j. manipuláciou s adresou sa môže spustiť len príkazový interpret sh a využiť telo správy ako súbor inštrukcií. Keďže na začiatku správy sú uvedené služby SMTP-záhlavia, navrhuje sa použiť volanie príkazu read v cykle na ich preskočenie. Funkčný exploit vyzerá zhruba takto:

$ 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

Zdroj: opennet.ru

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster