A fejlődő OpenBSD levelezőszerveren identified (CVE-2020-7247), amely lehetővé teszi shell-parancsok távoli végrehajtását a szerveren root felhasználói jogokkal. A sérülékenységet egy újraaudit során fedezte fel a Qualys Security (az OpenSMTPD korábbi auditja és az új sérülékenység 2018 májusa óta áll fenn). A probléma az OpenSMTPD 6.6.2 kiadásban található. Minden felhasználónak sürgősen ajánlott frissíteni (OpenBSD esetén a javítást a syspatch segítségével lehet telepíteni).
Két támadási lehetőség került javaslatra. Az első lehetőség a nyilvános OpenSMTPD konfigurációval működik (csak localhostról érkező kérések fogadása), és lehetőséget ad a probléma helyi kihasználására, amikor a támadó hozzáfér a szerver helyi hálózati interfészéhez (loopback) (például a hoszting rendszereken). A második lehetőség az OpenSMTPD külső hálózati kérések fogadására történő beállítása esetén nyilvánul meg (levelezőszerver, amely külső e-maileket fogad). A kutatók készítettek egy prototípus exploitot, amely sikeresen működik az OpenBSD 6.6 részeként lévő OpenSMTPD verzióval, valamint egy hordozható verzióval más operációs rendszerekhez (tesztelve Debian Testing alatt).
A probléma az smtp_mailaddr() függvény hibájából következik, amelyet a «MAIL FROM» és «RCPT TO» mezők érvényességének ellenőrzésére hívnak, meghatározva a küldőt/receiver-t és azokat az adatokat, amelyeket a levelezőszerverrel történő kapcsolat során továbbítanak. Az e-mail címnek azok a részei, amelyek az «@» jel előtt állnak, az smtp_mailaddr() függvényben a valid_localpart() függvény hívásakor kerülnek ellenőrzésre.
A valid_localpart() függvény az «!#$%&’*?/^`{|}~+-=_» karaktereket tartja elfogadottnak (MAILADDR_ALLOWED), az RFC 5322 követelményei szerint.
Ekkor a szöveg közvetlen végrehajtását az mda_expand_token() függvény végzi, amely csak az «!#$%&’*?`{|}~» karaktereket cseréli (MAILADDR_ESCAPE). Ezt követően, az mda_expand_token() által előkészített szöveg a kézbesítő ügynök (MDA) hívásakor kerül felhasználásra az ‘execle(«/bin/sh», «/bin/sh», «-c», mda_command,…’ parancs segítségével. Amikor az e-mailt az mbox-ba mentik a /bin/sh-en keresztül, a «/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}» parancs fut le, ahol az «%{mbox.from}» értéke tartalmazza a «MAIL FROM» paraméterből származó kódolt adatokat.
A sebezhetőség lényege, hogy az smtp_mailaddr() logikai hibát tartalmaz, amely miatt, ha üres domaint adunk meg az e-mailben, a funkció sikeres ellenőrzési kódot ad vissza, még akkor is, ha az „@” előtti címrésze érvénytelen karaktereket tartalmaz. Ezt követően a mda_expand_token() függvény által készített string esetében nem minden lehetséges speciális karaktert menekítenek el a shell számára, csupán azokat, amelyek megengedettek az e-mail címben. Így az e-mail helyi részében a „;” és a szóköz karakterek használatával elég csupán azokat a karaktereket használni, amelyek nem képezik a MAILADDR_ESCAPE halmaz részeit és nem mentek el. Például:
$ nc 127.0.0.1 25
HELO professor.falken
MAIL FROM:<;sleep 66;>
RCPT TO:<root>
DATA
.
QUIT
Ezen session után az OpenSMTPD az mbox-ba történő kézbesítéskor shell parancsot fog futtatni
/usr/libexec/mail.local -f ;sleep 66; root
Ebben az esetben a támadási lehetőségek korlátozottak, mivel a cím helyi része nem haladhatja meg a 64 karaktert, és a speciális karakterek, mint az ‘$’ és a ‘|’, átkonvertálódnak „:”-ra a menekítés során. E korlátozás megkerülésére felhasználható az a tény, hogy az e-mail törzse a /usr/libexec/mail.local indítása után a bemeneti folyamán kerül átadásra, így a cím manipulálásával csak a sh parancsértelmezőt lehet elindítani, és az e-mail törzsét utasítások halmazaként lehet felhasználni. Mivel a levél elején a szolgáltatási SMTP-fejlécek találhatók, javasolt a read parancs ciklikus hívása a kihagyásuk érdekében. A működő exploit körülbelül így néz ki:
$ 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
Forrás: opennet.ru
