W kontekście API Filesystem, dostarczanym przez jądro Linux, wykryto lukę (CVE-2022-0185), która umożliwia lokalnemu użytkownikowi uzyskanie uprawnień root w systemie. Badacz, który zidentyfikował problem, opublikował demonstrację działania exploita, który pozwala na wykonanie kodu z uprawnieniami root w Ubuntu 20.04 w konfiguracji domyślnej. Kod exploita ma być umieszczony na GitHubie w ciągu tygodnia, po wydaniu aktualizacji przez dystrybucje z poprawką tej luki.
Vulnarność występuje w funkcji legacy_parse_param() w VFS i jest spowodowana brakiem odpowiedniego sprawdzenia maksymalnego rozmiaru parametrów dostarczanych w systemach plików, które nie obsługują API Filesystem Context. Przekazanie zbyt dużego parametru może spowodować przepełnienie zmiennej całkowitej używanej do obliczenia rozmiaru zapisywanych danych — w kodzie istnieje sprawdzenie wykraczania poza granicę bufora „if (len > PAGE_SIZE - 2 - size)”, co nie działa, jeśli wartość size jest większa niż 4094 z powodu przepełnienia całkowitego przez dolną granicę (integer underflow, przy rzutowaniu 4096 - 2 - 4095 na unsigned int powstaje 2147483648).
Wskazana usterka pozwala na wywołanie przepełnienia bufora przy odwołaniu się do specjalnie przygotowanego obrazu FS i nadpisania danych jądra, które znajdują się za przydzielonym obszarem pamięci. Aby wykorzystać tę lukę, wymagane są uprawnienia CAP_SYS_ADMIN, tj. uprawnienia administratora. Problem polega na tym, że podobne uprawnienia użytkownik bez przywilejów może uzyskać w izolowanym kontenerze, jeśli w systemie włączono obsługę przestrzeni nazw identyfikatorów użytkowników (user namespaces). Na przykład, user namespaces są domyślnie włączone w Ubuntu i Fedorze, ale nieaktywne w Debianie i RHEL (chyba że wykorzystuje się platformy izolacji kontenerów).
Problem występuje od wersji jądra Linux 5.1 i został rozwiązany wczorajszych aktualizacjach 5.16.2, 5.15.16, 5.10.93, 5.4.173. Aktualizacje pakietów z poprawką tej luki zostały już wydane dla RHEL, Debiana, Fedorę, Ubuntu. Poprawka nie jest jeszcze dostępna w Arch Linux, Gentoo, SUSE i openSUSE. Jako obejście ochrony dla systemów, które nie korzystają z izolacji kontenerów, można ustawić wartość sysctl „user.max_user_namespaces” na 0: echo „user.max_user_namespaces=0” > /etc/sysctl.d/userns.conf # sysctl -p /etc/sysctl.d/userns.conf
Źródło: opennet.ru
