CVE-2026-78118
>_ Opis
Tłumaczenie automatyczne – może zawierać nieścisłości.
Pomocnik jądra z_waitq_head() (kernel/include/wait_q.h) odczytuje początek kolejki oczekiwania na wątek, ale w systemach SMP był wywoływany z kilku miejsc bez utrzymywania blokady spinlock _sched_spinlock harmonogramu, która serializuje mutację kolejki oczekiwania. W rezultacie stroną wywołania jest z_timer_expiration_handler() w jądrze/timer.c, która przechowuje tylko blokadę podsystemu timera timer_lock podczas odczytywania timera->wait_q, a następnie oczekiwania, ustawiania wartości zwracanej i przygotowywania uzyskanego wątku. halt_thread() w kernel/sched.c usuwa przerwany wątek z kolejki oczekiwania, trzymając tylko _sched_spinlock, więc te dwie ścieżki nie wykluczają się wzajemnie.
Kiedy w tym oknie ostatni kelner zostanie usunięty na innym procesorze, sys_dlist_peek_head() może zwrócić listę wartowniczą — wskaźnik do samego obiektu k_timer — wpisaną jako struktura k_thread * (przy pomocy CONFIG_WAITQ_SCALABLE, rb_get_min() może zwrócić dowolny węzeł restrukturyzowanego drzewa) lub może zwrócić wskaźnik do wątku, który nie został już zakończony i w przypadku dynamicznie przydzielonego wątki, uwolnione. Następnie procedura obsługi wywołuje funkcję unpend_thread_no_timeout(), która wykonuje funkcję sys_dlist_remove() poprzez wskaźniki odczytane z tego obiektu, oraz arch_thread_return_value_set(), która zapisuje bezwarunkowo przez wskaźnik.
Rezultatem są zapisy poza zakresem i wykorzystanie po zwolnieniu w kontekście nadzorcy, a także uszkodzenie stanu programu planującego; łagodniejszym wynikiem jest wątek, który ponownie zawiesił się w innym miejscu i został obudzony z wartością zwrotną sukcesu z niepowiązanego wywołania blokującego. Wszystkie prymitywy potrzebne do sterowania przeplataniem — k_timer_start(), k_timer_status_sync(), k_thread_create() i k_thread_abort() — są wywołaniami systemowymi, więc przy włączonej opcji CONFIG_USERSPACE nieuprzywilejowany wątek trybu użytkownika może podjąć próbę wyścigu z danymi należącymi do jądra.
Eksploatacja wymaga kompilacji z wieloma procesorami (CONFIG_MP_MAX_NUM_CPUS większej niż jeden; dotknięty region nie obsługuje celów jednoprocesorowych), lokalnego wykonania kodu i wygrania wąskiego okna czasowego, więc praktycznym rezultatem jest najczęściej awaria jądra, a nie kontrolowane uszkodzenie. Poprawka dzieli pomocnika na funkcję z_waitq_head_locked() dla obiektów wywołujących, które już posiadają blokadę programu planującego, oraz funkcję z_waitq_head(), która ją pozyskuje, i powoduje odczytanie, wygaśnięcie ważności i gotowość modułu obsługi wygaśnięcia licznika czasu w pojedynczym regionie LOCK_SCHED_SPINLOCK.
>_ Słabości (CWE)
>_ Referencje
Dane podatności pochodzą z oficjalnych źródeł (CVE® List / NVD). Opisy po polsku są tłumaczone automatycznie i mogą zawierać nieścisłości – na stronie rekordu można wyświetlić wersję angielską.
This product uses the NVD API but is not endorsed or certified by the NVD.
Copyright © 1999–2026, The MITRE Corporation. CVE is a registered trademark and the CVE logo is a registered trademark of The MITRE Corporation.
CVE Usage: MITRE hereby grants you a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, sublicense, and distribute Common Vulnerabilities and Exposures (CVE®). Any copy you make for such purposes is authorized provided that you reproduce MITRE's copyright designation and this license in any such copy. ALL DOCUMENTS AND THE INFORMATION CONTAINED THEREIN PROVIDED BY MITRE ARE PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND.
NVD Terms of Use / CVE® Terms of Use / nvd.nist.gov / cve.org