Kilka dni temu pojawiła się wiadomość, że Wykryto dwie luki w zabezpieczeniach podsystemy tzw jądro Linuksa, Netfilter i io_uring, które pozwalają lokalnemu użytkownikowi podnieść swoje uprawnienia w systemie.
Pierwszym z nich jest podatność. (CVE-2023-32233), który został wykryty w podsystemie Netfilter oraz spowodowane dostępem do pamięci use-after-free w module nf_tables, który zapewnia działanie filtra pakietów nftables.
Ten błąd jest spowodowany tym, że netfilter nf_tables umożliwia aktualizację swojej konfiguracji dla żądań wsadowych, które grupują razem wiele podstawowych operacji w transakcjach atomowych.
Problem został odtworzony w różnych wersjach jądra Linuksa, w tym w Linuksie 6.3.1 (obecna stabilna), a lukę można wykorzystać, wysyłając specjalnie spreparowane żądania aktualizacji konfiguracji nftables. Wspomniano, że atak wymaga dostępu do nftables, które można uzyskać w osobnej sieciowej przestrzeni nazw, jeśli masz uprawnienia CLONE_NEWUSER, CLONE_NEWNS lub CLONE_NEWNET (na przykład, jeśli możesz uruchomić izolowany kontener).
W przypadku tego błędu badacz, który zidentyfikował problem, obiecał odłożyć o tydzień publikację szczegółowych informacji i przykładu działającego exploita, który zapewnia powłokę roota.
W określonym scenariuszu nieprawidłowe żądanie wsadowe może zawierać operację, która niejawnie usuwa istniejący anonimowy zestaw nft, a następnie inną operację, która próbuje działać na tym samym anonimowym zestawie nft po jego usunięciu. W powyższym scenariuszu przykładem powyższej operacji jest usunięcie istniejącej reguły nft, która używa zbioru anonimowego nft. A przykładem tej drugiej operacji jest próba usunięcia elementu z tej anonimowej tablicy nft po naprzemiennym usunięciu tablicy, ta druga operacja może nawet podjąć próbę ponownego jawnego usunięcia tej anonimowej tablicy nft.
Jak już wspomniano na początku, było to kilka dni temu, a exploit i informacje zostały już ujawnione. Exploit oraz jego szczegóły można znaleźć pod następującym linkiem.
Wykryto drugą usterkę, była luka (CVE-2023-2598) w implementacja asynchronicznego interfejsu I/O io_uring zawarte w jądrze Linuksa od wersji 5.1.
Problem jest spowodowany błędem w funkcji io_sqe_buffer_register, która umożliwia dostęp do pamięci fizycznej poza granicami statycznie alokowanego bufora. Problem pojawia się tylko w gałęzi 6.3 i zostanie rozwiązany w następnej aktualizacji 6.3.2.
Wspomniano, że pomysł stojący za oryginalnym zatwierdzeniem polega na tym, że zamiast dzielenia dużych stron, które są buforowane na pojedyncze wpisy bvec, można mieć pojedynczy wpis bvec dla wszystkich buforowanych części strony. W szczególności, jeśli wszystkie strony w mapie buforów używają struktury pierwszej strony i długości bufora w pojedynczym wpisie bvec zamiast mapowania każdej strony indywidualnie.
Tak więc bvec będzie wykraczać daleko poza pojedynczą stronę, której faktycznie może dotykać. Później IORING_OP_READ_FIXED i IORING_OP_WRITE_FIXED pozwalają nam na dowolny odczyt i zapis do bufora (tj. pamięci wskazywanej przez bvec). Umożliwia to dostęp do odczytu/zapisu do pamięci fizycznej za jedyną stroną, którą faktycznie mamy.
Publikacja dotycząca luki w zabezpieczeniach wspomina o krokach odtwarzania błędów:
1. Utwórz memfd
2. Błąd na pojedynczej stronie w tym deskryptorze pliku
3. Użyj MAP_FIXED, aby wielokrotnie mapować tę stronę do kolejnych lokalizacji
4. Zarejestruj cały region, który właśnie wypełniłeś tą stroną jako
stały bufor z IORING_REGISTER_BUFFERS
5. Użyj IORING_OP_WRITE_FIXED, aby zapisać bufor do innego pliku
(OOB odczyt) lub IORING_OP_READ_FIXED do odczytu danych w buforze (
zapis OOB).
Na koniec warto o tym wspomnieć jest już dostępny działający prototyp exploita (CVE-2023-2598) do testowania, umożliwiając uruchamianie kodu z uprawnieniami jądra.
Słaby punkt (CVE-2023-32233) Zostało to naprawione w aktualizacji 6.4-rc i możesz śledzić naprawę luki w dystrybucjach na stronach: Debian, Ubuntu, Gentoo, RHEL, Fedora, SUSE/openSUSE y łuk.