NFsec Logo

CVE-2023-4911 – Looney Tunables

12/10/2023 w Bezpieczeństwo Możliwość komentowania CVE-2023-4911 – Looney Tunables została wyłączona

N

iedawno firma Qualys odkryła i zgłosiła krytyczny błąd w popularnym ekosystemie bibliotek GLIBC, który jest domyślnie instalowany w większości systemów operacyjnych opartych na Linuksie. Wspomniany błąd polega na przepełnieniu bufora w kodzie odpowiedzialnym za obsługę specjalnych zmiennych środowiskowych podczas uruchamiania procesu, co może skutkować lokalną eskalacją uprawnień. Luce przypisano CVE-2023-4911 z oceną 7,8 co daje jej wysoki poziom podatności (w przypadku wykorzystania atakujący może uzyskać uprawnienia administratora w systemie). Opublikowano już kilka wersji testowych eksploitów dla tego błędu – PoC1, PoC2, PoC3, PoC4. Przykłady te pokazują, że sama eksploatacja jest dość prosta i nawet przy zastosowaniu siłowego zgadywania adresu pamięci (ze względu na ASLR) eskalacja może nastąpić w czasie krótszym niż 5 minut.

GLIBC jest domyślnie instalowany w wielu popularnych dystrybucjach Linuksa: Ubuntu, Debian, Fedora, RedHat. Zawiera dynamiczny linker ładujący (ld.so), czyli fragment oprogramowania odpowiedzialny za ładowanie wszystkich obiektów współdzielonych potrzebnych do uruchomienia programu. Jego zadania można opisać w kilku punktach: uruchamianie pliku binarnego; ładowanie bibliotek współdzielonych; obsługa zmiennych LD_PRELOAD i LD_LIBRARY_PATH; zarządzanie pamięcią i mapowanie pliku binarnego w pamięci. Luka znaleziona przez badaczy z Qualys ma miejsce podczas inicjalizacji dynamicznego linkera, a konkretnie podczas obsługi zmiennej środowiskowej GLIBC_TUNABLES. Zmienna ta pozwala na dostosowanie zachowania GLIBC podczas kolejnych zdarzeń. Listę dostępnych opcji dostrajania można uzyskać, uruchamiając następujące polecenie:

/lib64/ld-linux-x86-64.so.2 --list-tunables

Opcje dostrajające muszą zostać dostarczone do docelowego pliku binarnego jako lista oddzielonych od siebie dwukropkami par wartość=klucz ( “tunable1=aaa:tunable2=bbb”). Wspomniany linker jest odpowiedzialny za analizowanie i ostateczne usuwanie wrażliwych na bezpieczeństwo opcji dostrajania ze zmiennych środowiskowych. Co dokładnie się dzieje podczas tego procesu? Otóż funkcja __tunables_init (w której prowadzono błąd) przegląda zmienne środowiskowe i wyszukuje tej o nazwie: GLIBC_TUNABLES. Po jej znalezieniu wywołuje inną funkcję o nazwie tunables_strdup w celu utworzenia kopii zmiennej i rozpoczęcia jej przetwarzania. Ze względu na fakt, że GLIBC nie jest jeszcze zainicjowany ostatnia funkcja używa pod maską __minimal_malloc, która wywołuje mmap w celu zażądania pamięci od jądra systemu. Powoduje to alokację pamięci z pamięci wirtualnej zamiast ze sterty.

Możliwość przepełnienie bufora w tym procesie jest możliwa ze względu na sposób analizowania argumentów. Jeśli opcja dostrajająca będzie miała format: “tunable1=tunable2=bbb” zostanie ona potraktowana na początku jako: tunable1=”tunable2=bbb”, a później jako: “tunable2=bbb”. Spowoduje to skopiowanie większej ilości danych do przydzielonego bufora, niż jest to dozwolone. Chociaż luka ta została wykryta podczas przeglądu kodu źródłowego, badacze z Qualys poddali również testowanie tej logiki za pomocą fuzzingu i z pomocą programu AFL++ oraz libFuzzer powtórzyli ten błąd w mniej niż sekundę (przekazali tylko do programów listę opcji dostrajających z powyższego polecenia). PoC testujący podatność:

agresor@darkstar:~$ env -i "GLIBC_TUNABLES=glibc.malloc.mxfast=glibc.malloc.mxfast=A" \
"Z=`printf '%08192x' 1`" /usr/bin/su --help
Segmentation fault (core dumped)

Wykorzystanie luki polega na utworzeniu ładunku (ang. payload) modyfikującego wskaźnik l_info[DT_RPATH] (ścieżka wyszukiwania bibliotek), co może zmusić ld.so do załadowania obiektów współdzielonych z niezaufanych katalogów i wykonania dowolnego kodu (jako root, jeśli uruchomimy program z bitem SUID). Błąd udało wykorzystać się w domyślnych instalacjach Fedory 37 i 38, Ubuntu 22.04 i 23.04, Debianie 12 i 13; inne dystrybucje prawdopodobnie też są podatne na ataki (jedynym godnym uwagi wyjątkiem jest Alpine Linux, który używa musl libc, a nie glibc).

Więcej informacji: CVE-2023-4911, Detecting and mitigating CVE-2023-4911, Exploiting the Looney Tunables vulnerability on HTB, Looney Tunables – Local Privilege Escalation in the glibc’s ld.so

Ustawienie zmiennej środowiskowej TZ oszczędza tysiące wywołań systemowych

26/02/2017 w Administracja, Debug Możliwość komentowania Ustawienie zmiennej środowiskowej TZ oszczędza tysiące wywołań systemowych została wyłączona

A

by zaoszczędzić dodatkowych wywołań systemowych na serwerze przez chodzący proces – wystarczy ustawić zmienną środowiskową TZ na wartość: :/etc/localtime. Spowoduje to, że glibc nie będzie wykonywać zbędnych, dodatkowych wywołań systemowych. Szczególnie sprawdza się to w systemach, w których ustawienie strefy czasowej nie jest cyklicznie przestawiane – lub istnieje możliwość restartu danego procesu, kiedy to występuje (w większości przypadków taka zmiana występuje tylko raz – zazwyczaj w polskich realiach jest to przestawienie z UTC na CET).
[ czytaj całość… ]

Glibc Stack-based Buffer Overflow (CVE-2015-7547 i CVE-2015-5229)

21/02/2016 w Bezpieczeństwo Możliwość komentowania Glibc Stack-based Buffer Overflow (CVE-2015-7547 i CVE-2015-5229) została wyłączona

K

rytyczny błąd przepełnienia bufora na stosie został odkryty w sposobie w jaki biblioteka libresolv (glibc) przeprowadza podwójne zapytania DNS typu A/AAAA. Osoba atakująca może potencjalnie doprowadzić do zdalnego wykonania kodu (z uprawnieniami użytkownika uruchomiającymi bibliotekę) lub zawieszenia systemu poprzez specjalnie spreparowany ruch sieciowy w odpowiedzi DNS (PoC). Problem ten występuje tylko wtedy, gdy libresolv jest wywołana z modułu nss_dns usługi NSS (CVE-2015-7547).
[ czytaj całość… ]