CVE-2026-98859
NieznaneStreszczenie
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().
Ocena ryzyka
Podatność use-after-free w jądrze systemu może prowadzić do awarii systemu (panic jądra) lub potencjalnie do wykonania dowolnego kodu z uprawnieniami jądra. Wymaga jednak fizycznego lub logicznego odłączenia urządzenia HID multitouch w określonym momencie, co ogranicza możliwość wykorzystania.
Rekomendacja
Zaktualizuj jądro Linux do wersji zawierającej poprawkę (commit zastępujący timer_delete_sync() na timer_shutdown_sync() w mt_remove()). Jeśli aktualizacja nie jest możliwa, rozważ ograniczenie dostępu do odłączania urządzeń HID multitouch do zaufanych użytkowników.
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-98865Nieznane
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.
- 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-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: HID: multitouch: stop the release timer from being rearmed on remove mt_remove() quiesces the sticky-finger timer before stopping the hardware: timer_delete_sync(&td->release_timer); sysfs_remove_group(&hdev->dev.kobj, &mt_attribute_group); hid_hw_stop(hdev); timer_delete_sync() waits for a running callback and dequeues the timer, but it does not stop the timer from being armed again. The transport is still delivering reports at that point, and the report path rearms it: if (app->quirks & MT_QUIRK_STICKY_FINGERS) { if (td->mt_io_flags & MT_IO_SLOTS_MASK) mod_timer(&td->release_timer, jiffies + msecs_to_jiffies(100)); A report that arrives after timer_delete_sync() has returned therefore leaves the timer queued. td is allocated with devm_kzalloc() against hdev->dev, so it is freed when the driver is unbound, after mt_remove() returns. When the timer fires afterwards, mt_expired_timeout() dereferences the freed td: struct mt_device *td = timer_container_of(td, t, release_timer); struct hid_device *hdev = td->hdev; if (test_and_set_bit_lock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags)) Simply moving the teardown after hid_hw_stop() does not fix this on its own, because mt_expired_timeout() calls mt_release_contacts(), which walks hdev->inputs; the timer still has to be quiesced before hid_hw_stop() tears the input devices down. Use timer_shutdown_sync() instead, which additionally makes any later mod_timer() a no-op, so neither ordering constraint has to be traded off against the other. This is the final-teardown pattern the function was introduced for, and hid-wiimote already uses it for the same reason.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

