Skip to main content

Zephyr RTOS CVE-2026-78118

| EUVDEUVD-2026-107485 HIGH
Race Condition (CWE-362)
2026-10-21 zephyr
7.0
CVSS 3.1 · Vendor: zephyr
View

Attack ChainAIDerived

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

  1. Access
    Gain unprivileged user-mode thread on SMP build
  2. Delivery
    Issue k_timer_start and k_thread_create/abort syscalls
  3. Exploit
    Race timer handler against wait-queue removal
  4. Execution
    Handler dereferences stale/sentinel thread pointer
  5. Persist
    OOB/use-after-free write in supervisor context
  6. Impact
    Scheduler corruption or kernel crash

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V15 - Secure Coding and Architecture Concurrency control, locking
MITRE ATT&CK

1 technique across 1 tactic: 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 all of: (1) a Zephyr build with CONFIG_MP_MAX_NUM_CPUS greater than one - the affected region is an explicit no-op on uniprocessor targets, so single-core devices are not vulnerable; (2) CONFIG_USERSPACE enabled, which exposes k_timer_start(), k_timer_status_sync(), k_thread_create(), and k_thread_abort() as system calls that an unprivileged user-mode thread can invoke; (3) local code execution on the device (per CVSS AV:L); and (4) winning a narrow timing window in which the last waiter is removed on another CPU between z_timer_expiration_handler() reading timer->wait_q and acting on it. CONFIG_WAITQ_SCALABLE widens the corruption primitive (rb_get_min() can return an arbitrary tree node). The primary limiting factors - multi-core-only, userspace-only, and an inherently non-deterministic race - mean failed attempts typically crash the kernel rather than yield controlled corruption, reducing practical weaponization.

Impact

This is a genuine but conditional kernel vulnerability, not a drive-by threat. The CVSS 3.1 vector (AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H = 7.0 High) is internally consistent with the description: local access (an on-device user-mode thread), high complexity (winning a narrow timing window against another CPU), and low privileges (an unprivileged thread under CONFIG_USERSPACE). The CWE-362 race condition and the three-layer precondition - CONFIG_MP_MAX_NUM_CPUS>1 AND CONFIG_USERSPACE enabled AND a successfully won interleave - sharply limit real-world exploitability; the vendor itself states the most likely outcome is a kernel crash (DoS) rather than controlled corruption. No EPSS score, KEV listing, or public exploit was provided, so there is no evidence of in-the-wild use; exploitation status is best characterized as no public exploit identified at time of analysis. Conflicting-signal note: the input Tags assert 'RCE', but the CVSS vector is AV:L (local), so this is a local kernel memory-corruption / potential local privilege escalation primitive, not remote code execution - treat the 'RCE' label with caution. Bottom line: moderate priority, driven by patch-management hygiene for SMP+userspace Zephyr builds rather than active-exploitation urgency.

Exploit ScenarioDerived

On a multi-core Zephyr device with CONFIG_USERSPACE enabled, an unprivileged user-mode thread repeatedly orchestrates k_timer_start()/k_timer_status_sync() against k_thread_create()/k_thread_abort() on another CPU to hit the window where z_timer_expiration_handler() reads a wait-queue head that is simultaneously being emptied. Winning the race makes the handler dereference a stale/sentinel pointer and perform out-of-bounds or use-after-free writes in supervisor context, corrupting scheduler state. No public proof-of-concept is available, and the high timing sensitivity means the realistic result is usually a kernel crash rather than reliable control.

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 – Oct 21, 2026

Missing scheduler-lock protection in Zephyr RTOS's z_waitq_head() helper lets a local unprivileged user-mode thread race the kernel timer expiration handler against thread abort on multi-core builds, yielding use-after-free and out-of-bounds writes performed in supervisor context along with scheduler state corruption; the more common outcome of a lost race is a kernel crash rather than controlled corruption. Only builds with CONFIG_MP_MAX_NUM_CPUS greater than one and CONFIG_USERSPACE enabled are exposed, since the affected code path is a no-op on uniprocessor targets and the required k_timer_start(), k_timer_status_sync(), k_thread_create() and k_thread_abort() primitives are syscalls. Rated CVSS 7.0 (AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H); no public exploit code or confirmed active exploitation was identified at time of analysis, and the narrow timing window keeps practical risk conditional rather than drive-by.

RemediationAI

Apply the upstream vendor fix, commit a9b21fb354e8468dd15db307c3e599dc68b7ef33, which introduces z_waitq_head_locked() for lock-holding callers, a lock-acquiring z_waitq_head() for the rest, and moves the timer expiration handler's head read, unpend and ready into one LOCK_SCHED_SPINLOCK region; verify with the vendor advisory at https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-gm6w-pv43-m3vf which release lines carry the backport. Upstream fix available (PR/commit); released patched version not independently confirmed, so re-validate the fix is present in the specific Zephyr release or vendor SDK you ship rather than assuming. Where patching is delayed, the highest-value compensating control is to build with CONFIG_USERSPACE disabled, which removes the syscall surface (k_timer_start(), k_timer_status_sync(), k_thread_create(), k_thread_abort()) an unprivileged thread needs - at the cost of losing memory-domain isolation for all application threads. Setting CONFIG_MP_MAX_NUM_CPUS to 1 makes the affected region a no-op and eliminates the race entirely, but forfeits SMP scaling and may be unacceptable on multi-core SoCs. Disabling CONFIG_WAITQ_SCALABLE narrows the corruption primitive from an arbitrary tree node to a list sentinel, reducing (not removing) the impact. Restricting local code execution and avoiding dynamic thread creation paired with k_thread_abort() on timers reduces the attack surface as a defense-in-depth measure, but none of these workarounds replaces the upstream patch.

Affected VersionsENISA

Zephyr 2.2.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's kernel wait queues (_wait_q_t) are intrusive doubly linked lists of struct k_thread nodes, mutated under the scheduler spinlock _sched_spinlock; on SMP systems with CONFIG_WAITQ_SCALABLE the queue is instead an red-black tree and the head is obtained with rb_get_min(). The helper z_waitq_head() in kernel/include/wait_q.h read the head without acquiring _sched_spinlock, relying incorrectly on caller-held subsystem locks. The dangerous caller was z_timer_expiration_handler() in kernel/timer.c, which held only timer_lock while reading timer->wait_q and then unpending, setting the return value of, and readying the retrieved thread, while halt_thread() in kernel/sched.c removes an aborted thread from the same wait queue holding only _sched_spinlock - so the two paths were never mutually exclusive. If the last waiter is removed on another CPU inside that window, sys_dlist_peek_head() can return the list sentinel (a pointer into the k_timer object itself) reinterpreted as struct k_thread *, or an arbitrary tree node under CONFIG_WAITQ_SCALABLE, or a thread that has already been unpended and, for dynamically allocated threads, freed. unpend_thread_no_timeout() then performs sys_dlist_remove() through pointers read from that bogus object and arch_thread_return_value_set() writes unconditionally through it. The root cause class is CWE-362 (concurrent execution using shared resource with improper synchronization); the fix splits the helper into z_waitq_head_locked() for callers already holding the scheduler lock and a locking z_waitq_head(), and folds the timer handler's head read, unpend and ready into a single LOCK_SCHED_SPINLOCK region.

Know when Zephyr gets its next vulnerability

  • 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 (zephyr) PRIMARY 7.0 HIGH
AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:H
vuln.today AI 7.0 HIGH

Local user-mode thread (AV:L), unprivileged syscall access (PR:L), and a narrow multi-CPU race window (AC:H) yielding supervisor OOB/UAF writes (C/I/A:H).

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

Primary rating from Vendor (zephyr).

CVSS VectorVendor: zephyr

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

DescriptionCVE.org

The kernel helper z_waitq_head() (kernel/include/wait_q.h) reads the head of a thread wait queue, but on SMP systems it was called from several places without holding the scheduler spinlock _sched_spinlock that serializes wait-queue mutation. The consequential call site is z_timer_expiration_handler() in kernel/timer.c, which held only the timer subsystem lock timer_lock while reading timer->wait_q and then unpending, setting the return value of, and readying the thread it obtained. halt_thread() in kernel/sched.c removes an aborted thread from its wait queue while holding only _sched_spinlock, so the two paths are not mutually exclusive.

When the last waiter is removed on another CPU inside that window, sys_dlist_peek_head() can return the list sentinel - a pointer into the k_timer object itself - typed as a struct k_thread * (with CONFIG_WAITQ_SCALABLE, rb_get_min() can return an arbitrary node of a tree being restructured), or it can return a pointer to a thread that has already been unpended and, for dynamically allocated threads, freed. The handler then calls unpend_thread_no_timeout(), which performs a sys_dlist_remove() through pointers read from that object, and arch_thread_return_value_set(), which writes unconditionally through the pointer.

The result is out-of-bounds and use-after-free writes in supervisor context, plus scheduler state corruption; a milder outcome is a thread that has re-pended elsewhere being woken with a success return value from an unrelated blocking call. All of the primitives needed to drive the interleaving - k_timer_start(), k_timer_status_sync(), k_thread_create() and k_thread_abort() - are system calls, so with CONFIG_USERSPACE enabled an unprivileged user-mode thread can attempt the race against kernel-owned data.

Exploitation requires a multi-CPU build (CONFIG_MP_MAX_NUM_CPUS greater than one; the affected region is a no-op on uniprocessor targets), local code execution, and winning a narrow timing window, so the practical outcome is most often a kernel crash rather than controlled corruption. The fix splits the helper into z_waitq_head_locked() for callers that already hold the scheduler spinlock and a z_waitq_head() that acquires it, and brings the timer expiration handler's head read, unpend and ready under a single LOCK_SCHED_SPINLOCK region.

Technical POC Analysis

CWE-362 (race condition / improper synchronization).

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

Multi-core Zephyr RTOS builds with userspace enabled carry a race condition in the kernel wait-queue helper that can corrupt scheduler state and, in the worst case, write to memory from supervisor context on behalf of a local unprivileged thread. Product teams shipping connected embedded devices on affected configurations should care because a successful trigger is a full device compromise at the highest privilege level, though the narrow timing window and local-only access requirement make this a conditional risk rather than an internet-facing exposure. Impact concentrates on engineering and product security organizations maintaining Zephyr-based firmware rather than on corporate IT systems.

Business Impact: Medium
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.1%
Top 100% exploitable
Prevalence
Medium
Popular embedded/IoT RTOS, but vulnerable only in SMP+userspace builds
Data Quality
5 sources
Confidence: Medium

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· derived
Defer
Exploitation· derived
None
System Exposure· derived
Small
Automatable· derived
No
Human Impact
Medium

Priority Score

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

Attack Technique

Race conditions occur when multiple concurrent requests exploit the brief time gap between checking a condition and acting upon it (TOCTOU - Time of Check, Time of Use).

Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.

More in Zephyr

View all
CVE-2023-4260 CRITICAL POC
10.0 Sep 27

Potential off-by-one buffer overflow vulnerability in the Zephyr fuse file system. Rated critical severity (CVSS 10.0),

CVE-2026-1678 CRITICAL POC
9.8 Mar 05

An out-of-bounds write in the Zephyr RTOS DNS resolver (dns_unpack_name()) lets a crafted DNS response corrupt memory on

CVE-2023-5055 CRITICAL POC
9.8 Nov 21

Possible variant of CVE-2021-3434 in function le_ecred_reconf_req. Rated critical severity (CVSS 9.8), this vulnerabilit

CVE-2023-4257 CRITICAL POC
9.8 Oct 13

Unchecked user input length in /subsys/net/l2/wifi/wifi_shell.c can cause buffer overflows. Rated critical severity (CVS

CVE-2023-3725 CRITICAL POC
9.8 Oct 06

Potential buffer overflow vulnerability in the Zephyr CAN bus subsystem. Rated critical severity (CVSS 9.8), this vulner

CVE-2021-3323 CRITICAL POC
9.8 Oct 12

Integer Underflow in 6LoWPAN IPHC Header Uncompression in Zephyr. Rated critical severity (CVSS 9.8), this vulnerability

CVE-2021-3625 CRITICAL POC
9.8 Oct 05

Buffer overflow in Zephyr USB DFU DNLOAD. Rated critical severity (CVSS 9.8), this vulnerability is remotely exploitable

CVE-2021-3319 CRITICAL POC
9.8 Oct 05

DOS: Incorrect 802154 Frame Validation for Omitted Source / Dest Addresses. Rated critical severity (CVSS 9.8), this vul

CVE-2018-1000800 CRITICAL POC
9.8 Sep 06

zephyr-rtos version 1.12.0 contains a NULL base pointer reference vulnerability in sys_ring_buf_put(), sys_ring_buf_get(

CVE-2023-4264 CRITICAL POC
9.6 Sep 27

Potential buffer overflow vulnerabilities n the Zephyr Bluetooth subsystem. Rated critical severity (CVSS 9.6), this vul

CVE-2024-1638 CRITICAL POC
9.1 Feb 19

The documentation specifies that the BT_GATT_PERM_READ_LESC and BT_GATT_PERM_WRITE_LESC defines for a Bluetooth characte

CVE-2023-5753 HIGH POC
8.8 Oct 25

Potential buffer overflows in the Bluetooth subsystem due to asserts being disabled in /subsys/bluetooth/host/hci_core.c

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