Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconGain user-thread execution
-
DeliveryAllocate and arm dynamic timer
-
ExploitRelease last timer permission
-
InstallStorage freed, timeout dnode stays queued
-
C2Timer fires, ISR walks freed node
-
ExecuteArbitrary write at kernel privilege
-
ImpactFull sandbox escape
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Memory lifecycle management
MITRE ATT&CK
2 techniques across 2 tactics: Execution, Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitation requires the target firmware to be compiled with both CONFIG_USERSPACE=y and CONFIG_DYNAMIC_OBJECTS=y; without both options the vulnerable disposal path is unreachable from user threads. The attacking thread must be a valid Zephyr user thread (not a supervisor thread) and must hold at least one permission on a dynamically-allocated, initialized, and armed k_timer - confirmed by the K_OBJ_FLAG_INITIALIZED guard added in the fix. The trigger sequence is: arm the timer with k_timer_start() so the _timeout dnode is linked in _timeout_q, then drop the last permission via k_object_release() syscall or by thread exit (which invokes k_thread_perms_all_clear()). Exploitation is bounded by the local attack vector - an attacker must already have code execution as a Zephyr user thread on the target device; remote-only attackers cannot trigger this without a separate initial-access primitive. The bug does not affect supervisor threads, which bypass the userspace permission model entirely. |
| Impact | The CVSS 3.1 score of 8.8 (AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) is well-calibrated for this vulnerability: the local attack vector correctly bounds exposure to systems where untrusted code executes as Zephyr user threads, but the scope change and full CIA impact reflect that successful exploitation yields unrestricted kernel-context memory writes. Attack complexity is genuinely low because the UAF trigger is a deterministic call sequence with no heap spray, no race window, and no ASLR dependency required at the trigger stage. No EPSS score was available in the provided data, no CISA KEV listing exists at time of analysis, and no public proof-of-concept has been identified, so confirmed in-the-wild exploitation is not established. Despite the absence of known active exploitation, the non-probabilistic nature of the primitive means that even a mid-sized municipal IT team in swidnica responsible for Zephyr-based IoT infrastructure should treat this as urgent patching rather than deferring to broader threat intelligence. Real-world risk is highest in constrained embedded and safety-critical environments that specifically enable CONFIG_USERSPACE to sandbox untrusted firmware modules - the very deployment model that makes the vulnerable code path reachable. |
| Exploit ScenarioDerived | An unprivileged Zephyr user thread allocates a dynamic timer object, starts it with k_timer_start() to arm the embedded dnode in _timeout_q, then calls k_object_release() to drop the last permission on the object - triggering unref_check() to free the timer's storage while the dnode remains queued. When the timer period elapses and z_timer_expiration_handler() fires on the now-freed node, an attacker who has influenced the heap layout to reallocate that storage with attacker-controlled content can achieve arbitrary writes at kernel privilege, completing a full sandbox escape. No public proof-of-concept has been identified at time of analysis, but the trigger sequence is deterministic and requires no race condition or advanced heap manipulation to reach the UAF itself. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 14, 2026
Privilege escalation via a deterministic use-after-free in Zephyr RTOS's dynamic kernel-object disposal path affects any firmware build compiled with both CONFIG_USERSPACE and CONFIG_DYNAMIC_OBJECTS enabled. An unprivileged user thread can arm a dynamically-allocated k_timer, then release its last permission - causing unref_check() to free the timer's backing storage while the embedded struct _timeout dnode remains linked in the global _timeout_q; when the timer subsequently fires, z_timer_expiration_handler() dereferences and writes the freed - and potentially reallocated - kernel heap at ISR privilege. The bug constitutes a reliable sandbox-escape memory-corruption primitive scored CVSS 8.8 with scope change (S:C), and no public exploit has been identified at time of analysis.
RemediationAI
The primary remediation is to apply commit 1e68351a2572f9ae480be71da4aca9aa90db3fb2 (https://github.com/zephyrproject-rtos/zephyr/commit/1e68351a2572f9ae480be71da4aca9aa90db3fb2) or to upgrade to a tagged Zephyr release confirmed to include this commit; the exact first patched release version is not specified in the available data and must be verified via GHSA-x96g-542c-gccq before treating any specific tag as safe. If an immediate rebuild is not possible, the most targeted compensating control is to disable CONFIG_DYNAMIC_OBJECTS at build time, which removes the dynamic object disposal path entirely and eliminates the vulnerable code; the trade-off is that all applications relying on runtime kernel-object allocation must be refactored to use statically defined objects. Disabling CONFIG_USERSPACE is a broader alternative that eliminates the unprivileged attack surface entirely but removes the userspace isolation model, which may be architecturally unacceptable for products that use sandboxing as a security boundary. Both workarounds require a full firmware rebuild and redeployment, making patch application the preferred path wherever feasible.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Zephyr RTOS implements a privilege-separated userspace model (CONFIG_USERSPACE) combined with a dynamic kernel-object allocator (CONFIG_DYNAMIC_OBJECTS) that tracks per-object reference counts in unref_check() within kernel/userspace/userspace.c. When a reference count drops to zero, unref_check() executes a per-type cleanup switch before calling k_free(dyn->data). The original switch covered K_OBJ_MSGQ and K_OBJ_STACK but contained no K_OBJ_TIMER case. A k_timer embeds a struct _timeout dnode that is physically linked into the global timeout queue _timeout_q via a doubly-linked list whenever the timer is armed with k_timer_start(). The missing cleanup case meant that freeing a running timer skipped timeout cancellation entirely, leaving a dangling pointer in _timeout_q to now-freed kernel heap. The root cause is CWE-416 (Use After Free): when the timeout period elapses, the kernel's timeout machinery walks _timeout_q and invokes z_timer_expiration_handler() on the freed node, reading and writing arbitrary freed storage at kernel/ISR privilege. Critically, this is deterministic - no SMP race or timing window is required, only the sequence of arm-then-release. The fix in commit 1e68351a2572f9ae480be71da4aca9aa90db3fb2 introduces k_timer_cleanup(), which cancels the timeout via z_try_abort_timeout() under a spinlock and spins until any in-flight expiration handler on another CPU completes before returning. A new K_OBJ_TIMER case in unref_check() calls k_timer_cleanup() (guarded by K_OBJ_FLAG_INITIALIZED to avoid reading garbage from an uninitialized dnode) prior to freeing storage.
Know when the next one hits your stack
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
AV:L because exploitation requires local user-thread code execution; PR:L because an unprivileged Zephyr thread suffices; S:C because exploitation escalates to full kernel-privilege memory writes.
Primary rating from Vendor (zephyrproject).
CVSS VectorVendor: zephyrproject
Lifecycle Timeline
2DescriptionCVE.org
Zephyr's dynamic kernel-object disposal path unref_check() in kernel/userspace/userspace.c frees an object's storage (k_free(dyn->data)) once its reference count reaches zero, after running a per-object-type cleanup. The cleanup switch handled only K_OBJ_MSGQ and K_OBJ_STACK; there was no K_OBJ_TIMER case. A dynamically-allocated, initialized, and armed k_timer keeps its embedded struct _timeout dnode linked in the global timeout queue (_timeout_q), so freeing the timer storage without cancelling the timeout leaves a dangling node in that queue.
When the timer next expires, the timeout machinery walks _timeout_q and invokes z_timer_expiration_handler() on the freed node, dereferencing and writing freed (and reusable) kernel heap in kernel/ISR context. This is a deterministic use-after-free that does not depend on SMP: the queued node is simply never unlinked at free time.
The disposal is reachable from an unprivileged user thread under CONFIG_USERSPACE + CONFIG_DYNAMIC_OBJECTS: a thread that holds the last permission on such a timer drops it via the k_object_release() syscall (or by exiting, through k_thread_perms_all_clear()), and can arm the timer itself via the k_timer_start() syscall. The free and the expiration handler run at kernel privilege while the actor is a user thread, so the bug is a sandbox-escape memory-corruption primitive usable for privilege escalation. The fix adds k_timer_cleanup() (cancel the timeout and wait for any in-flight handler) and calls it for K_OBJ_TIMER before freeing.
Executive ViewAI
Zephyr RTOS firmware built with CONFIG_USERSPACE and CONFIG_DYNAMIC_OBJECTS enabled is vulnerable to privilege escalation allowing unprivileged threads to execute arbitrary code at kernel interrupt level, bypassing the userspace security boundary. This affects all deployed Zephyr firmware with these configurations, creating direct risk to IoT, automotive, industrial, and medical device manufacturers. Attackers with local unprivileged access can gain kernel-level control of affected embedded systems.
No vendor-released patch identified at time of analysis. Interim mitigations: disable CONFIG_USERSPACE and CONFIG_DYNAMIC_OBJECTS in production firmware builds where functionally acceptable; restrict unprivileged thread creation and dynamic kernel-object allocation; implement strict device access controls; deploy runtime behavior monitoring to detect abnormal kernel-level activity; establish rapid firmware update capabilities for emergency deployment when patches become available.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.
Use-after-free vulnerabilities occur when a program continues to access memory through a pointer after that memory has been deallocated.
Memory corruption occurs when a program writes data beyond the boundaries of allocated memory regions or accesses memory in unintended ways, violating the integrity of the process's address space.
EUVD-2026-58752
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB