Na serwerze pocztowym Exim krytyczny (), co może prowadzić do zdalnego wykonania kodu na serwerze z uprawnieniami root podczas przetwarzania specjalnie uformowanego żądania. Możliwość wykorzystania problemu zaobserwowano w wersjach od 4.87 do 4.91 włącznie lub w przypadku kompilacji z opcją EXPERIMENTAL_EVENT.
W konfiguracji domyślnej atak może być przeprowadzony bez większych komplikacji przez lokalnego użytkownika, ponieważ stosowana jest lista kontrolna „verify = recipient”, wykonująca dodatkowe kontrole dla zewnętrznych adresów. Wykonanie zdalnego ataku jest możliwe przy zmianie ustawień, na przykład w roli wtórnego MX dla innej domeny, usunięciu listy kontrolnej „verify = recipient” lub przy pewnych zmianach w local_part_suffix). Zdalny atak jest również możliwy, jeśli napastnik zdoła utrzymać połączenie z serwerem otwarte przez 7 dni (na przykład wysyłając po jednym bajcie na minutę, aby obejść zakończenie po czasie). Należy zauważyć, że dla zdalnego wykorzystania problemu mogą istnieć także prostsze wektory ataku.
Vulnerabilność jest spowodowana nieprawidłowym sprawdzaniem adresu odbiorcy w funkcji deliver_message(), zdefiniowanej w pliku /src/deliver.c. Przez manipulację formatowaniem adresu, atakujący może osiągnąć podstawienie swoich danych w argumentach komendy wywoływanej przez funkcję execv() z uprawnieniami root. Wykorzystanie nie wymaga stosowania skomplikowanych technik, stosowanych w przypadku przepełnień bufora lub uszkodzeń pamięci, wystarczy proste podstawienie znaków.
Problem związany jest z użyciem konstrukcji do przekształcania adresów:
deliver_localpart = expand_string(
string_sprintf(«${local_part:%s}», new->address));
deliver_domain = expand_string(
string_sprintf(«${domain:%s}», new->address));
Funkcja expand_string() jest złożonym kombajnem, w tym rozpoznającym komendę «${run{komenda argumenty}», prowadzącą do uruchomienia zewnętrznego przetwarzacza. W ten sposób, aby zaatakować w ramach sesji SMTP, lokalny użytkownik musi tylko przesłać komendę w postaci 'RCPT TO «username+${run{…}}@localhost»', gdzie localhost jest jednym z hostów w liście local_domains, a username to nazwa istniejącego lokalnego użytkownika.
Jeśli serwer działa jako przekaźnik pocztowy, wystarczy zdalnie wysłać polecenie ‘RCPT TO «${run{…}}@relaydomain.com»‘, gdzie relaydomain.com to jeden z hostów wymienionych w sekcji ustawień relay_to_domains. Ponieważ domyślnie w exim nie stosuje się trybu zrzutu uprawnień (deliver_drop_privilege = false), polecenia przekazywane przez «${run{…}}» będą wykonywane z uprawnieniami roota.
Warto zauważyć, że luka została w wydaniu 4.92 z lutego, bez zwracania uwagi na to, że poprawka może prowadzić do problemów z bezpieczeństwem. Nie ma podstaw, aby sądzić, że doszło do świadomego zatuszowania luki przez twórców Exim, ponieważ problem został rozwiązany w trakcie awarii, która występuje podczas przesyłania niepoprawnych adresów, a luka została wykryta przez firmę Qualys podczas audytu zmian w Exim.
Poprawka dla wcześniejszych wersji, które nadal są stosowane w dystrybucjach, jest obecnie dostępna tylko w postaci . Poprawki dla wcześniejszych gałęzi z rozwiązaniem problemu są zaplanowane na 11 czerwca. Zaktualizowane pakiety są przygotowane dla , , . i dostarczają wersję 4.92, w której problem nie występuje. RHEL i CentOS są , ponieważ Exim nie znajduje się w ich standardowym repozytorium pakietów.
Źródło: opennet.ru
