Chyba zabezpečení v OpenSMTPD, která umožňuje vzdálené spuštění kódu s oprávněními root

V poštovním serveru vyvinutém projektem OpenBSD OpenSMTPD identifikované kritická zranitelnost (CVE-2020-7247), který vám umožňuje vzdáleně spouštět příkazy shellu na serveru s uživatelskými právy root. Chyba byla identifikována během opětovného auditu provedeného společností Qualys Security (předchozí audit OpenSMTPD se konal v roce 2015 a nová chyba zabezpečení existuje od května 2018). Problém vyloučeno ve verzi OpenSMTPD 6.6.2. Všem uživatelům se doporučuje, aby si aktualizaci ihned nainstalovali (pro OpenBSD lze opravu nainstalovat přes syspatch).

Jsou navrženy dvě možnosti útoku. První možnost funguje ve výchozí konfiguraci OpenSMTPD (přijímá požadavky pouze z localhost) a umožňuje zneužít problém lokálně, když je útočník schopen přistupovat k místnímu síťovému rozhraní (loopback) na serveru (například na hostingových systémech) . Druhá možnost nastane, když je OpenSMTPD nakonfigurován pro příjem externích síťových požadavků (poštovní server, který přijímá poštu třetích stran). Výzkumníci připravili prototyp exploitu, který úspěšně funguje jak s verzí OpenSMTPD obsaženou v OpenBSD 6.6, tak s přenosnou verzí pro jiné operační systémy (prováděné v Debian Testing).

Problém je způsoben chybou funkce smtp_mailaddr(), která je volána pro kontrolu správnosti hodnot v polích „MAIL FROM“ a „RCPT TO“, které definují odesílatele/příjemce a jsou předávány během připojení. s poštovním serverem. Chcete-li zkontrolovat část e-mailové adresy, která je před symbolem „@“, zavolá se funkce smtp_mailaddr()
valid_localpart(), která přijímá (MAILADDR_ALLOWED) znaky "!#$%&'*/?^`{|}~+-=_", jak vyžaduje RFC 5322.

V tomto případě se přímé escapování řetězce provádí ve funkci mda_expand_token(), která nahrazuje pouze znaky „!#$%&’*?`{|}~“ (MAILADDR_ESCAPE). Následně je řádek připravený v mda_expand_token() použit při volání doručovacího agenta (MDA) pomocí příkazu 'execle("/bin/sh", "/bin/sh", "-c", mda_command,...' V případě umístění dopisů do mboxu přes /bin/sh se spustí řádek „/usr/libexec/mail.local -f %%{mbox.from} %%{user.username}“, kde je hodnota „% {mbox.from}” obsahuje uniklá data z parametru „MAIL FROM“.

Podstatou zranitelnosti je, že smtp_mailaddr() má logickou chybu, kvůli které v případě odeslání prázdné domény na email funkce vrátí úspěšný ověřovací kód, i když část adresy před „@“ obsahuje neplatné znaky. . Dále, při přípravě řetězce funkce mda_expand_token() neunikne všem možným speciálním znakům shellu, ale pouze speciálním znakům povoleným v e-mailové adrese. Ke spuštění příkazu tedy stačí použít symbol „;“ v místní části e-mailu. a mezery, které nejsou zahrnuty v sadě MAILADDR_ESCAPE a nejsou uvozeny. Například:

$nc 127.0.0.1 25

HELO profesor.falken
POŠTA OD:
RCPT TO:
ÚDAJE
.
KONEC

Po této relaci OpenSMTPD po doručení do mbox spustí příkaz přes shell

/usr/libexec/mail.local -f ;sleep 66; vykořenit

Možnosti útoku jsou zároveň omezeny tím, že místní část adresy nesmí přesáhnout 64 znaků a speciální znaky ‚$‘ a ‚|‘ jsou při escapování nahrazeny „:“. Abychom toto omezení obešli, využíváme toho, že tělo dopisu se po spuštění /usr/libexec/mail.local přenese přes vstupní proud, tzn. Manipulací s adresou můžete pouze spustit interpret příkazů sh a použít tělo dopisu jako sadu instrukcí. Vzhledem k tomu, že hlavičky SMTP služby jsou uvedeny na začátku písmene, doporučuje se použít k jejich přeskočení příkaz read ve smyčce. Pracovní exploit vypadá asi takto:

$nc 192.168.56.143 25

HELO profesor.falken
MAIL FROM:
RCPT TO:<[chráněno e-mailem]>
ÚDAJE
#0
#1
...
#d
pro i ve W O PR; dělat
echo -n "($i) " && id || přestávka
hotovo > /root/x."`id -u`.""$$"
.
KONEC

Zdroj: opennet.ru

Přidat komentář