CVE-2026-89690
NieznaneStreszczenie
W jądrze Linux w module nfsd bufor args->ops jest zwalniany synchronicznie przez vfree() w nfsd4_release_compoundargs(), podczas gdy handler dumpit netlink rpc_status odczytuje ten bufor pod rcu_read_lock. Współbieżne zakończenie compound może zwolnić bufor w trakcie odczytu, powodując use-after-free na pamięci vmalloc. Poprawka zastępuje vfree() przez kvfree_rcu_mightsleep(), odraczając zwolnienie o okres karencji RCU.
Ocena ryzyka
Lokalny atakujący z dostępem do interfejsu netlink rpc_status może wywołać use-after-free w jądrze, co potencjalnie prowadzi do eskalacji uprawnień lub awarii systemu. Ryzyko jest wysokie ze względu na możliwość wykonania kodu w kontekście jądra.
Rekomendacja
Zaktualizuj jądro Linux do wersji zawierającej poprawkę zastępującą vfree() przez kvfree_rcu_mightsleep(). Ogranicz dostęp do interfejsu netlink rpc_status do zaufanych procesów.
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: defer vfree of compound ops to fix rpc_status UAF The rpc_status netlink dumpit walks every in-flight svc_rqst under rcu_read_lock and, for NFSv4 requests, reads opnums out of args->ops[]. But args->ops is a separate vmalloc buffer freed synchronously by vfree() in nfsd4_release_compoundargs() at the end of every compound. The dumpit's rcu_read_lock pins the svc_rqst struct itself (freed via kfree_rcu), but nothing defers the vfree of the ops buffer across the RCU grace period. A concurrent compound completion can therefore free the buffer while the dumpit is reading it — a use-after-free on vmalloc memory. The trailing seqcount recheck (smp_load_acquire of rq_status_counter) cannot undo a load that already retired against freed memory. Fix by replacing vfree(args->ops) with kvfree_rcu_mightsleep(), which defers the free until after an RCU grace period. This makes the existing rcu_read_lock in the dumpit sufficient to protect the read. The tradeoff is that completed compound ops buffers (up to 200 * sizeof(struct nfsd4_op)) persist in memory slightly longer, across one grace period, before being reclaimed.

