PwnKit: wiekowa dziura pozwala zdobyć prawa roota
Obecna od 2009 roku dziura w linuksowym narzędziu polkit umożliwia nieuprawnione podniesienie uprawnień do poziomu użytkownika root. Winna jest nieostrożna obsługa argumentów w kodzie języka C oraz zbyt naiwne podejście do wartości NULL w tablicy argv. Błąd, brzmiący jak elementarna pomyłka, czaił się w kodzie od dwunastu lat i choć opisano go już w 2013 jako teoretyczne zagrożenie, dopiero teraz udało się wymyślić, jak go wykorzystać.
Polkit to "mądre sudo" w systemach linuksowych, pozwalające otrzymać wyższe prawa nie dla całego procesu, a dla konkretnej akcji (np. restart, instalacja aktualizacji). Prawa te nazywane są przywilejami. Możliwe jest definiowanie własnych przywilejów, a także przypisywanie użytkowników do akcji, aby nie musieli oni się uwierzytelniać np. w celu zaktualizowania systemu.
Stanowi on zaawansowane rozwinięcie sudo, przebijające funkcjonalnością znaną z Windows Kontrolę Konta Użytkownika, a także wprowadzające znaną z Windows koncepcję przywilejów (Se*), znacznie ją przy tym rozbudowując. Polkit jest w powszechnym użyciu i w większości przypadków jest używany na ustawieniach domyślnych dostarczanych przez dystrybucję. Podobnie jak sudo, z jego zaawansowanych cech korzystają nieliczni.
Znowu dziura napisana w C?
Na czym polega znaleziona w polkicie podatność CVE-2021-4034 nazwana PwnKit? Na nieostrożności w przypadku zerowej liczby argumentów wiersza poleceń (argc = 0). Prowadzi to do stanu, w którym tablica argv jest pusta, a więc argv[0] to NULL. Wpadamy tu na minę. Polkit twierdzi, że argv[0] nie może być puste, więc można bezpiecznie "chodzić" po argv - podczas gdy POSIX wcale nie jest już tego takie pewne i dopuszcza argv[0] jako NULL (a nie nazwa programu). Ale takie OpenBSD już nie!
C to nie Python, więc czytanie pamięci spoza tablicy to jedynie wyjechanie wskaźnikiem za daleko, ale w obręb własnej pamięci. Wskutek szeregu dodatkowych niuansów, skutecznie opisanych (na wiele stron) przez badaczy z Qualys, możliwe jest zatrucie zmiennych środowiskowych i załadowanie własnego, złośliwego kodu.
Błąd nie jest zatem wcale taki "elementarny". To POSIX jest niedokładny, a Linux często niewiele robi, żeby go uściślić. W rezultacie, wątpliwe praktyki okazują się być jawnie szkodliwe. Atak wymaga interaktywnej, uwierzytelnionej sesji, wyceniono go więc na 7.8 i stworzono stosowne poprawki. Są już dostępne w kanale aktualizacji automatycznych Red Hata/Fedory, Debiana i Ubuntu.