Kritická chyba zabezpečení v Eximu, která umožňuje spouštění kódu na serveru s oprávněními root

Na poštovním serveru Exim identifikované kritický zranitelnost (CVE-2019-10149), což může vést ke vzdálenému spuštění kódu na serveru s právy root při zpracování speciálně vytvořeného požadavku. Možnost zneužití problému byla zaznamenána ve verzích od 4.87 do 4.91 včetně nebo při sestavování s možností EXPERIMENTAL_EVENT.

Ve výchozí konfiguraci může útok provést bez zbytečných komplikací lokální uživatel, protože je aplikován ACL "verify = recipient", který provádí dodatečné kontroly externích adres. Vzdálený útok může nastat, když se změní nastavení, například funguje jako sekundární MX pro jinou doménu, odebere se ACL "verify=recipient" nebo se změní přípona local_part_suffix). Vzdálený útok je také možný, pokud je útočník schopen udržet připojení k serveru otevřené po dobu 7 dnů (například odesláním jednoho bajtu za minutu, aby se obešel časový limit). Zároveň je možné, že existují jednodušší útočné vektory pro vzdálené zneužití problému.

Chyba zabezpečení je způsobena nesprávným ověřením adresy příjemce ve funkci delivery_message() definované v souboru /src/deliver.c. Manipulací s formátováním adresy může útočník dosáhnout nahrazení svých dat argumenty příkazu volaného pomocí funkce execv() s právy root. Provoz nevyžaduje použití složitých technik používaných pro přetečení vyrovnávací paměti nebo poškození paměti, stačí jednoduchá substituce znaků.

Problém souvisí s použitím konstruktu pro převod adresy:

delivery_localpart = expand_string(
string_sprintf("${místní_část:%s}", nová->adresa));
delivery_domain = expand_string(
string_sprintf("${doména:%s}", nová->adresa));

Funkce expand_string() je příliš komplikovaný slučovač, včetně rozpoznání příkazu „${run{příkazové argumenty}“, což vede ke spuštění externího handleru. K útoku v rámci relace SMTP tedy místní uživatel potřebuje pouze odeslat příkaz jako 'RCPT TO “username+${run{...}}@localhost”', kde localhost je jeden z hostitelů ze seznamu local_domains, a uživatelské jméno je jméno existujícího místního uživatele.

Pokud server funguje jako přenos pošty, stačí vzdáleně odeslat příkaz 'RCPT TO "${run{...}}@relaydomain.com"', kde relaydomain.com je jeden z hostitelů uvedených v relay_to_domains sekce nastavení. Vzhledem k tomu, že Exim standardně nepouští režim oprávnění (deliver_drop_privilege = false), příkazy předané přes "${run{...}}" budou provedeny jako root.

Je pozoruhodné, že zranitelnost byla vyloučeno ve verzi 4.92 vydané v únoru, aniž by bylo zdůrazněno, že oprava může vést k bezpečnostním problémům. Není důvod se domnívat, že vývojáři Eximu tuto zranitelnost záměrně zatajili, protože problém byl vyřešen během opravy selhání, ke kterému dochází při přenosu nesprávných adres, a zranitelnost byla identifikována společností Qualys během auditu změn v Exim.

Oprava pro předchozí verze, které se nadále používají v distribucích, je aktuálně dostupná pouze jako náplast. Opravná vydání pro předchozí větve k vyřešení problému jsou naplánována na 11. června. Aktualizace balíčků jsou připraveny Debian, ubuntu, openSUSE. Arch Linux и Fedora Dodávají verzi 4.92, ve které se problém neobjevuje. Problém RHEL a CentOS není náchylný, protože Exim není součástí jejich běžného úložiště balíčků.

Zdroj: opennet.ru

Přidat komentář