Krytyczna luka w Eximie umożliwiająca wykonanie kodu na serwerze z uprawnieniami roota

Na serwerze pocztowym Exim zidentyfikowane krytyczny słaby punkt (CVE-2019-10149), co może prowadzić do zdalnego wykonania kodu na serwerze z uprawnieniami roota podczas przetwarzania specjalnie spreparowanego żądania. Możliwość wykorzystania problemu zauważono w wersjach od 4.87 do 4.91 włącznie lub przy budowaniu z opcją EXPERIMENTAL_EVENT.

W domyślnej konfiguracji atak może zostać przeprowadzony bez zbędnych komplikacji przez użytkownika lokalnego, ponieważ stosowana jest lista ACL „weryfikuj = odbiorca”, która dodatkowo sprawdza adresy zewnętrzne. Zdalny atak może nastąpić w przypadku zmiany ustawień, na przykład pełnienia roli dodatkowego rekordu MX dla innej domeny, usunięcia listy ACL „verify=recipient” lub pewnych zmian w sufiksie_części_lokalnej). Zdalny atak jest również możliwy, jeśli atakujący będzie w stanie utrzymać otwarte połączenie z serwerem przez 7 dni (na przykład wysyłając jeden bajt na minutę w celu ominięcia limitu czasu). Jednocześnie możliwe jest, że istnieją prostsze wektory ataku umożliwiające zdalne wykorzystanie problemu.

Podatność spowodowana jest błędną weryfikacją adresu odbiorcy w funkcji Deliver_message() zdefiniowanej w pliku /src/deliver.c. Manipulując formatowaniem adresu, osoba atakująca może zastąpić swoje dane argumentami polecenia wywoływanego za pośrednictwem funkcji execv() z uprawnieniami roota. Działanie nie wymaga stosowania skomplikowanych technik stosowanych w przypadku przepełnienia bufora lub uszkodzenia pamięci, wystarczy proste podstawienie znaków.

Problem związany jest z użyciem konstrukcji do konwersji adresu:

dostarczanie_localpart = rozwiń_string(
string_sprintf("${local_part:%s}", nowy->adres));
dostawa_domena = rozwiń_ciąg(
string_sprintf("${domena:%s}", nowy->adres));

Funkcjaexpand_string() jest zbyt skomplikowanym sumatorem, obejmującym rozpoznawanie polecenia „${run{argumenty polecenia}”, co prowadzi do uruchomienia zewnętrznego modułu obsługi. Zatem, aby zaatakować w ramach sesji SMTP, użytkownik lokalny musi jedynie wysłać polecenie typu „RCPT TO „nazwa użytkownika+${run{...}}@localhost””, gdzie localhost jest jednym z hostów z listy domen_lokalnych, a nazwa użytkownika to nazwa istniejącego użytkownika lokalnego.

Jeśli serwer działa jako przekaźnik poczty wystarczy zdalnie wysłać komendę 'RCPT TO "${run{...}}@relaydomain.com"', gdzie przekaźnikdomain.com jest jednym z hostów wymienionych w grupie przekaźnik_do_domen sekcję ustawień. Ponieważ Exim nie domyślnie porzuca tryb uprawnień (deliver_drop_privilege = false), polecenia przekazywane przez „${run{...}}” będą wykonywane jako root.

Warto zauważyć, że luka była wyłączony w wydanej w lutym wersji 4.92, nie podkreślając, że poprawka może prowadzić do problemów z bezpieczeństwem. Nie ma powodu sądzić, że twórcy Exima celowo ukryli lukę, ponieważ problem został naprawiony podczas poprawki awaria występująca podczas przesyłania błędnych adresów, a podatność została zidentyfikowana przez Qualys podczas audytu zmian w Eximie.

Poprawka dla poprzednich wersji, które są nadal używane w dystrybucjach, jest obecnie dostępna tylko jako skrawek. Wydania korygujące dla poprzednich gałęzi naprawiające problem zaplanowano na 11 czerwca. Aktualizacje pakietów są gotowe Debian, Ubuntu, openSUSE. Arch Linux и Fedora Podają wersję 4.92, w której problem nie występuje. Problem z RHEL i CentOS nie podatny, ponieważ Exim nie jest zawarty w ich zwykłym repozytorium pakietów.

Źródło: opennet.ru

Dodaj komentarz