Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessRun code in granted user-mode RTIO thread
-
DeliveryCall syscall with crafted handle address
-
ExploitKernel stores SQE pointer via missing write check
-
ExecutionOverwrite kernel function pointer / domain table
-
ImpactEscalate 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 |
| 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 |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
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'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
AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
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).
Primary rating from Vendor (zephyr).
CVSS VectorVendor: zephyr
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
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.
Apply vendor patch.
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
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.
Potential off-by-one buffer overflow vulnerability in the Zephyr fuse file system. Rated critical severity (CVSS 10.0),
An out-of-bounds write in the Zephyr RTOS DNS resolver (dns_unpack_name()) lets a crafted DNS response corrupt memory on
Possible variant of CVE-2021-3434 in function le_ecred_reconf_req. Rated critical severity (CVSS 9.8), this vulnerabilit
Unchecked user input length in /subsys/net/l2/wifi/wifi_shell.c can cause buffer overflows. Rated critical severity (CVS
Potential buffer overflow vulnerability in the Zephyr CAN bus subsystem. Rated critical severity (CVSS 9.8), this vulner
Integer Underflow in 6LoWPAN IPHC Header Uncompression in Zephyr. Rated critical severity (CVSS 9.8), this vulnerability
Buffer overflow in Zephyr USB DFU DNLOAD. Rated critical severity (CVSS 9.8), this vulnerability is remotely exploitable
DOS: Incorrect 802154 Frame Validation for Omitted Source / Dest Addresses. Rated critical severity (CVSS 9.8), this vul
zephyr-rtos version 1.12.0 contains a NULL base pointer reference vulnerability in sys_ring_buf_put(), sys_ring_buf_get(
Potential buffer overflow vulnerabilities n the Zephyr Bluetooth subsystem. Rated critical severity (CVSS 9.6), this vul
The documentation specifies that the BT_GATT_PERM_READ_LESC and BT_GATT_PERM_WRITE_LESC defines for a Bluetooth characte
Potential buffer overflows in the Bluetooth subsystem due to asserts being disabled in /subsys/bluetooth/host/hci_core.c
EUVD-2026-88470
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB