Zdalnie możliwa do wykorzystania luka w serwerze pocztowym qmail

Badacze bezpieczeństwa z Qualys pokazał okazja eksploatacja luki w serwerze pocztowym qmail, sławny w 2005 roku (CVE-2005-1513), ale pozostał niezałatany, ponieważ autor qmaila argumentował, że stworzenie działającego exploita, który mógłby zostać wykorzystany do atakowania systemów w domyślnej konfiguracji, jest nierealne. Qualysowi udało się przygotować exploita, który obala to założenie i umożliwia zdalne wykonanie kodu na serwerze poprzez wysłanie specjalnie zaprojektowanej wiadomości.

Problem jest spowodowany przepełnieniem liczby całkowitej w funkcji stralloc_readyplus(), co może wystąpić podczas przetwarzania bardzo dużej wiadomości. Do działania wymagany był system 64-bitowy z ponad 4 GB pamięci wirtualnej. Podczas pierwszej analizy luki w 2005 roku Daniel J. Bernstein argumentował, że założenie w kodzie, że rozmiar przydzielonej tablicy zawsze mieści się w granicach 32-bitowych, opiera się na fakcie, że nikt nie zapewnia gigabajtów pamięci dla każdego procesu. W ciągu ostatnich 15 lat systemy 64-bitowe na serwerach zastąpiły systemy 32-bitowe, a ilość dostarczanej pamięci i przepustowość sieci dramatycznie wzrosły.

Opiekunowie pakietu qmail wzięli pod uwagę uwagę Bernsteina i ograniczyli dostępną pamięć podczas uruchamiania procesu qmail-smtpd (na przykład w Debianie 10 limit jest ustawiony na 7 MB). Jednak inżynierowie z Qualys stwierdzili, że to nie wystarczy i oprócz qmail-smtpd można przeprowadzić zdalny atak na proces qmail-local, który pozostał nieograniczony we wszystkich testowanych pakietach. Na dowód przygotowano prototyp exploita, który nadawał się do ataku na pakiet Debiana za pomocą qmaila w domyślnej konfiguracji.
Aby zorganizować zdalne wykonanie kodu podczas ataku, serwer wymaga 4 GB wolnego miejsca na dysku i 8 GB pamięci RAM.
Exploit umożliwia uruchamianie dowolnych poleceń powłoki z uprawnieniami dowolnego użytkownika w systemie, z wyjątkiem użytkowników root i systemowych, którzy nie posiadają własnego podkatalogu w katalogu „/home” (proces qmail-local jest uruchamiany z uprawnieniami lokalnego użytkownika, do którego realizowana jest dostawa).

Atak zostaje przeprowadzony
poprzez wysłanie bardzo dużej wiadomości e-mail, zawierającej kilka linii nagłówka, o wymiarach około 4 GB i 576 MB. Przetwarzanie takiego ciągu w qmail-local skutkuje przepełnieniem liczby całkowitej przy próbie dostarczenia wiadomości użytkownikowi lokalnemu. Przepełnienie liczb całkowitych prowadzi następnie do przepełnienia bufora podczas kopiowania danych i możliwości nadpisania stron pamięci kodem libc. Manipulując układem przesyłanych danych można także przepisać adres funkcji „open()”, zastępując go adresem funkcji „system()”.

Następnie w procesie wywoływania qmesearch() w qmail-local, poprzez funkcję open() otwierany jest plik „.qmail-extension”, co prowadzi do faktycznego wykonania funkcji
system(.qmail-rozszerzenie"). Ponieważ jednak część pliku „rozszerzenie” jest generowana na podstawie adresu odbiorcy (na przykład „localuser-extension@localdomain”), osoby atakujące mogą zorganizować wysłanie polecenia do uruchomienia, podając użytkownika „localuser-;command ;@localdomain” jako odbiorcę wiadomości.

Podczas analizy kodu zidentyfikowano także dwie luki w dodatkowej łatce qmail-verify, która jest częścią pakietu dla Debiana. Pierwsza luka (CVE-2020-3811) pozwala ominąć weryfikację adresu e-mail, a druga (CVE-2020-3812) prowadzi do wycieku informacji lokalnych. W szczególności pierwsza luka pozwala ominąć weryfikację poprawności adresu użytego w exploitze do wysłania polecenia (weryfikacja nie działa w przypadku adresów bez domeny, np. „localuser-;polecenie;”). Drugą lukę można wykorzystać do sprawdzenia obecności plików i katalogów w systemie, w tym także tych dostępnych tylko dla roota (qmail-verify działa z uprawnieniami roota), poprzez bezpośrednie wywołanie lokalnego modułu obsługi.

Aby obejść ten problem, Bernstein zalecił uruchamianie procesów qmaila z całkowitym limitem dostępnej pamięci („softlimit -m12345678”), w którym to przypadku problem zostanie zablokowany. Jako alternatywną metodę ochrony wymienia się także ograniczenie maksymalnego rozmiaru przetwarzanej wiadomości poprzez plik „control/databytes” (domyślnie nie jest on tworzony z domyślnymi ustawieniami, qmail pozostaje podatny na ataki). Dodatkowo "control/databytes" nie chroni przed lokalnymi atakami ze strony użytkowników systemu, gdyż limit jest uwzględniany jedynie przez qmail-smtpd.

Problem dotyczy pakietu Netqmail, zawarte w repozytoriach Debiana. Dla tego pakietu przygotowano zestaw poprawek eliminujących zarówno stare luki z 2005 roku (poprzez dodanie twardych limitów pamięci do kodu funkcji alloc()), jak i nowe problemy w qmail-verify. Osobno przygotowany zaktualizowana wersja łatki qmail-verify. Deweloperzy gałęzie notqmail przygotowali własne łatki blokujące stare problemy, a także rozpoczęli prace nad wyeliminowaniem wszelkich możliwych przepełnień liczb całkowitych w kodzie.

Źródło: opennet.ru

Dodaj komentarz