CVE-2026-89682
NieznaneStreszczenie
W jądrze Linux funkcja nfsd_file_dispose_list_delayed() odkłada fput() do wątków usługi nfsd przez kolejkę freeme per-net, która znajduje się w osobno alokowanej strukturze nfsd_fcache_disposal zwalnianej podczas niszczenia przestrzeni nazw sieci. Globalny shrinker, laundrette i callbacki fsnotify mogą nadal odwoływać się do tego wskaźnika, powodując use-after-free.
Ocena ryzyka
Use-after-free w jądrze może prowadzić do uszkodzenia pamięci, awarii systemu lub potencjalnie do eskalacji uprawnień. Podatność może być wywołana przez operacje na plikach NFS podczas niszczenia przestrzeni nazw sieci.
Rekomendacja
Zaktualizować jądro Linux do wersji zawierającej poprawkę, która przenosi spinlock i listę freeme bezpośrednio do struct nfsd_net, eliminując osobno alokowaną strukturę nfsd_fcache_disposal.
Inne podatności w Linux kernel nfsd
Zobacz wszystkie- CVE-2026-89706Nieznane
W jądrze Linux w module nfsd nie resetowano weryfikatora zapisu (write verifier) po niepowodzeniu asynchronicznego zapisu wstecznego operacji COPY. Gdy zapis wsteczny się nie powiódł, serwer zgłaszał klientowi NFS_UNSTABLE, ale nie rotował weryfikatora, przez co klient po wykonaniu COMMIT uznawał dane za trwałe, mimo że zapis się nie udał.
- CVE-2026-89705Nieznane
W jądrze Linux funkcja nfsd_dispatch() nie przywracała rq_status_counter do wartości parzystej na wszystkich ścieżkach wyjścia (cache-hit, drop, błąd kodowania). Pozostawiony nieparzysty licznik powodował, że bezblokadowy czytnik w nfsd_nl_rpc_status_get_dumpit() uznawał pola rqstp za stabilne i mógł odczytać dane poza końcem 8-elementowej tablicy ops.
- CVE-2026-89704Nieznane
W jądrze Linux funkcja _nfsd_copy_file_range() próbkowała kursor błędu zapisu wstecznego (dst->f_wb_err) po pętli kopiowania, a nie przed nią. Współbieżne COMMIT lub stabilny WRITE mogły przesunąć kursor, przez co błąd zapisu nie był wykrywany i ustawiano NFSD4_COPY_F_COMMITTED mimo niepowodzenia zapisu.
- CVE-2026-89703Nieznane
W jądrze Linux funkcja nfsd4_drop_revoked_stid() obsługująca FREE_STATEID dla delegacji odwołanych przez administratora nie ustawiała flagi SC_STATUS_FREED przed zwolnieniem cl_lock. Bez tej flagi zwolniona delegacja była dodawana do cl_revoked, co prowadziło do use-after-free przy późniejszym przechodzeniu po tej liście w __destroy_client().
- CVE-2026-89701Nieznane
W jądrze Linux ścieżki dekodowania TIME_DELEG_ACCESS i TIME_DELEG_MODIFY (oparte na xdrgen) zapisywały surową wartość uint32_t nseconds bezpośrednio do tv_nsec bez sprawdzenia warunku nseconds < NSEC_PER_SEC. Złośliwy klient mógł przesłać nieprawidłowy timespec, który propagował się przez notify_change() aż do dysku.
- CVE-2026-89700Nieznane
W jądrze Linux polityka nfsd_sock_nl_policy deklarowała NFSD_A_SOCK_ADDR jako NLA_BINARY bez minimalnej długości. Użytkownik z uprawnieniem CAP_NET_ADMIN mógł wysłać 16-bajtowy adres z sa_family=AF_INET6, powodując 12-bajtowy odczyt poza granicami bufora w trzech miejscach (rpc_cmp_addr_port, svc_find_listener, kernel_bind).
- CVE-2026-89699Nieznane
W jądrze Linux funkcja nfsd4_decode_create() przyjmowała nieograniczoną wartość cr_datalen z sieci dla celów dowiązań symbolicznych NF4LNK, umożliwiając klientowi wymuszenie alokacji kmalloc o rozmiarze do maksymalnego ładunku RPC (kilka MiB) na każdą operację COMPOUND. VFS odrzucał zbyt duże cele z ENAMETOOLONG, ale alokacja już się odbywała.
- CVE-2026-89698Nieznane
W jądrze Linux struktura nfsd_genl_rqstp deklarowała pola rq_daddr i rq_saddr jako zwykłe struct sockaddr (16 bajtów). Przy połączeniu klienta IPv6 funkcja nfsd_genl_rpc_status_compose_msg() rzutowała te pola na struct sockaddr_in6 (28 bajtów), odczytując 8 bajtów poza końcem pola i wysyłając do przestrzeni użytkownika obcięty adres IPv6 wraz z fragmentem rq_flags przez netlink.
- CVE-2026-89697Nieznane
W jądrze Linux gałąź BOTH_TIME_SET w nfsd_proc_setattr() wywoływała fh_verify() wcześnie, aby setattr_prepare() mógł sprawdzić dentry. Powodowało to pominięcie fh_want_write() w nfsd_setattr(), przez co notify_change() działał bez referencji zapisu do montowania.
- CVE-2026-89696Nieznane
W jądrze Linux w module nfsd występuje luka polegająca na tym, że po operacji FOREIGN PUTFH kolejne operacje mogą być wykonywane mimo że fh_dentry ma wartość NULL. Zdalny klient NFSv4.2 może spreparować żądanie COMPOUND, które doprowadzi do dereferencji wskaźnika NULL w wątku jądra nfsd. Problem dotyczy konfiguracji z włączonym CONFIG_NFSD_V4_2_INTER_SSC.
Oryginalny opis (angielski, źródło NVD)
In the Linux kernel, the following vulnerability has been resolved: nfsd: fix fcache_disposal UAF by inlining dispose state into nfsd_net nfsd_file_dispose_list_delayed() defers fput() to nfsd service threads via a per-net freeme queue, preventing the shrinker and GC worker from bearing the cost of closing files (see ffb402596147). However, the queue lives in a separately-allocated struct nfsd_fcache_disposal that is freed by nfsd_free_fcache_disposal_net() during per-net teardown. The global shrinker, laundrette, and fsnotify callbacks can still be inside nfsd_file_dispose_list_delayed() dereferencing that pointer, causing a use-after-free. Inline the spinlock and freeme list directly into struct nfsd_net (as fcache_dispose_lock and fcache_dispose_list), eliminating the separately allocated struct nfsd_fcache_disposal entirely. These fields now have the same lifetime as the net namespace itself, so there is no dangling pointer to chase. nfsd_file_cache_start_net() now just initializes the inline fields and cannot fail due to allocation. nfsd_file_cache_shutdown_net() drains the inline list directly instead of freeing a separate struct. The alloc/free helpers are removed.

