Badacze zabezpieczeń z firmy Qualys możliwość znaleźli lukę w serwerze pocztowym qmail, obecną od 2005 roku (CVE-2005-1513), która pozostała nie naprawiona, ponieważ autor qmail twierdził, że stworzenie działającego exploita do ataku na systemy w konfiguracji domyślnej jest nierealistyczne. W Qualys udało się przygotować exploit obalający to założenie, pozwalający na zdalne wykonanie kodu na serwerze poprzez wysłanie specjalnie sformatowanej wiadomości.
Problem jest spowodowany przepełnieniem całkowitym w funkcji stralloc_readyplus(), które może wystąpić przy przetwarzaniu bardzo dużej wiadomości. Do wykorzystania luki wymagana była 64-bitowa system z pamięcią wirtualną większą niż 4 GB. Przy początkowej analizie luki w 2005 roku Daniel Bernstein twierdził, że założenie w kodzie, że rozmiar przydzielanej tablicy zawsze mieści się w 32-bitowej wartości, opiera się na tym, że nikt nie przydziela gigabajtów pamięci każdemu procesowi. W ciągu ostatnich 15 lat 64-bitowe systemy na serwerach wypierały 32-bitowe, znacznie wzrosła ilość dostarczanej pamięci oraz przepustowość sieci.
Pakiety towarzyszące qmail uwzględniły uwagę Bernsteina i podczas uruchamiania procesu qmail-smtpd ograniczały dostępną pamięć (na przykład w Debianie 10 ustawiono limit na 7 MB). Jednak inżynierowie z Qualys odkryli, że to niewystarczające, a poza qmail-smtpd zdalny atak można przeprowadzić na procesie qmail-local, który w wszystkich sprawdzonych pakietach pozostał nieograniczony. Jako dowód stworzono prototyp exploita, odpowiedniego do ataku na pakiet qmail dostarczany w Debianie w konfiguracji domyślnej.
Aby zorganizować zdalne wykonanie kodu podczas ataku, na serwerze muszą być dostępne 4 GB wolnego miejsca na dysku oraz 8 GB RAM.
Exploit umożliwia uruchamianie dowolnych poleceń shell z uprawnieniami dowolnego użytkownika w systemie, z wyjątkiem użytkownika root oraz użytkowników systemowych, którzy nie mają własnego podkatalogu w katalogu '/home' (proces qmail-local jest uruchamiany z prawami lokalnego użytkownika, do którego dostarczana jest wiadomość).
Atak jest przeprowadzany
przez wysłanie bardzo dużej wiadomości e-mail, zawierającej kilka linii w nagłówku, o rozmiarze około 4GB i 576MB. Przetwarzanie takiej linii w qmail-local prowadzi do przepełnienia całkowitoliczbowego podczas próby dostarczenia wiadomości do lokalnego użytkownika. Przepełnienie całkowitoliczbowe prowadzi następnie do przepełnienia bufora podczas kopiowania danych oraz możliwości nadpisania stron pamięci z kodem libc. Dzięki manipulacjom z układem przesyłanych danych udaje się również nadpisać adres funkcji „open()”, zastępując go adresem funkcji „system()”.
Następnie, w trakcie wywołania qmesearch() w qmail-local, otwierany jest plik „.qmail-extension” za pomocą funkcji open(), co prowadzi do faktycznego wywołania funkcji
system(«.qmail-extension»). Jednakże część pliku „extension” jest tworzona na podstawie adresu odbiorcy (na przykład „localuser-extension@localdomain”) i atakujący mogą zorganizować przesyłanie polecenia do uruchomienia, wskazując użytkownika „localuser-;command;@localdomain” jako odbiorcę wiadomości.
W trakcie analizy kodu zidentyfikowano również dwie podatności w dodatkowej łatce qmail-verify, która wchodzi w skład paczki dla Debiana. Pierwsza podatność () umożliwia ominięcie weryfikacji adresu e-mail, a druga () prowadzi do wycieku lokalnych informacji. W szczególności, pierwsza podatność pozwala na ominięcie weryfikacji poprawności adresu stosowanego w eksploacie do przesyłania polecenia (weryfikacja nie działa dla adresów bez domeny, takich jak „localuser-;command;”). Druga podatność może być używana do sprawdzania obecności plików i katalogów w systemie, w tym dostępnych tylko dla roota (qmail-verify jest uruchamiane z uprawnieniami roota), poprzez bezpośrednie odwołanie do lokalnego handlera.
Aby obejść problem, Bernstein zalecał uruchamianie procesów qmail z ustawionym wspólnym limitem na dostępną pamięć („softlimit -m12345678”), a w takim przypadku problem jest zablokowany. Jako alternatywna metoda ochrony wspomniane jest również ograniczenie maksymalnego rozmiaru przetwarzanej wiadomości za pośrednictwem pliku „control/databytes” (domyślnie nie jest tworzony w ustawieniach domyślnych, qmail pozostaje podatny). Dodatkowo, „control/databytes” nie chroni przed lokalnymi atakami ze strony użytkowników systemu, ponieważ ograniczenie jest brane pod uwagę tylko w qmail-smtpd.
Problem dotyczy pakietu , zawarty w repozytoriach Debiana. Dla tego pakietu przygotowano zestaw poprawek, które eliminują zarówno stare luki z 2005 roku (poprzez dodanie do kodu funkcji alloc() twardych limitów pamięci), jak i nowe problemy w qmail-verify. Osobno zaktualizowaną wersję łaty qmail-verify. Programiści przygotowali swoje poprawki w celu zablokowania starych problemów oraz rozpoczęli pracę nad eliminacją wszelkich możliwych przepełnień całkowitych w kodzie.
Źródło: opennet.ru
