Badacze bezpieczeństwa z Qualys
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 (
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
Źródło: opennet.ru