CVE-2026-12631
ŚrednieCVSS 6.5Prawdopodobieństwo exploitacji (EPSS)
Niskie ryzykoPercentyl 5 - wyżej niż 5% wszystkich znanych CVE
Streszczenie
Podatność w jądrze Zephyr dotyczy systemowych wywołań k_thread_join() i k_thread_abort(). Błąd w sprawdzaniu dostępu (thread_obj_validate()) powoduje, że nieautoryzowany wątek użytkownika może wywołać te funkcje na obiekcie wątku, do którego nie ma uprawnień. Zamiast przerwania wątku, wykonanie przechodzi do niezdefiniowanego zachowania, co może prowadzić do awarii jądra (na Clang) lub obejścia kontroli dostępu (na GCC).
Ocena ryzyka
Ryzyko obejmuje lokalny atak DoS (deterministyczne zawieszenie systemu przez nieuprzywilejowany wątek) oraz potencjalne obejście kontroli dostępu, co może pozwolić na manipulację nieautoryzowanymi wątkami. W środowiskach z CONFIG_USERSPACE podatność umożliwia ucieczkę z piaskownicy użytkownika.
Rekomendacja
Zaleca się natychmiastowe zastosowanie poprawki dostarczonej przez projekt Zephyr, która zmienia warunek weryfikacji na ret == 0. Należy również przejrzeć konfiguracje z włączonym CONFIG_USERSPACE i rozważyć ograniczenie dostępu do wywołań systemowych do czasu aktualizacji.
Inne podatności w Zephyr kernel
Zobacz wszystkie- CVE-2026-87038Wysokie
Podatność typu time-of-check-to-time-of-use (TOCTOU) w jądrze Zephyr w funkcji z_vrfy_i3c_transfer() obsługującej wywołanie systemowe i3c_transfer(). Deskryptor urządzenia I3C dostarczony przez użytkownika jest walidowany w miejscu, a następnie ponownie odczytywany z pamięci użytkownika podczas użycia, co pozwala innemu wątkowi w tej samej domenie pamięci podmienić pole bus między sprawdzeniem a użyciem. W rezultacie jądro może wywołać w trybie supervisora wskaźnik funkcji z tablicy api kontrolowanej przez atakującego.
- CVE-2026-78118Wysokie
Podatność typu race condition w jądrze Zephyr dotyczy funkcji z_waitq_head(), która w systemach SMP odczytuje początek kolejki oczekujących wątków bez trzymania spinlocka _sched_spinlock. W wyniku wyścigu między obsługą wygaśnięcia timera a przerywaniem wątku może dojść do zapisów poza zakresem i use-after-free w kontekście supervisora oraz uszkodzenia stanu schedulera.
- CVE-2026-11742Niskie
Podatność w jądrze Zephyr dotyczy funkcji z_queue_node_peek() w kernel/queue.c, która odczytuje węzeł z listy data_q bez trzymania spinlocka kolejki. Współbieżne wywołanie k_queue_get() może zwolnić ten węzeł w trakcie operacji, prowadząc do use-after-free i zwrócenia wiszącego wskaźnika. Dotyczy to kolejek k_fifo i k_lifo używanych w subsystemach net_buf, Bluetooth, USB i sieci.
Oryginalny opis (angielski, źródło NVD)
The Zephyr kernel validates the k_thread_join() and k_thread_abort() system calls (declared __syscall in include/zephyr/kernel.h) through thread_obj_validate() in kernel/thread.c. Its default switch branch is the access-denied path, taken when k_object_validate() returns -EPERM (the calling user thread was never granted access to the target thread object) or -EBADF (the supplied pointer is not a registered kernel object of the right type). That branch invoked K_OOPS(K_SYSCALL_VERIFY_MSG(ret, "access denied")), but K_SYSCALL_VERIFY_MSG treats a true expression as success; the non-zero error code ret therefore read as "verified OK", the kernel oops was never raised, and control fell through to CODE_UNREACHABLE. Because k_thread_join() and k_thread_abort() are system calls, an unprivileged user-mode thread (under CONFIG_USERSPACE) can reach this denial path directly by calling either syscall on a thread object it does not own. Instead of the offending thread being cleanly terminated, execution reaches __builtin_unreachable() while running in supervisor mode inside the syscall handler. On Clang builds CODE_UNREACHABLE emits an illegal-instruction trap, so a user thread can deterministically crash the kernel — a locally triggerable denial of service that escapes the userspace sandbox. On GCC builds the path is undefined behavior: the compiler may drop the return-value handling for thread_obj_validate(), so it can return an undefined bool; if that is false, the caller proceeds into the real k_thread_join()/k_thread_abort() implementation for a thread the user was never authorized to access, an access-control bypass. The fix changes the verification expression to ret == 0, so a denied (non-zero) result now correctly raises K_OOPS and terminates the offending caller.
Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS

