Dynamiczny loader , który jest częścią OpenBSD, w określonych warunkach może -aplikacji pozostawić zmienną środowiskową LD_LIBRARY_PATH, co z kolei pozwala na załadowanie zewnętrznego kodu w kontekście procesu działającego z podwyższonymi uprawnieniami. Łatki naprawiające tę lukę są dostępne dla wydań i . Łatki binarne () dla platform amd64, i386 i arm64 już zostały wprowadzone do produkcji i powinny być dostępne do pobrania w momencie publikacji tej wiadomości.
Sedno problemu: w trakcie działania ld.so najpierw wyciąga wartość zmiennej LD_LIBRARY_PATH z otoczenia, za pomocą funkcji _dl_split_path() przekształca ją w tablicę łańcuchów — ścieżek do katalogów. Jeśli później okaże się, że bieżący proces został uruchomiony jako aplikacja SUID/SGID, to stworzona tablica i sama zmienna LD_LIBRARY_PATH zostaną wyczyszczone. Przy tym, jeśli w trakcie działania _dl_split_path() natrafi na brak pamięci (co jest trudne ze względu na jawne ograniczenie rozmiaru zmiennych środowiskowych do 256 kB, ale teoretycznie możliwe), zmienna _dl_libpath przybierze wartość NULL, a kolejna kontrola tej zmiennej spowoduje pominięcie wywołania _dl_unsetenv(«LD_LIBRARY_PATH»).
Luka została odkryta przez specjalistów , tak jak i problemów. Przeprowadzający badanie specjaliści ds. bezpieczeństwa zauważyli szybkość rozwiązania problemu: łatka została przygotowana, a aktualizacje wydane w ciągu trzech godzin po powiadomieniu projektu OpenBSD.
Uzupełnienie: Problemowi nadano numer . Na liście dyskusyjnej oss-security ogłoszono , zawierający prototyp exploita, działającego w OpenBSD 6.6, 6.5, 6.2 i 6.1 na architekturach
amd64 i i386 (exploit może być zaadaptowany również dla innych architektur).
Problem jest użyteczny w domyślnej instalacji i pozwala nieuprzywilejowanemu lokalnemu użytkownikowi na uruchomienie kodu z prawami roota poprzez podstawienie biblioteki przy uruchamianiu narzędzi suid chpass lub passwd. Aby stworzyć warunki niezbędne do wykorzystania, używa się ograniczenia pamięci RLIMIT_DATA przez setrlimit.
Źródło: opennet.ru
