Unbounded stack arrays in Zephyr fuel gauge syscalls allow kernel overflow
Key facts
- Attack vector
- Local
- Privileges required
- Low
- User interaction
- None
- Attack complexity
- Low
- Impact type
- Code execution
- Confidentiality · integrity · availability
- High · High · High
- Fix status
- Fixed
Attack profile from CVSS 3.1 · CNA. Fix status from CNA. Impact type from CWE-787 and the CVSS impact.
Summary
Zephyr from 3.4.0 before 4.3.2 and from 4.4.0 before 4.5.0 is affected. The user-mode syscall verifiers for fuel gauge property access allocate variable-length arrays sized by an unvalidated caller-supplied length before any permission or bounds check, which is an out-of-bounds write (CWE-787). Any thread in user mode can trigger it, and a caller with access to a fuel gauge device object can write attacker-controlled data below the supervisor stack, which can break out of the user-mode sandbox into kernel memory. The CVSS 3.1 base score is 7.8 (HIGH).
Written with Claude Haiku 5.5 from the sources below · 2026-11-04
Description from the CNA
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.
Why it matters now
SSVC decision points
CISA ADP · SSVC 2.0.3
- Exploitation
- None
- Automatable
- No
- Technical impact
- Total
The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| zephyrproject | zephyr | 3.4.0 to before 4.3.2; 4.4.0 to before 4.5.0 | 4.3.2, 4.5.0 | Patch available | CNA |
- zephyr Vendorzephyrproject Affected 3.4.0 to before 4.3.2; 4.4.0 to before 4.5.0 Fixed in 4.3.2, 4.5.0 Patch available CNA
CPE names Threatist (inferred) · 1
Inferred from how NVD named this product before; not given by a source.
| CPE | Versions | Role | Vendor |
|---|---|---|---|
| cpe:2.3:o:zephyrproject:zephyr:*:*:*:*:*:*:*:* | — | — | zephyrproject |
- cpe:2.3:o:zephyrproject:zephyr:*:*:*:*:*:*:*:* Versions — — ·zephyrproject
Remediation
Upgrade Zephyr to version 4.3.2 or 4.5.0. The sources list no fixed version for Zephyr branches outside these ranges.
Written with Claude Haiku 5.5 from the sources below · 2026-11-04
- Fix · CNA zephyr (zephyrproject) Fixed in 4.3.2, 4.5.0
Fixed in the same release
Records fixed by the same vendor advisory or release, as the CNA lists them.
- Release ·
zephyrproject zephyr 4.3.2, 4.5.0
5 records Highest priority Priority LOW 5 LOW
Other records, highest priority first
- TI-2026-70795 Zephyr Bluetooth LE Controller leaks receive nodes in PHY UpdatePriority LOW 28
- TI-2026-70794 Zephyr Bluetooth LE controller leaks retained RX node on unexpected PDUPriority LOW 28
- TI-2026-70793 Memory leak in Zephyr Bluetooth Controller CIS Create proceduresPriority LOW 28
Timeline
- 2026-10-11 Threatist record created from CVE-2026-19669
- 2026-10-12 Priority changed: MEDIUM → LOW
- 2026-10-16 CISA SSVC decision points changed
- 2026-11-04 Fix available: [email protected] · CNA
References
Patch 1
Other 1
More zephyrproject vulnerabilities
- TI-2026-04422 Out-of-bounds read/write in HTTP WebSocket upgrade via non-null-terminated Sec-WebSocket-Key CVSS 3.1CRITICAL 9.8
- TI-2026-01361 dns: memory‑safety issue in the DNS name parser CVSS 3.1CRITICAL 9.8
- TI-2026-09174 Unterminated URI buffer causes out-of-bounds read in LwM2M firmware pull (Package URI) CVSS 3.1CRITICAL 9.1
- TI-2026-09168 Stack buffer overflow in `net_ipaddr_parse()` IPv4 address-with-port parsing in `subsys/net/ip/utils.c` CVSS 3.1CRITICAL 9.8
- TI-2024-09625 net: lib: http_server: Buffer Under-read CVSS 3.1HIGH 8.6
- TI-2021-02863 Usb bluetooth device ACL read cb buffer overflow CVSS 3.1CRITICAL 9.6
Sources
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences