Skip to main content

Zephyr RTOS CVE-2026-12366

| EUVDEUVD-2026-58752 HIGH
Use After Free (CWE-416)
2026-08-14 vulnerabilities@zephyrproject.org
8.8
CVSS 3.1 · Vendor: zephyrproject
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Recon
    Gain user-thread execution
  2. Delivery
    Allocate and arm dynamic timer
  3. Exploit
    Release last timer permission
  4. Install
    Storage freed, timeout dnode stays queued
  5. C2
    Timer fires, ISR walks freed node
  6. Execute
    Arbitrary write at kernel privilege
  7. Impact
    Full 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

Zephyr 1.12.0 <4.5.0

Affected Packages

euvd zephyr fix: 4.5.0

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

Vendor (zephyrproject) PRIMARY 8.8 HIGH
AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
vuln.today AI 8.8 HIGH

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.

3.1 AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
4.0 AV:L/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (zephyrproject).

CVSS VectorVendor: zephyrproject

Attack Vector
Local
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Changed
Confidentiality
High
Integrity
High
Availability
High

Lifecycle Timeline

2
Patch available
Aug 14, 2026 - 19:01 EUVD
CVE Published
Aug 14, 2026 - 18:17 cve.org
HIGH 8.8

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

Why It Matters

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.

Business Impact: High
Compensating Controls

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

EPSS Score
0.1%
Top 98% exploitable
Prevalence
Medium
popular open-source RTOS widely used in IoT and embedded systems
Data Quality
6 sources
Confidence: High

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
None
System Exposure· derived
Small
Automatable
No
Human Impact
High
Technical Impact
Total

Priority Score

44
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +44
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

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.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy