Badacze ds. bezpieczeństwa z firmy Microsoft zidentyfikowali dwie podatności (CVE-2022-29799, CVE-2022-29800) w usłudze networkd-dispatcher, które otrzymały nazwę kodową Nimbuspwn i umożliwiają nieuprzywilejowanemu użytkownikowi wykonanie dowolnych poleceń z prawami root. Problem został rozwiązany w wersji networkd-dispatcher 2.2. Na razie brak informacji o publikacji aktualizacji przez dystrybucje (Debian, RHEL, Fedora, SUSE, Ubuntu, Arch Linux).
Networkd-dispatcher jest używany w wielu dystrybucjach Linuxa, w tym w Ubuntu, które korzystają z procesu w tle systemd-networkd do konfiguracji parametrów sieci, i pełni funkcje zbliżone do NetworkManager-dispatcher, czyli uruchamia skrypty w przypadku zmiany stanu połączenia sieciowego, na przykład jest używany do uruchamiania VPN po nawiązaniu podstawowego połączenia sieciowego.
Powiązany z networkd-dispatcher proces w tle działa z prawami root i odbiera sygnały o zdarzeniach przez szynę D-Bus. Informacje o zdarzeniach związanych ze zmianą stanu połączeń sieciowych są przesyłane przez usługę systemd-networkd. Problem polega na tym, że nieuprzywilejowani użytkownicy mogą stworzyć zdarzenie o nieistniejącym stanie i zainicjować uruchomienie swojego skryptu, który zostanie wykonany z prawami root.
Systemd-networkd jest zaprojektowany do uruchamiania tylko systemowych skryptów obsługujących, umieszczonych w katalogu /etc/networkd-dispatcher i niedostępnych do zastąpienia przez użytkownika, ale z powodu podatności (CVE-2022-29799) w kodzie przetwarzania ścieżek plików istniała możliwość wyjścia poza katalog bazowy i uruchamiania dowolnych skryptów. W szczególności podczas tworzenia ścieżki pliku do skryptu używano wartości OperationalState i AdministrativeState przesyłanych przez D-Bus, w których nie czyszczono znaków specjalnych. Atakujący mógł wygenerować własny stan, w którego nazwie znajdowały się znaki „.. /” i przekierować zapytanie do networkd-dispatcher do innego katalogu.
Druga podatność (CVE-2022-29800) związana jest z wyścigiem stanów — pomiędzy sprawdzeniem parametrów skryptu (przynależność do roota) a jego uruchomieniem istniał krótki przedział czasowy, wystarczający do zastąpienia pliku i obejścia weryfikacji przynależności skryptu do użytkownika root. Ponadto w networkd-dispatcher brakowało sprawdzenia pod kątem linków symbolicznym, również podczas uruchamiania skryptów za pomocą wywołania subprocess.Popen, co znacznie ułatwiło organizację ataku.
Techniki eksploatacji:
- Tworzony jest katalog „/tmp/nimbuspwn” oraz dowiązanie symboliczne „/tmp/nimbuspwn/poc.d”, które wskazuje na katalog „/sbin”, używany do weryfikacji obecności plików wykonywalnych należących do roota.
- Dla plików wykonywalnych z „/sbin” tworzone są pliki o tej samej nazwie w katalogu „/tmp/nimbuspwn”, na przykład dla pliku „/sbin/vgs” tworzony jest plik wykonywalny „/tmp/nimbuspwn/vgs”, należący do nieuprzywilejowanego użytkownika, w którym umieszczany jest kod, który chce uruchomić atakujący.
- Za pomocą D-Bus proces networkd-dispatcher wysyła sygnał z określeniem w OperationalState wartości „../../../../tmp/nimbuspwn/poc”. Do wysłania sygnału w przestrzeni nazw „org.freedesktop.network1” wykorzystano możliwość podłączenia własnych obsługiwaczy do systemd-networkd, na przykład poprzez manipulacje z gpgv lub epmd, lub można skorzystać z faktu, że systemd-networkd nie jest domyślnie uruchomiony (na przykład w Linux Mint).
- Po otrzymaniu sygnału Networkd-dispatcher wykonuje budowę listy plików wykonywalnych, należących do użytkownika root i dostępnych w katalogu „/etc/networkd-dispatcher/../../../tmp/nimbuspwn/poc.d”, który w rzeczywistości odnosi się do „/sbin”.
- W momencie, gdy lista plików jest uzyskiwana, ale skrypt jeszcze nie jest uruchomiony, dowiązanie symboliczne jest przekierowywane z „/tmp/nimbuspwn/poc.d” na „/tmp/nimbuspwn” i networkd-dispatcher uruchomi z uprawnieniami roota skrypt, który został umieszczony przez atakującego.

Źródło: opennet.ru
