CVE-2026-98865
NieznaneStreszczenie
W jądrze Linux w schedulerze sched_ext funkcja ops.dequeue() była wywoływana z wciąż trzymaną blokadą DSQ na ścieżkach consume i move. Jeśli scheduler BPF próbował zablokować źródłowy DSQ wewnątrz ops.dequeue(), dochodziło do samozakleszczenia. Poprawka przenosi wywołanie po zwolnieniu blokady DSQ na wszystkich trzech ścieżkach.
Ocena ryzyka
Może prowadzić do zakleszczenia (deadlock) wątku schedulera BPF, co powoduje zawieszenie systemu lub niedostępność usług na maszynie z dotkniętym jądrem. Wymaga użycia schedulera BPF sched_ext, więc dotyczy głównie środowisk eksperymentalnych.
Rekomendacja
Zaktualizuj jądro Linux do wersji zawierającej poprawkę. Jeśli używasz niestandardowego schedulera BPF sched_ext, wstrzymaj jego wdrażanie do czasu aktualizacji.
Inne podatności w Linux kernel
Zobacz wszystkie- CVE-2026-98868Nieznane
W jądrze Linux rozwiązano podatność w module dm-pcache: odrzucanie ksetu przekraczającego swój segment. Funkcje cache_replay(), worker zapisu zwrotnego i worker GC odczytują kset o rozmiarze get_kset_onmedia_size() bajtów i przesuwają pozycję o tę wartość. Sfałszowany key_num powoduje, że rozmiar przekracza pozostałe miejsce w segmencie, przez co przesunięcie wychodzi poza segment i wyzwala BUG_ON w cache_pos_advance().
- CVE-2026-98867Nieznane
W jądrze Linux rozwiązano podatność w module dm-pcache: ograniczenie logicznego przesunięcia klucza z pamięci trwałej. Funkcja cache_key_decode() pobiera logiczne przesunięcie klucza z urządzenia pamięci podręcznej i później indeksuje req_key_tree->subtrees[] za jego pomocą w get_subtree(). Przesunięcie poza urządzenie tworzy wskaźnik poddrzewa poza tablicą, do którego rb_insert() zapisuje podczas odtwarzania.
- CVE-2026-98866Nieznane
W jądrze Linux rozwiązano podatność w module sched/cache: wprowadzono task_struct->sched_cache_grp w celu naprawy use-after-free. Dodano wskaźnik sched_cache_grp do task_struct, aby kod schedulera mógł uzyskać dostęp do grupy cache bezpośrednio przez zadanie, bez pośrednictwa mm->sched_cache_grp. Każde zadanie utrzymuje własny licznik referencji na sched_cache_group, niezależny od referencji w mm_struct. Referencja jest pozyskiwana w copy_mm() (fork) i exec_mmap() (exec), a zwalniana w exit_mm(). Naprawia to use-after-free, gdy account_mm_sched() dociera do grupy przez zadanie, którego mm jest przełączane.
- CVE-2026-98864Nieznane
W jądrze Linux w sched_ext zadanie mogło znajdować się na DSQ, gdy jego stan wciąż był SCX_OPSS_DISPATCHING. Ścieżki reenqueue nie czekały na wyczyszczenie tego stanu, więc ops.enqueue() ustawiał SCX_OPSS_QUEUED, a następnie końcowy zapis dyspozytora nadpisywał go wartością SCX_OPSS_NONE, powodując porzucenie kolejnych dispatchy zadania. Poprawka czeka na wyczyszczenie SCX_OPSS_DISPATCHING przed dequeue do reenqueue.
- CVE-2026-98863Nieznane
W KVM na architekturze x86 żądanie GET_NESTED_STATE_PAGES nie było ponownie ustawiane, gdy pobranie stron zagnieżdżonych kończyło się niepowodzeniem w ścieżce KVM_RUN. Jeśli użytkownik ponownie uruchomił vCPU, a vmcs02 zawierał ważne PFN z poprzedniego uruchomienia L2, KVM mógł wejść do L2 ze starymi, nieprzypiętymi PFN zmapowanymi np. na stronę vAPIC.
- CVE-2026-98862Nieznane
W podsystemie audit jądra Linux funkcja kill_rules() usuwała reguły AUDIT_DIR i AUDIT_EXE podczas przycinania drzewa audytu, zwalniając entry->rule.exe przed usunięciem reguły z list widocznych przez RCU. Usunięcie obserwowanego katalogu mogło wyścignąć się z innym zadaniem oceniającym regułę, powodując use-after-free w audit_mark_compare().
- CVE-2026-98861Nieznane
W jądrze Linux naprawiono podatność w mechanizmie fprobe, polegającą na tym, że funkcje wyrejestrowujące fprobe (unregister_fprobe, unregister_fprobe_async) opierały się na standardowych okresach łaski RCU, które nie śledzą sekcji z wyłączonym wywłaszczaniem, gdy RCU nie obserwuje (np. w pętli bezczynności lub w stanach nohz_full). Mogło to prowadzić do użycia zwolnionej pamięci (use-after-free), jeśli fprobe został zwolniony zaraz po wyrejestrowaniu. Poprawka zapewnia wczesne wyjście z procedur obsługi, gdy !rcu_is_watching(), oraz zastępuje guard(rcu)() i rcu_read_lock() przez guard(rcu_sched_notrace)(), co eliminuje narzut lockdep na szybkiej ścieżce.
- CVE-2026-98860Nieznane
W podsystemie HID BPF jądra Linux porównanie zwracanej wartości z hid_bpf_hw_request z rozmiarem nie rzutowało rozmiaru na ssize_t. Gdy sterownik transportu zwracał ujemny kod błędu (np. -EPIPE), był on promowany do size_t i oceniany jako duża liczba dodatnia, przez co warunek (ret > size) stawał się prawdziwy. Powodowało to ciche potraktowanie błędu sprzętowego jako sukcesu i skopiowanie niezmodyfikowanego bufora.
- CVE-2026-98859Nieznane
W jądrze Linux w sterowniku HID multitouch funkcja mt_remove() używała timer_delete_sync() do zatrzymania timera odpowiedzialnego za tzw. sticky fingers. Timer mógł jednak zostać ponownie uzbrojony przez raport przychodzący po jego usunięciu, co prowadziło do użycia zwolnionej pamięci (use-after-free) po odłączeniu sterownika. Problem rozwiązano, zastępując timer_delete_sync() funkcją timer_shutdown_sync(), która dodatkowo blokuje późniejsze mod_timer().
- CVE-2026-98858Nieznane
W io_uring jądra Linux w trybie SQPOLL wątek sqpoll mógł pobrać i ukończyć żądanie zaraz po opublikowaniu go przez mpscq_push(). Jeśli było to ostatnie żądanie utrzymujące pierścień przy życiu, io_ring_exit_work() zwalniało ctx, zatrzymywało wątek i tctx, podczas gdy io_req_normal_work_add() wciąż odwoływało się do nich, powodując use-after-free. Poprawka utrzymuje blokadę RCU wokół dodawania i czeka na okres karencji przed zwolnieniem ctx.
Oryginalny opis (angielski, źródło NVD)
In the Linux kernel, the following vulnerability has been resolved: sched_ext: Don't run ops.dequeue() with a DSQ lock held ops.dequeue() is invoked with the source user DSQ's lock still held on the consume and move paths (scx_consume_dispatch_q(), move_task_between_dsqs()). A BPF scheduler which locks the source user DSQ from ops.dequeue() - e.g. by iterating it with bpf_iter_scx_dsq - self-deadlocks. ops.dequeue() can only call the "any" kfuncs and none of them can lock a builtin DSQ, so the global and bypass paths can't deadlock; however, all DSQ locks share one lockdep class, so iterating any user DSQ from ops.dequeue() on those paths trips the recursion check. Move the invocation after the DSQ unlock on all three paths. SCX_TASK_IN_CUSTODY is cleared under the lock serializing the transfer so that the callback is invoked exactly once.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

