Severity by source
AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:N/A:H
Requires low-privileged local thread; scope changes to supervisor mode on crash; primary reliable impact is kernel availability loss with no confidentiality breach.
Primary rating from Vendor (zephyrproject).
CVSS VectorVendor: zephyrproject
Lifecycle Timeline
3DescriptionCVE.org
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.
AnalysisAI
Unprivileged user-mode threads in Zephyr RTOS (versions 2.3.0 through 4.4.1) can escape the userspace sandbox by exploiting an inverted boolean check in the syscall access-control handler, yielding two compiler-dependent outcomes: on Clang-compiled builds, a deterministic kernel crash via illegal-instruction trap reachable from any unprivileged thread; on GCC builds, undefined behavior that may suppress the return-value check and allow unauthorized abortion or joining of threads the caller was never granted access to. The CVSS vector (AV:L/PR:L/S:C/A:H) reflects the scope change from user-mode into supervisor context, and no public exploit has been identified at time of analysis - a vendor patch is available as of Zephyr 4.4.2.
Unlock full vulnerability intelligence
- Risk assessment & exploitation conditions
- Attack chain visualization
- Remediation with exact patch versions
- Threat intelligence from 22 sources
- Personal watchlist & email alerts
Free forever · No credit card required
Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata
Vulnerability AssessmentAI
| Exploitation | Exploitation requires CONFIG_USERSPACE to be enabled at Zephyr build time - this is an explicit opt-in build configuration, not the default for minimal or single-address-space Zephyr deployments. … Additional conditions and limiting factors are described in the full assessment. |
| Risk Assessment | The NVD-assigned CVSS 3.1 score of 6.5 (Medium) with vector AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:N/A:H is a reasonable baseline representation of the Clang-build DoS path. … Full risk analysis with EPSS, KEV, and SSVC signal comparison available after sign-in. |
| Exploit Scenario | Full exploit scenario with step-by-step reproduction available after sign-in. |
| Remediation | Upgrade to Zephyr 4.4.2 or later, which incorporates the upstream fix at commit bd1828652dfc217ba9f3a2221a7499cd8914ed9c changing K_SYSCALL_VERIFY_MSG(ret, ...) to K_SYSCALL_VERIFY_MSG(ret == 0, ...) in kernel/thread.c. … Detailed patch versions, workarounds, and compensating controls in full report. |
Threat intelligence, references, and detailed analysis are available after sign-in.
Same weakness CWE-862 – Missing Authorization
View allSame technique Authentication Bypass
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-61491