Firma Qualys odkryła niebezpieczną lukę (CVE-2023-6246) w standardowej bibliotece C Glibc, która pozwala na wykonywanie kodu z podwyższonymi uprawnieniami poprzez manipulację przy uruchamianiu aplikacji SUID. Badacze opracowali działający exploit, który umożliwia uzyskanie uprawnień root poprzez manipulację argumentami linii poleceń podczas uruchamiania narzędzia su.
Luka jest spowodowana przepełnieniem bufora w funkcji __vsyslog_internal(), używanej przy wywołaniu funkcji syslog() i vsyslog(). Problem wynika z błędu przy próbie wyprowadzenia zbyt długiej nazwy aplikacji przez makro SYSLOG_HEADER. Przy próbie rozszerzenia bufora z uwagi na długą nazwę występuje awaria, po której dane są zapisywane w starym buforze o pierwotnie mniejszym rozmiarze.
Podczas organizowania ataku za pomocą narzędzia su, atakujący może zmienić nazwę procesu przy uruchamianiu aplikacji, zastępując wartość argv[0], która jest używana do uzyskiwania informacji o nazwie programu przy zapisie w logu, co prowadzi do kontrolowanego nadpisania danych poza przydzielonym buforem. Przepełnienie bufora można następnie wykorzystać do nadpisania struktury nss_module w bibliotece nss w celu utworzenia biblioteki współdzielonej i jej załadowania z uprawnieniami root.
Problem pojawia się od wydania glibc 2.37, opublikowanego w sierpniu 2022 roku, które zawiera zmianę obsługującą sytuację z próbą zapisu zbyt dużych wiadomości. Wprowadzająca lukę poprawka została przeniesiona do gałęzi glibc 2.36 oraz do pakietów dystrybucji z starszymi wersjami glibc, ponieważ wskazana poprawka eliminowała lukę CVE-2022-39046, prowadzącą do wycieku danych z pamięci podręcznej. W rezultacie poprawka niebezpiecznej luki doprowadziła do powstania krytycznego problemu. Co ciekawe, o podobnej luce w funkcji vsyslog() zawartej w bibliotece libc 5.4.3 informowano już w 1997 roku.
Potwierdzono obecność luki w Debianie 12/13, Ubuntu 23.04/23.10 oraz Fedora 37-39. Działanie exploita umożliwiającego użytkownikowi bez przywilejów uzyskanie praw administratora démonstrowano w w pełni zaktualizowanym środowisku Fedora 38 z domyślnie włączonymi wszystkim mechanizmami ochrony. Luka może być wykorzystywana jedynie lokalnie, ponieważ wymaga przesłania ponad 1024 bajtów przez parametr argv[0] lub argument ident w funkcji openlog().
Poprawka luki została dodana kilka godzin temu do bazy kodu Glibc i znajdzie się w jutrzejszej aktualizacji Glibc 2.39, obok naprawy jeszcze dwóch luk (CVE-2023-6779, CVE-2023-6780), które również dotyczą kodu __vsyslog_internal() i prowadzą do przepełnienia bufora. Co więcej, firma Qualys ostrzegła przed wykryciem przepełnienia bufora w implementacji funkcji qsort(), które nie zostało zakwalifikowane przez programistów Glibc jako luka, ponieważ wykorzystanie do ataku zakłada użycie nietypowej funkcji porównawczej jako argumentu przy wywołaniu qsort, która zwraca różnicę porównywanych parametrów.
Status usuwania podatności w dystrybucjach można ocenić na następujących stronach: Debian, Ubuntu, SUSE, RHEL, Fedora, Arch Linux, Gentoo, Slackware. Można przetestować podatność systemu na lukę bezpieczeństwa za pomocą następującego polecenia: $ (exec -a "`printf ‘28000x’ 1`" /usr/bin/su < /dev/null)
Źródło: opennet.ru
