Na serwerze pocztowym Exim krytyczny (), 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 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 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 . Wydania korygujące dla poprzednich gałęzi naprawiające problem zaplanowano na 11 czerwca. Aktualizacje pakietów są gotowe , , . и Dostarczają wersję 4.92, w której problem nie występuje. RHEL i CentOS problem , ponieważ Exim nie jest zawarty w ich zwykłym repozytorium pakietów.
Źródło: opennet.ru
