Skip to main content

Zephyr RTOS CVE-2026-16513

| EUVDEUVD-2026-88470 HIGH
Out-of-bounds Write (CWE-787)
2026-09-28 zephyr
7.8
CVSS 3.1 · Vendor: zephyr
View

Attack ChainAIDerived

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

  1. Access
    Run code in granted user-mode RTIO thread
  2. Delivery
    Call syscall with crafted handle address
  3. Exploit
    Kernel stores SQE pointer via missing write check
  4. Execution
    Overwrite kernel function pointer / domain table
  5. Impact
    Escalate to supervisor mode

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Bounds checking, write limits
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 a Zephyr firmware image built with BOTH CONFIG_USERSPACE and CONFIG_RTIO enabled - without CONFIG_USERSPACE the verifier is not compiled and the caller is already privileged, so unaffected builds are entirely immune. The attacker must already be executing as a user-mode thread that has been granted a struct rtio kernel object (this is the ordinary way apps use the RTIO API, e.g. via sensor_read_async_mempool() or the async ADC helpers), so local code execution and a granted RTIO handle are prerequisites (PR:L, AV:L). No user interaction is needed and the malicious store fires in supervisor mode before any SQE-content validation, so it succeeds regardless of whether the submission entry is later rejected. The limiting factors are: local access only (not network-reachable), the specific two-Kconfig build combination, and possession of an rtio object grant.

Impact

This is a genuine, high-quality memory-corruption flaw whose real-world risk is moderated by its exploitation surface rather than its severity ceiling. The vendor CVSS 3.1 vector (AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H, 7.8) is well-supported by the technical detail: a missing K_SYSCALL_MEMORY_WRITE check on the handle out-parameter of z_vrfy_rtio_sqe_copy_in_get_handles() yields a write-what-where primitive (attacker-chosen address, value = pointer into caller-controlled RTIO ring), which is enough to corrupt kernel function pointers, thread structures, or memory-domain partition tables and escalate from user mode to supervisor mode. The attack is LOCAL (AV:L) and requires an already-running user-mode thread that has been granted a struct rtio kernel object (PR:L), so this is not a remotely reachable network bug - it is a local-privilege-escalation / sandbox-escape primitive that defeats the CONFIG_USERSPACE isolation boundary. No EPSS score, no CISA KEV entry, and no packaged public exploit are present in the input, so there is no evidence of active or automated exploitation; however, the reporter reproduced a real write on qemu_x86 (a K_USER thread flipped a supervisor global from NULL to a live kernel SQE pointer), meaning exploitability is demonstrated even if weaponized code is not public. Net: a real priority for anyone shipping Zephyr with both CONFIG_USERSPACE and CONFIG_RTIO, but its blast radius is confined to that specific build configuration, so it is not a mass-exploitation, high-EPSS-style threat.

Exploit ScenarioDerived

On a Zephyr device built with CONFIG_USERSPACE and CONFIG_RTIO, a low-privileged user-mode application thread that legitimately holds an rtio kernel object (e.g. one using sensor_read_async_mempool() or the async ADC helpers) calls rtio_sqe_copy_in_get_handles() with an arbitrary kernel address in the handle argument. Because the verifier stores *handle = sqe before any K_SYSCALL_MEMORY_WRITE check, the kernel writes a pointer to attacker-controlled ring data at that address, giving a write-what-where primitive the reporter has already reproduced on qemu_x86. The attacker uses this to overwrite a kernel function pointer or memory-domain partition table and escalate from user mode to supervisor mode.

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 – Sep 28, 2026

Kernel memory corruption in Zephyr RTOS arises from the RTIO userspace syscall verifier z_vrfy_rtio_sqe_copy_in_get_handles(), which validates the RTIO object handle and the incoming sqes array but never checks that the caller-supplied handle out-parameter is writable before executing *handle = sqe in supervisor mode. Any user-mode thread that has been granted a struct rtio kernel object - the normal situation for applications using sensor_read_async_mempool() or the async ADC helpers, which call rtio_sqe_copy_in_get_handles() internally - can supply an arbitrary destination address and thereby obtain a write-what-where primitive that stores a pointer to attacker-controlled ring data at any kernel location, corrupting function pointers, thread structures or memory-domain partition tables and breaking the CONFIG_USERSPACE isolation boundary. The issue is local-only and build-gated (CVSS 7.8, AV:L/PR:L, CWE-787), requires both CONFIG_USERSPACE and CONFIG_RTIO, and no public exploit code has been identified at time of analysis, although an upstream vendor fix and GitHub security advisory are available.

RemediationAI

Apply the upstream fix in commit 95c355c425763fbe5e735b9ef54dacce2c4ce21f (referenced from the vendor advisory https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-fwmc-q8qg-jcxq), which inserts a guarded K_SYSCALL_MEMORY_WRITE(handle, sizeof(*handle)) before the copy loop so the destination must fall inside the calling thread's writable memory domain or the thread is terminated with K_OOPS; a released downstream Zephyr version containing this commit is not independently confirmed here, so confirm against the advisory before relying on a version number. If immediate upgrade is not possible, the most effective action is to prevent untrusted threads from holding a granted struct rtio kernel object, since the primitive cannot be reached without one - restrict rtio device grants to threads whose compromise is acceptable, accepting that this breaks the normal async sensor/ADC design pattern for those threads. As a coarser fallback, disabling CONFIG_RTIO removes the vulnerable syscall entirely but also removes asynchronous RTIO-based sensor and ADC functionality from the application. Disabling CONFIG_USERSPACE is not a recommended mitigation: it removes the verifier and therefore the exposure path, but it also eliminates memory-domain isolation altogether, leaving the system with strictly weaker protection than the vulnerable configuration. Deployments that use RTIO with userspace threads should treat the patched kernel plus any hardened follow-up for z_vrfy_rtio_cqe_get_mempool_buffer() (commit bea93400138) as the target state.

Affected VersionsENISA

Zephyr 3.4.0 <4.4.2

Affected Packages

euvd zephyr fix: 4.4.2

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 syscall framework compiles a separate verification layer (z_vrfy_* functions) into builds where CONFIG_USERSPACE is enabled; these verifiers run in supervisor mode and must validate every pointer handed down from user mode before the implementation body dereferences it. The RTIO subsystem (subsys/rtio/) implements asynchronous I/O submission queues, and the syscall rtio_sqe_copy_in_get_handles() copies submission-queue entries from a user array into the caller's RTIO ring while returning a handle back to the user. The original verifier applied validation to the RTIO object and to the sqes input array but omitted any K_SYSCALL_MEMORY_WRITE check on the handle out-parameter, so the first loop iteration performed *handle = sqe using a pointer taken verbatim from user mode, with the store occurring in supervisor mode before any SQE-content validation (and therefore succeeding even if the submission entry was later rejected). This is an out-of-bounds write (CWE-787) driven by missing validation of an output parameter rather than by a length or index computation error; the attacker fully controls the destination address while the written value is a kernel pointer into the caller's own RTIO ring, whose subsequent contents the caller also controls. Because the check was absent, the write could land outside the calling thread's memory domain, defeating the very isolation CONFIG_USERSPACE exists to provide. A related residual in z_vrfy_rtio_cqe_get_mempool_buffer(), which only read-checked its buff and buff_len out-parameters despite writing through them, was hardened separately in commit bea93400138. The operator-neutral CPE cpe:2.3:a:zephyrproject:zephyr:*:*:*:*:*:*:*:* reflects that the vendor has not published a bounded version range; the verifier lived in subsys/rtio/rtio_handlers.c before v4.3.0 and in subsys/rtio/rtio_syscalls.c thereafter.

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.8 HIGH
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
vuln.today AI 7.8 HIGH

Local user-mode thread with a granted RTIO object (PR:L, AV:L) triggers a reliable write-what-where with no user interaction, giving full kernel compromise (C/I/A:H).

3.1 AV:L/AC:L/PR:L/UI:N/S:U/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 (zephyr).

CVSS VectorVendor: zephyr

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

DescriptionCVE.org

The userspace verifier z_vrfy_rtio_sqe_copy_in_get_handles() in subsys/rtio/rtio_syscalls.c (subsys/rtio/rtio_handlers.c before v4.3.0) validated the RTIO object handle and the sqes input array, but not the handle out-parameter. On the first loop iteration it executed *handle = sqe, storing the kernel address of the newly acquired submission-queue entry through a pointer taken verbatim from user mode, with no K_SYSCALL_MEMORY_WRITE check in front of it.

Any user-mode thread that has been granted a struct rtio kernel object can invoke the syscall with an arbitrary address in handle. That is the ordinary way an unprivileged thread uses the RTIO API, for example via sensor_read_async_mempool() or the async ADC helpers, which call rtio_sqe_copy_in_get_handles() internally. The store happens in supervisor mode before any submission-entry validation, so it fires regardless of whether the SQE contents are subsequently rejected. Only builds with CONFIG_USERSPACE and CONFIG_RTIO are affected; without CONFIG_USERSPACE the verifier is not compiled and the caller is already privileged.

The write address is fully attacker-chosen and the written value is a pointer into the caller's own RTIO ring, whose contents the caller controls (the following *sqe = sqes[i] copies an attacker-supplied struct rtio_sqe into that slot). This yields a write-what-where primitive placing a pointer to attacker-controlled data at any kernel address, sufficient to corrupt kernel function pointers, thread structures, or memory-domain partition tables, and thus to escalate from user mode to kernel mode, defeating the isolation boundary CONFIG_USERSPACE is meant to enforce. At minimum it is a reliable kernel memory-corruption and crash primitive. The reporter reproduced the write on qemu_x86: a K_USER thread changed a supervisor global from NULL to a live kernel SQE pointer.

The fix adds K_SYSCALL_MEMORY_WRITE(handle, sizeof(*handle)) (guarded by the existing optional-NULL semantics) before the loop, so the destination must lie in the calling thread's writable memory domain or the thread is terminated by K_OOPS. The neighbouring verifier z_vrfy_rtio_cqe_get_mempool_buffer(), which checked its buff/buff_len out-parameters only for read although the implementation writes through them, was hardened separately by bea93400138 ("rtio: syscalls: validate output params as writable"); that residual was materially weaker, since a read check still confines the target to the caller's own memory domain.

Technical POC Analysis

CWE-787 out-of-bounds write, realised as a userspace-to-kernel trust-boundary violation: a syscall verifier validated two of three arguments and left a caller-supplied out-pointer unvalidated.

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

A memory-corruption flaw in the Zephyr RTOS kernel allows any unprivileged user-mode thread that has been granted an RTIO kernel object - the standard configuration for products using asynchronous sensor or ADC drivers - to write attacker-controlled data to arbitrary kernel memory and escape the CONFIG_USERSPACE isolation boundary. Because this bypasses the protection that separates application code from the kernel, a compromised or malicious thread on an affected device could tamper with function pointers, thread structures or memory-domain partitions, potentially leading to persistent device compromise or loss of trusted execution. Only products built with both CONFIG_USERSPACE and CONFIG_RTIO are exposed, and exploitation requires local code execution on the device, which limits the population of affected deployments but raises the stakes for any connected product already running untrusted or third-party application code.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.1%
Top 99% exploitable
Prevalence
High
Zephyr is a very widely deployed open-source RTOS across embedded/IoT devices
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
Defer
Exploitation
None
System Exposure· derived
Small
Automatable
No
Human Impact
High
Technical Impact
Total

Priority Score

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

Attack Technique

A buffer overflow occurs when a program writes more data to a memory buffer than it was allocated to hold, causing the excess data to spill into adjacent memory regions.

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.

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