Krytyczna luka w PolKicie umożliwiająca dostęp do roota w większości dystrybucji Linuksa

Qualys zidentyfikował lukę (CVE-2021-4034) w komponencie systemu Polkit (dawniej PolicyKit) wykorzystywanym w dystrybucjach, aby umożliwić nieuprzywilejowanym użytkownikom wykonywanie działań wymagających podwyższonych uprawnień dostępu. Luka umożliwia nieuprzywilejowanemu użytkownikowi lokalnemu zwiększenie swoich uprawnień w celu uzyskania uprawnień roota i uzyskania pełnej kontroli nad systemem. Problem otrzymał nazwę kodową PwnKit i wyróżnia się tym, że stworzył działający exploit, który działa w domyślnej konfiguracji w większości dystrybucji Linuksa.

Problem występuje w narzędziu pkexec programu PolKit, które ma flagę root SUID i jest przeznaczone do uruchamiania poleceń z uprawnieniami innego użytkownika zgodnie z określonymi regułami PolKit. Z powodu nieprawidłowej obsługi argumentów wiersza poleceń przekazywanych do pkexec nieuprzywilejowany użytkownik może ominąć uwierzytelnianie i uruchomić swój kod jako root, niezależnie od ustawionych reguł dostępu. W przypadku ataku nie ma znaczenia, jakie ustawienia i ograniczenia są określone w PolKicie, wystarczy, że atrybut root SUID zostanie ustawiony dla pliku wykonywalnego za pomocą narzędzia pkexec.

Pkexec nie sprawdza poprawności liczby argumentów wiersza poleceń (argc) przekazanych podczas uruchamiania procesu. Twórcy pkexec założyli, że pierwszy wpis w tablicy argv zawsze zawiera nazwę procesu (pkexec), a drugi albo wartość NULL, albo nazwę polecenia uruchomionego przez pkexec. Ponieważ liczba argumentów nie została porównana z faktyczną zawartością tablicy i przyjęto, że jest zawsze większa od 1, jeśli do procesu przekazano pustą tablicę argv, na co pozwala funkcja execve systemu Linux, pkexec potraktuje NULL jako pierwszy argument ( nazwa procesu), a następna już poza pamięcią buforową, podobnie jak kolejna zawartość tablicy. |———+———+——+————|———+——+——+————| | argv[0] | argument[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—+——+——|——| VVVVVV "program" "-opcja" NULL "wartość" "ŚCIEŻKA=nazwa" NULL

Problem polega na tym, że po tablicy argv znajduje się w pamięci tablica envp zawierająca zmienne środowiskowe. Zatem jeśli tablica argv jest pusta, pkexec wyodrębnia dane o komendzie wykonanej z podwyższonymi uprawnieniami z pierwszego elementu tablicy ze zmiennymi środowiskowymi (argv[1] stał się identyczny z envp[0]), którego zawartością można sterować przez napastnika.

Po otrzymaniu wartości argv[1] pkexec próbuje, biorąc pod uwagę ścieżki plików w PATH, określić pełną ścieżkę do pliku wykonywalnego i zapisuje wskaźnik do ciągu znaków z pełną ścieżką z powrotem do argv[1], co prowadzi do nadpisania wartości pierwszej zmiennej środowiskowej, ponieważ argv[1] jest identyczne z envp[0]. Manipulując nazwą pierwszej zmiennej środowiskowej, osoba atakująca może zastąpić inną zmienną środowiskową w pkexec, na przykład zastąpić zmienną środowiskową „LD_PRELOAD”, co jest niedozwolone w programach suid, i zorganizować załadowanie swojej biblioteki współdzielonej do proces.

Działający exploit polega na podstawieniu zmiennej GCONV_PATH, która służy do określenia ścieżki do biblioteki transkodującej symbole, ładowanej dynamicznie podczas wywołania funkcji g_printerr(), której kod wykorzystuje iconv_open(). Redefiniując ścieżkę w GCONV_PATH, atakujący może mieć pewność, że nie będzie ładowana standardowa biblioteka iconv, ale własna biblioteka, z której procedury obsługi zostaną wykonane, gdy zostanie wyświetlony komunikat o błędzie na etapie, gdy pkexec nadal działa z sprawdzane są prawa roota i uprawnienia do uruchomienia.

Należy zauważyć, że pomimo tego, że przyczyną problemu jest uszkodzenie pamięci, można go niezawodnie i powtarzalnie wykorzystać niezależnie od zastosowanej architektury sprzętowej. Przygotowany exploit został pomyślnie przetestowany na Ubuntu, Debianie, Fedorze i CentOS, ale można go wykorzystać także na innych dystrybucjach. Oryginalny exploit nie jest jeszcze publicznie dostępny, co wskazuje, że jest banalny i może zostać łatwo odtworzony przez innych badaczy, dlatego ważne jest, aby jak najszybciej zainstalować aktualizację łatki w systemach z wieloma użytkownikami. Polkit jest również dostępny dla systemów BSD i Solaris, ale nie został przetestowany pod kątem użycia w nich. Wiadomo, że ataku nie można przeprowadzić na OpenBSD, ponieważ jądro OpenBSD nie pozwala na przekazanie zerowej wartości argc podczas wywoływania execve().

Problem występuje od maja 2009 roku, od czasu dodania polecenia pkexec. Poprawka luki PolKit jest obecnie dostępna w formie łatki (nie wydano żadnej wersji łatki), jednak ponieważ twórcy dystrybucji zostali powiadomieni o problemie z wyprzedzeniem, większość dystrybucji opublikowała aktualizację jednocześnie z ujawnieniem informacji o luce. Problem został rozwiązany w RHEL 6/7/8, Debianie, Ubuntu, openSUSE, SUSE, Fedorze, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux i Manjaro. Tymczasowo w celu zablokowania luki można usunąć flagę główną SUID z programu /usr/bin/pkexec („chmod 0755 /usr/bin/pkexec”).



Źródło: opennet.ru

Dodaj komentarz