CVE-2026-98548
KrytyczneCVSS 9.8Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 11 - wyżej niż 11% wszystkich znanych CVE
Streszczenie
W jądrze Linux występuje podatność use-after-free w implementacji SCTP. Gdy asocjacja jest w stanie COOKIE-ECHOED, a zdalny peer wyśle pakiet zawierający jednocześnie chunk ERROR(Stale Cookie) i DATA z adresu niebędącego adresem podstawowym, przetwarzanie usuwa transport, na którym pakiet przyszedł, a kolejny chunk DATA ponownie rejestruje wskaźnik do tego zwolnionego transportu. Późniejsze użycie tego wiszącego wskaźnika (np. przez FWD-TSN lub opóźniony timer SACK) prowadzi do zapisu do zwolnionej pamięci.
Ocena ryzyka
Podatność może być wywołana przez dowolnego złośliwego peera SCTP lub lokalnego nieuprzywilejowanego użytkownika bez wymaganych uprawnień, co prowadzi do uszkodzenia pamięci jądra i potencjalnej eskalacji uprawnień lub odmowy usługi (panic jądra).
Rekomendacja
Zaktualizuj jądro Linux do wersji zawierającej poprawkę, która odrzuca resztę pakietu po błędzie stale-cookie. Jeśli aktualizacja nie jest możliwa, rozważ ograniczenie dostępu do usług SCTP lub wyłączenie modułu sctp, jeśli nie jest używany.
Inne podatności w Linux kernel
Zobacz wszystkie- CVE-2026-99087Nieznane
W jądrze Linux w dm-integrity występuje błąd, który powoduje dereferencję wskaźnika NULL, gdy urządzenie ma ustawioną flagę SB_FLAG_DIRTY_BITMAP i jest aktywowane w trybie 'R'. Funkcja dm_integrity_resume próbuje odczytać dziennik zawierający bitmapę, co prowadzi do awarii. Poprawka pomija zapisy do urządzenia w trybie 'R' podczas wznawiania.
- CVE-2026-99086Nieznane
W jądrze Linux dm-integrity nie waliduje superbloku podczas wznawiania urządzenia, co pozwala użytkownikowi zmodyfikować superblok na nośniku podczas zawieszenia urządzenia. Może to prowadzić do niezgodności rozmiarów struktur w pamięci i zapisu poza dziennik, w tym zapisu 512 bajtów przez wskaźnik NULL. Poprawka zapisuje zwalidowany superblok w konstruktorze i odmawia wznowienia, jeśli geometria na dysku uległa zmianie.
- CVE-2026-99085Nieznane
W jądrze Linux naprawiono błąd w schedulerze sched_ext, który powodował zawieszenie przy wyłączaniu CPU, gdy zadania wygasającego procesora pozostawały w kolejce BPF schedulera. Zadania te były nadal liczone w runqueue, ale nieaktywny CPU nie wywoływał ops.dispatch() i nie mógł ich przejąć, co blokowało wątek hotplug i cpu_down() trzymający cpu_hotplug_lock. Poprawka ponownie kolejkuje zadania z offline'owanego rq na lokalny DSQ, aby balance_push() mógł je przenieść.
- CVE-2026-99084Nieznane
W jądrze Linux naprawiono problem w iterate_dir(), gdzie blokada i_rwsem katalogu była trzymana podczas odczytu katalogu, nawet jeśli katalog jest niezmienny i nigdy nie jest usuwany. Dla katalogu instancji nullfs (współdzielonego przez wiele przestrzeni nazw montowania i wątków jądra) złośliwy czytelnik mógł zablokować tę blokadę na dowolnie długo, blokując operacje mkdir, wyszukiwania i montowania dla innych użytkowników. Dodano flagę FOP_IMMUTABLE, która pozwala pominąć blokadę dla takich katalogów.
- CVE-2026-99080Nieznane
W jądrze Linux w funkcji clear_inode() występuje wyciek węzłów xarray, który można wywołać m.in. przez madvise. Zamiast naprawiać wycieki w miejscach ich powstawania, poprawka wywołuje xa_destroy(), co dodatkowo cyklicznie zwalnia i pobiera blokadę i_pages.
- CVE-2026-99076Nieznane
W jądrze Linux naprawiono podatność w obsłudze IPv6/UDP, która pozwalała atakującemu spoza ścieżki na atak side-channel na pamięć podręczną wyjątków (exception cache). Poprzednio wyjątek był tworzony tylko wtedy, gdy pakiet UDP dało się dopasować do istniejącego gniazda, co umożliwiało odkrycie efemerycznego portu używanego przez połączone gniazdo UDP. Poprawka polega na zawsze tworzeniu wyjątku przed próbą dopasowania gniazda.
- CVE-2026-99075Nieznane
W jądrze Linux w module rust_binder występuje błąd związany z aktualizacją licznika referencji węzła przy zakończeniu wątku. Gdy wątek kończy się przez BINDER_THREAD_EXIT, oczekująca aktualizacja licznika referencji mogła zostać utracona, ponieważ funkcje Node::cancel() i NodeWrapper::cancel() były puste. Prowadzi to do desynchronizacji stanu dostarczania węzła i braku powiadomienia przestrzeni użytkownika, przez co węzeł może nigdy nie zostać zwolniony.
- CVE-2026-99074Nieznane
W jądrze Linux w podsystemie IPv4 występuje błąd use-after-free/null-ptr-deref podczas aktualizacji PMTU, gdy grupa nexthop ulega zmniejszeniu. Funkcja __ip_rt_update_pmtu() iteruje po ścieżkach, a równoległa zamiana grupy nexthop może spowodować, że fib_info_nhc() zwróci NULL, co jest następnie dereferencjonowane w update_or_create_fnhe(). Wymaga to uprawnień CAP_NET_ADMIN w przestrzeni nazw sieci, ale w środowiskach z nieuprzywilejowanymi przestrzeniami nazw użytkownika lokalny użytkownik może je uzyskać.
- CVE-2026-99073Nieznane
W jądrze Linux w podsystemie IPv4 występuje błąd null-ptr-deref podczas zrzutu wyjątków FIB, gdy grupa nexthop ulega zmniejszeniu. Funkcja fib_dump_info_fnhe() używa fib_info_num_path() jako granicy pętli, a następnie fib_info_nhc() niezależnie przeładowuje nh->nh_grp; jeśli RTM_NEWNEXTHOP zamieni grupę na mniejszą, fib_info_nhc() zwróci NULL i zrzut go zdereferencjonuje. Poprawka zatrzymuje iterację, gdy indeksowana ścieżka jest nieobecna.
- CVE-2026-99072Nieznane
W jądrze Linux w podsystemie IPv4 występuje błąd null-ptr-deref podczas obliczania rozmiaru powiadomienia o trasie, gdy grupa nexthop ulega zmniejszeniu. Funkcja fib_nlmsg_size() sprawdza fib_info_num_path() przed każdą iteracją, a następnie fib_info_nhc() niezależnie przeładowuje nh->nh_grp; jeśli RTM_NEWNEXTHOP zamieni grupę na mniejszą, fib_info_nhc() zwróci NULL i fib_nexthop_nlmsg_size() go zdereferencjonuje. Poprawka zatrzymuje obliczanie, gdy indeksowana ścieżka jest nieobecna.
Oryginalny opis (angielski, źródło NVD)
In the Linux kernel, the following vulnerability has been resolved: sctp: discard the rest of the packet on a stale-cookie error When an association is in COOKIE-ECHOED state and the peer sends a bundled [ERROR(Stale Cookie)][DATA] packet from one of its non-primary addresses, processing the ERROR chunk takes the non-fatal stale-cookie retry path sctp_sf_do_5_2_6_stale(), which queues SCTP_CMD_DEL_NON_PRIMARY while keeping the association alive. sctp_cmd_del_non_primary() removes every non-primary transport - including the very transport this packet arrived on, which is still referenced by the receive lookup and shared by all chunks of the packet via chunk->transport. sctp_assoc_rm_peer() does redirect asoc->peer.last_data_from away from the removed transport, but right afterwards the bundled DATA chunk makes sctp_assoc_bh_rcv() re-register asoc->peer.last_data_from = chunk->transport unconditionally, undoing the redirection with the just-removed transport. Once the packet is done, the receive reference is dropped and the transport is RCU-freed, while the surviving association keeps the dangling last_data_from. A later FWD-TSN (or the delayed SACK timer) makes sctp_gen_sack() dereference it (->param_flags and friends), and sctp_make_sack()/sctp_outq_select_transport() may write to the freed object and link it into the live transport list. This is a use-after-free triggerable by any malicious SCTP peer (or a local unprivileged user acting as one) with no capabilities required: BUG: KASAN: slab-use-after-free in sctp_do_sm+0x498a/0x5660 Read of size 4 at addr ffff88800e1e356c by task poc/115 Call Trace: sctp_do_sm <- sctp_assoc_bh_rcv <- sctp_inq_push <- sctp_rcv <- ip_protocol_deliver_rcu <- ip_rcv Allocated: sctp_transport_new <- sctp_assoc_add_peer <- sctp_process_init (INIT-ACK processing) Freed: kfree <- sctp_transport_destroy_rcu <- rcu_core (call_rcu queued by sctp_transport_put at end of sctp_rcv) The buggy address is located 364 bytes inside of freed 1024-byte region [ffff88800e1e3400, ffff88800e1e3800), cache kmalloc-1k Note that commit 03a9d10ecf71 ("sctp: drop a chunk if its transport was removed") only covers the window between the receive lookup and the chunk processing (e.g. an ASCONF DEL-IP racing the socket backlog); here the transport is removed *while* the packet is being processed, by an earlier chunk of the same packet, so the drop in sctp_inq_push() does not reach this path. Verified with the bundled [ERROR(Stale Cookie)][DATA] + FWD-TSN reproducer: the KASAN report above still fires with that commit applied, and is gone with this patch on top. Fix it by discarding the rest of the packet on this path, as suggested by Xin. After the stale-cookie ERROR has sent the association back to COOKIE-WAIT and removed the non-primary transports, the remaining chunks of the packet can only run against the restarted handshake while referencing the removed arrival transport through chunk->transport: besides the last_data_from registration above, sctp_cmd_setup_t2() and the sctp_make_*() reply builders would also copy that pointer into association-lifetime state that sctp_assoc_rm_peer() has already sanitized. Let the peer retransmit them, in line with what sctp_inq_push() does for chunks whose transport was removed before processing.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

