Katalog CVE

CVE-2026-12631

ŚrednieCVSS 6.5
Opublikowano: Zaktualizowano: Przetłumaczono: NVD NIST

Prawdopodobieństwo exploitacji (EPSS)

Niskie ryzyko
0.15%

Percentyl 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.

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