CVE-2023-32233 i powrót unprivileged user namespaces
Napisał: Patryk Krawaczyński
11/05/2023 w Bezpieczeństwo 1 komentarz. (artykuł nr 859, ilość słów: 693)
P
atryk Sondej oraz Piotr Krysiuk zgłosili lukę w jądrze Linuksa pozwalającą lokalnym użytkownikom na eskalację ich uprawnień do poziomu administratora, co pozwala na przejęcie pełnej kontroli nad systemem. Błąd use-after-free występuje w komponencie netfilter nf_tables podczas przetwarzania żądań wsadowych aktualizujących konfigurację i może zostać nadużyty do wykonania dowolnego odczytu i zapisu pamięci jądra. Dla przypomnienia: netfilter to wbudowany w jądro Linuksa framework do filtrowania pakietów i translacji adresów sieciowych (ang. Network Address Translation), który jest zarządzany przez takie narzędzia jak iptables / nftables i UFW (ang. Uncomplicated Firewall).
Jeśli przewiniemy stronę manualną rozwiązania nftables to dowiemy się, że obsługuje ono dwa rodzaje zbiorów – nazwane oraz anonimowe. Zbiory anonimowe to zbiory, które nie mają określonej nazwy przy dodawaniu reguł. Elementy zbioru są ujęte w nawiasy klamrowe, z przecinkami oddzielającymi elementy podczas tworzenia reguły ( { 22, 80, 443 }
), w której zbiór jest używany. Możemy użyć anonimowych zbiorów dla portów, adresów IP lub innych kryteriów dopasowania. Gdy reguła ta zostanie usunięta, zbiór jest również usuwany. Nie mogą być one aktualizowane, tzn. raz zadeklarowany anonimowy zbiór nie może być już zmieniony, chyba że przez usunięcie / zmianę reguły, która używa anonimowego zbioru. Przykład użycia anonimowego zbioru do akceptowania ruchu z poszczególnych podsieci i portów:
nft add rule filter input ip saddr { 10.0.0.0/16, 10.1.0.0/16 } tcp dport { 22, 25 } accept
Mając już zarys na czym polegają anonimowe zbiory w nftables dowiedzmy się na czym polega odkryty błąd. Otóż netfilter nf_tables pozwala na aktualizację swojej konfiguracji za pomocą żądań wsadowych (ang. batch requests), które grupują wiele podstawowych operacji w transakcje atomowe. W specyficznym scenariuszu, nieprawidłowe żądanie wsadowe może zawierać operację, która niejawnie usuwa istniejący anonimowy zbiór nft, a następnie inną operację, która próbuje działać na tym samym anonimowym zbiorze nft po jego usunięciu. W powyższym scenariuszu, jednym z przykładów pierwszej operacji jest usunięcie istniejącej reguły nft, która używa anonimowego zbioru nft. A przykładem tej drugiej operacji jest próba usunięcia elementu z tego anonimowego zbioru nft po tym, jak zbiór zostaje usunięty. Alternatywnie, ta druga operacja może nawet próbować jawnie usunąć ten anonimowy zbiór nft ponownie. W omawianym scenariuszu, netfilter nf_tables nie odrzuca nieprawidłowego żądania wsadowego, a następnie uszkadza własny stan wewnętrzny podczas zatwierdzania tej drugiej operacji. Badacze twierdzą, że podatność dotyczy wielu wydań jądra Linuksa, w tym obecnej stabilnej wersji v6.3.1. Oczywiście do wykorzystania luki wymagany jest lokalny dostęp do urządzenia z systemem Linux.
Inżynier Pablo Neira Ayuso złożył już poprawkę kodu źródłowego jądra Linux w celu rozwiązania problemu, wprowadzając dwie funkcje, które zarządzają cyklem życia anonimowych zbiorów w podsystemie netfilter nf_tables. Poprzez odpowiednie zarządzanie aktywacją i dezaktywacją anonimowych zbiorów oraz zapobieganie dalszym aktualizacjom, poprawka ta nie dopuszcza do uszkodzenia pamięci oraz możliwości wykorzystania przez użytkownika błędu use-after-free do eskalacji swoich uprawnień do poziomu administratora.
Unprivileged user namespaces:
Jako mitygację tego błędu kolejny i kolejny i kolejny raz wskazuje się wyłączenie nieuprzywilejowanych przestrzeni nazw użytkowników:
sysctl -w kernel.unprivileged_userns_clone=0
Przestrzenie nazw (ang. namespace) użytkownika są cechą izolacji, która pozwala procesom na uruchamianie z innymi identyfikatorami użytkownika i/lub przywilejami wewnątrz tej przestrzeni nazw niż są dozwolone na zewnątrz. Użytkownik może mieć UID 1001 w systemie poza przestrzenią nazw użytkownika, ale uruchamiać programy w innym UID i innymi przywilejami wewnątrz przestrzeni nazw. Przestrzenie nazw użytkownika są używane w środowiskach kontenerowych, aby umożliwić ustawienie kontenera bez uprzywilejowanych operacji i aby zwykły użytkownik mógł działać jako administrator wewnątrz kontenera i wykonywać zadania administracyjne nie będąc administratorem na hoście uruchamiającym kontener. Wiele dystrybucji Linuksa posiada dzisiaj tą funkcję włączoną w standardzie. Dlatego, jeśli nasz serwer nie jest hostem dla kontenerów (szczególnie tych typu rootless) należy poważnie rozważyć wyłączenie tej funkcji, nawet jeśli nie posiadamy już podatnych wersji jądra.
Więcej informacji: CVE-2023-32233, What does enabling kernel.unprivileged_userns_clone do?, Controlling access to user namespaces.
Dostępny jest już exploit.