Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessRun code as user-mode thread
-
DeliveryInvoke fuel_gauge get/set_props with huge len
-
ExploitVLA sizes supervisor stack by len
-
Executionk_usermode_from_copy writes below stack base
-
ImpactGain supervisor-mode code execution or crash
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 | Requires the target firmware to be built with CONFIG_USERSPACE enabled and the attacker to already execute as a user-mode thread on the device. The denial-of-service / supervisor-stack-displacement path needs only that user-mode foothold plus a large caller-supplied len (≈170+ exhausts the default CONFIG_PRIVILEGED_STACK_SIZE of 1024 bytes), because Zephyr is not built with stack-clash probing so the displacement does not fault. The additional attacker-controlled-content write through k_usermode_from_copy() further requires that the calling thread has been granted access to a fuel-gauge device object (the K_SYSCALL_DRIVER_FUEL_GAUGE object-permission path). Limiting factors: exploitation is local only (no remote/network vector), is impossible on builds without CONFIG_USERSPACE or without a fuel-gauge driver, and full content control depends on fuel-gauge object permissions; a hardware stack guard does not stop it because the copy begins below the guard and walks upward. |
| Impact | This is a genuine, high-priority local privilege-escalation / sandbox-escape flaw rather than an inflated high-CVSS issue, but its risk is gated by deployment context. The vendor CVSS vector (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H = 7.8) is internally consistent with the description: exploitation is local (AV:L) by any thread already running in user mode (PR:L), with no user interaction and low complexity (AC:L), yielding full C/I/A impact via supervisor-mode out-of-bounds write (CWE-787). Exploitation status: no public exploit identified at time of analysis - the input provides no KEV listing and no POC, only a vendor patch and GHSA advisory, so there is no evidence of active exploitation. No EPSS score was supplied, so probabilistic exploitation likelihood cannot be quantified here. No SSVC decision data was provided. One nuance to verify: the description frames this as a 'break out of the user-mode sandbox into kernel memory,' which is arguably an SSVC/CVSS scope change (S:C), yet the vendor assigned S:U; defenders treating this as a pure same-scope local bug may underweight the sandbox-escape consequence. Net: real and serious for Zephyr builds with CONFIG_USERSPACE and untrusted user-mode threads, but there is no signal of opportunistic mass exploitation. |
| Exploit ScenarioDerived | On a Zephyr device built with CONFIG_USERSPACE, a low-privileged user-mode thread (e.g. a sandboxed application component) calls fuel_gauge_get_props() or fuel_gauge_set_props() with an attacker-chosen len of roughly 170 or larger. The variable-length arrays are sized by that len and allocated on the privileged stack before any validation, displacing the supervisor stack pointer and, if the thread also holds permission to a fuel-gauge device object, letting k_usermode_from_copy() write fully attacker-controlled data below the stack base - corrupting kernel memory for code execution or crash. No public exploit code is identified at time of analysis. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 11, 2026
Local privilege escalation and sandbox escape in Zephyr RTOS affects builds with CONFIG_USERSPACE enabled that include a fuel-gauge driver: the syscall verifiers z_vrfy_fuel_gauge_get_props() and z_vrfy_fuel_gauge_set_props() size kernel-side variable-length arrays directly from an unvalidated caller-supplied len, letting any user-mode thread displace the supervisor stack and, where the caller holds fuel-gauge object permissions, write len * sizeof(union fuel_gauge_prop_val) bytes of attacker-controlled data into privileged memory. The outcome is an out-of-bounds write executing in supervisor mode with attacker-chosen length and content, leading to kernel code execution or a device crash; with the default CONFIG_PRIVILEGED_STACK_SIZE of 1024 bytes, a len of roughly 170 is sufficient to overrun the privileged stack, and a hardware stack guard does not contain it because the copy begins below the guard and walks upward. CVSS 3.1 rates this 7.8 (AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H), meaning the vector requires the attacker to already hold a low-privilege foothold - here, the ability to execute a user-mode thread on the device - and no public exploit code has been identified at time of analysis.
RemediationAI
Apply the upstream vendor fix: update Zephyr to a revision that includes commit 0d65ce46dda0626164503c50f37e6e1f59d310a9 (Upstream fix available (PR/commit); released patched version not independently confirmed in the provided data - verify the fix hash or GHSA-6ghg-cmrw-8gw5 status against the release you consume). The commit removes the kernel-side VLA copies and validates the caller's buffers in place with K_SYSCALL_MEMORY_ARRAY_READ() / K_SYSCALL_MEMORY_ARRAY_WRITE(), which additionally catch the len * element-size multiplication overflow; there is no user-space backport or configuration flag that reproduces this behavior on an unpatched tree. If an immediate upgrade is not possible, the strongest compensating control is to rebuild without CONFIG_USERSPACE, which eliminates the user-mode sandbox-escape surface entirely but removes Zephyr's memory-protection isolation for all user threads and forces a privileged-only design, so it should be treated as a temporary posture change rather than a fix. Removing or not compiling a fuel-gauge driver (disabling the driver in Kconfig) also closes the path, but at the cost of fuel-gauge functionality. Note that revoking K_SYSCALL_DRIVER_FUEL_GAUGE access for untrusted threads via the syscall object-permission table is only a partial mitigation: it removes the attacker-controlled-content write, yet because the VLAs are allocated before the object-permission check, the supervisor-stack displacement and its denial-of-service impact remain reachable by any user-mode thread supplying a large len. Relying on the hardware stack guard is not viable - the copy begins below the guard region and walks upward, corrupting unprotected memory before the guard is reached.
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 user-mode syscall layer inserts verifier functions (z_vrfy_*) between a user thread's syscall and the kernel implementation; these verifiers are responsible for copying and validating user-supplied buffers before the implementation runs in supervisor mode. CVE-2026-19669 is a CWE-787 out-of-bounds write rooted in the verifier at drivers/fuel_gauge/fuel_gauge_syscall_handlers.c, which declared two variable-length arrays - union fuel_gauge_prop_val k_vals[len] and fuel_gauge_prop_t k_props[len] - on the privileged stack using a size_t len taken straight from the syscall ABI without any bounds check. Crucially, the VLAs were allocated before every other check, including the K_SYSCALL_DRIVER_FUEL_GAUGE() object-permission check, and the ensuing k_usermode_from_copy() calls only confirmed that the user source buffer was readable - the kernel destination was never bounds-checked because it was sized by the same attacker-chosen len. Zephyr firmware is not built with stack-clash probing, so the large stack-pointer displacement does not fault; nested calls then write frames below the privileged stack base, and on the object-permission-permitted path the memcpy inside k_usermode_from_copy() writes attacker-controlled content beneath that base. The affected product set is captured by the CPE cpe:2.3:a:zephyrproject:zephyr:*:*:*:*:*:*:*:* (all Zephyr versions, with no version-range constraint in the supplied CPE), qualified by the build-time requirements of CONFIG_USERSPACE plus a fuel-gauge driver. The upstream fix (commit 0d65ce46dda0626164503c50f37e6e1f59d310a9, tracked as GHSA-6ghg-cmrw-8gw5) deletes the kernel-side copies and instead validates the caller's arrays in place with K_SYSCALL_MEMORY_ARRAY_READ() / K_SYSCALL_MEMORY_ARRAY_WRITE(), which also guard against len * size multiplication overflow - a transformation that is safe here precisely because neither fuel_gauge_prop_t nor union fuel_gauge_prop_val contains embedded pointers.
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
Any local user-mode thread (PR:L) triggers it with no interaction and low complexity; the supervisor-stack OOB write gives full kernel C/I/A, matching the vendor 7.8.
Primary rating from Vendor (zephyr).
CVSS VectorVendor: zephyr
DescriptionCVE.org
The user-mode syscall verifiers z_vrfy_fuel_gauge_get_props() and z_vrfy_fuel_gauge_set_props() in drivers/fuel_gauge/fuel_gauge_syscall_handlers.c declared two variable-length arrays, union fuel_gauge_prop_val k_vals[len] and fuel_gauge_prop_t k_props[len], sized directly by the caller-supplied len argument. len is an unvalidated size_t taken straight from the syscall ABI, and the VLAs were allocated before any check at all - including before the K_SYSCALL_DRIVER_FUEL_GAUGE() object-permission check. The subsequent k_usermode_from_copy() calls validated only that the user source buffer was readable; the kernel destination was never bounds-checked, since it was sized by the same attacker-chosen len.
Any thread running in user mode with CONFIG_USERSPACE enabled can invoke fuel_gauge_get_props() or fuel_gauge_set_props() with a large len. This first displaces the supervisor stack pointer by an arbitrary attacker-chosen amount - Zephyr does not build with stack-clash probing, so the displacement itself does not fault, and the nested calls made by the verifier then write frames below the privileged stack. If the caller has been granted access to a fuel-gauge device object, the memcpy inside k_usermode_from_copy() additionally writes len * sizeof(union fuel_gauge_prop_val) bytes of fully attacker-controlled data starting well below the stack base. CONFIG_PRIVILEGED_STACK_SIZE defaults to 1024 bytes, so a len of roughly 170 already exhausts it.
The result is an out-of-bounds write in supervisor mode with attacker-controlled length and, on the permitted path, attacker-controlled content - a break out of the user-mode sandbox into kernel memory, leading to kernel code execution or a system crash. A stack guard region does not contain it, because the copy begins below the guard and walks upward, corrupting unprotected memory before the guard is reached. The fix removes the kernel-side copies entirely and validates the caller's arrays in place with K_SYSCALL_MEMORY_ARRAY_READ() / K_SYSCALL_MEMORY_ARRAY_WRITE(), which also handle the len * size multiplication overflow; this is safe because neither fuel_gauge_prop_t nor union fuel_gauge_prop_val contains embedded pointers.
Technical POC Analysis
CWE-787 out-of-bounds write.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
A high-severity flaw in Zephyr RTOS affects products built with CONFIG_USERSPACE and the fuel-gauge driver, allowing an authenticated local low-privileged user-mode process to escape the sandbox and execute code with kernel privileges, or crash the device. For leadership, this means affected embedded or connected devices could be taken over, disrupted, or made unreliable until patched, making inventory and coordinated remediation a priority. There is no public exploit identified at time of analysis, but the patch should still be treated as urgent because successful exploitation gives supervisor-mode control.
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.
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
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-97111
NVD
CVE.org
EPSS
GitHub
Exploit-DB