Skip to main content

Zephyr RTOS EUVDEUVD-2026-115823

| CVE-2026-85035 HIGH
Use After Free (CWE-416)
2026-11-03 zephyr
8.8
CVSS 3.1 · Vendor: zephyr
View

Attack ChainAIDerived

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

  1. Access
    Obtain user-mode thread with CAN device access
  2. Delivery
    Allocate dynamic k_msgq, register CAN RX filter
  3. Exploit
    Release queue via k_object_release()
  4. Execution
    Groom freed heap slot with supervisor allocation
  5. Persist
    Send matching CAN frame via loopback
  6. Impact
    Corrupt kernel heap in supervisor context

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Memory lifecycle management
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 a Zephyr build with both CONFIG_USERSPACE=y and CONFIG_DYNAMIC_OBJECTS=y; CONFIG_DYNAMIC_OBJECTS is default-off (arch/Kconfig:475-486, kernel/Kconfig:208-212) but is automatically selected when CONFIG_DYNAMIC_THREAD is enabled alongside CONFIG_USERSPACE, making this a realistic production configuration for dynamic-thread Zephyr deployments. The attacker must control a user-mode thread that has been explicitly granted access to a CAN device via k_object_access_grant() or equivalent before the vulnerability can be triggered - this grant is a deliberate application-level decision, not a default. Within those prerequisites, no further special configuration is required: the attacker uses only standard userspace syscalls (k_object_alloc, k_msgq_alloc_init, can_add_rx_filter_msgq, k_object_release) available to any granted user-mode thread. Exploitation is additionally bounded by the need to deliver a matching CAN frame, achievable via CAN_MODE_LOOPBACK (demonstrated in the PoC) or physical bus access. No user interaction is required once the thread is running. Supervisor-mode callers are not protected by the fix and must themselves ensure queue lifetime exceeds filter lifetime.

Impact

CVSS 8.8 with AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H accurately characterizes this as a local privilege escalation that crosses the user-to-kernel boundary. The scope change (S:C) is the key signal: a low-privilege user-mode thread with CAN device access can corrupt kernel heap in supervisor context, fully defeating the isolation that CONFIG_USERSPACE is intended to provide. No EPSS score was provided in the input; no CISA KEV listing is present at time of analysis. However, a detailed, functional PoC demonstrating cross-privilege frame delivery on qemu_x86_64 is embedded in the GHSA advisory - this is confirmed working exploit code. The decision label 'this_week' is consistent with a high-severity but conditionally exploitable issue: not an emergency requiring same-day response, but patching within the week is warranted for affected configurations. Two conditions substantially reduce real-world blast radius: (1) the build must have both CONFIG_USERSPACE=y and CONFIG_DYNAMIC_OBJECTS=y - the latter is default-off, though it is auto-selected by CONFIG_DYNAMIC_THREAD when userspace is enabled; and (2) the attacker must already possess a user-mode thread executing on the target device with explicit CAN device access granted. For Zephyr deployments that use dynamic thread support and expose CAN bus access to unprivileged code - a realistic profile for automotive or industrial IoT gateways - this is a genuine, straightforward privilege escalation path. The same dangling pointer can also be triggered non-adversarially when an application thread exits without removing its filter, meaning non-malicious triggering is a realistic concern for reliability as well.

Exploit ScenarioDerived

An attacker controlling a low-privilege Zephyr user-mode thread with granted CAN device access allocates a dynamic message queue via k_object_alloc(K_OBJ_MSGQ), registers it with can_add_rx_filter_msgq(), then releases it via k_object_release() - causing unref_check() to free the struct k_msgq storage while the CAN driver retains the stale pointer. The attacker then grooms the freed heap slot by allocating a supervisor-owned kernel object at the same address. When a matching CAN frame arrives (via loopback or physical bus), can_msgq_put() executes in supervisor context against the reused memory, memcpy-ing the frame payload through the recycled block's write_ptr and manipulating wait_q and poll_events list nodes - yielding kernel heap corruption and a privilege escalation path to supervisor mode. A complete PoC demonstrating cross-privilege frame delivery on qemu_x86_64 is included in the GHSA advisory.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Nov 03, 2026

A use-after-free in Zephyr's CAN subsystem lets a local, unprivileged user-mode thread corrupt kernel heap memory by registering a CAN RX filter against a message queue whose lifetime it controls, then releasing or exiting to free that queue while the CAN controller driver still holds a raw pointer to it. The flaw affects builds with CONFIG_USERSPACE=y and CONFIG_DYNAMIC_OBJECTS=y (the latter is default-off but is automatically selected by CONFIG_DYNAMIC_THREAD together with CONFIG_USERSPACE), and requires that the thread already hold a deliberate application-level grant to a CAN device; the next matching CAN frame is then copied through the reused block's write_ptr in supervisor context, and the queue's wait_q (and poll_events under CONFIG_POLL) list nodes are manipulated, crossing the user-to-kernel boundary with high confidentiality and integrity impact. No CISA KEV entry and no EPSS signal are present in the supplied data, but a public proof-of-concept reproducer (delivered via CAN_MODE_LOOPBACK on qemu_x86_64) is published with the vendor advisory; it demonstrates the dangling-pointer path and address reuse with a supervisor-owned queue but is not confirmed as weaponized exploit code.

RemediationAI

Vendor-released patch: Zephyr 4.3.2 and 4.5.0 (backport commit 0114bee266211c72a49f3b6a914d3eaf821dd460, https://github.com/zephyrproject-rtos/zephyr/commit/0114bee266211c72a49f3b6a914d3eaf821dd460), tracked in advisory https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-6pxv-r7ww-3g2q; release lines that have not taken the backport remain affected and should upgrade to 4.3.2 or 4.5.0 respectively. If immediate upgrade is not possible, the reported workaround is to register only statically defined queues (CAN_MSGQ_DEFINE()) from user mode rather than queues from k_object_alloc()/k_msgq_alloc_init(), with the trade-off that per-thread queue allocation and dynamic queue sizing are lost; correlating this with CONFIG_DYNAMIC_OBJECTS is imperfect because a downstream caller can still pass a dynamic queue unless the verifier is patched. Disabling CONFIG_USERSPACE removes the exploitable path but forfeits the memory isolation this configuration exists to provide, and disabling CONFIG_DYNAMIC_OBJECTS independently breaks CONFIG_DYNAMIC_THREAD deployments that select it, so patching is strongly preferred over either Kconfig change. Applications should also call can_remove_rx_filter() before releasing a queue or letting the registering thread exit, since the benign dangling-pointer case (thread exit without filter removal) is not mitigated by the verifier fix, and supervisor-mode callers must themselves keep the queue valid until the filter is removed because they bypass the syscall verifier entirely.

Affected VersionsENISA

Zephyr 1.14.0 <4.3.2
Zephyr 4.4.0 <4.5.0

Affected Packages

euvd zephyr fix: 4.3.2, 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

This is a CWE-416 lifetime/ownership bug in Zephyr's syscall-object permission model. The system call verifier z_vrfy_can_add_rx_filter_msgq() in drivers/can/can_handlers.c accepted the supplied struct k_msgq * using K_SYSCALL_OBJ(), which validates only object type, initialization and the caller's permission bitmask at that instant; it carries no lifetime guarantee. z_impl_can_add_rx_filter_msgq() then stores the raw pointer as the filter's user_data, and the controller driver dereferences it from the RX path through can_msgq_put() -> k_msgq_put() on every matching frame. Under CONFIG_DYNAMIC_OBJECTS, k_object_alloc(K_OBJ_MSGQ) plus k_msgq_alloc_init() produce a queue tagged K_OBJ_FLAG_ALLOC whose lifetime is driven purely by permission bits: when the last permission is cleared via k_object_release() or the owning thread exits, unref_check()/k_thread_perms_clear() calls k_msgq_cleanup() and k_free()s the storage, and a kernel-retained pointer is not counted as a reference. The freed block can then be groomed or re-occupied by an unrelated supervisor allocation (a second k_object_alloc(K_OBJ_MSGQ) at the same address in the published PoC), so a later frame is written into a privileged queue that was never registered and never granted to the attacker. The fix switches the verifier to K_SYSCALL_OBJ_STATIC(), built on k_object_is_dynamic(), which additionally rejects objects carrying K_OBJ_FLAG_ALLOC; only statically defined queues (CAN_MSGQ_DEFINE()) may be registered from user mode. Supervisor-mode callers bypass the verifier entirely and must enforce the lifetime invariant themselves. CPE cpe:2.3:a:zephyrproject:zephyr covers the affected tree; the pattern was introduced in 2019 by commits 8757e780fc4d and 26085d9570e9.

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

Local execution context required; low-privilege thread with CAN device grant sufficient; scope change to kernel supervisor yields full C/I/A impact.

3.1 AV:L/AC:L/PR:L/UI:N/S:C/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:H/SI:H/SA:H

Primary rating from Vendor (zephyr).

CVSS VectorVendor: zephyr

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

DescriptionCVE.org

The can_add_rx_filter_msgq() system call installs a CAN RX filter whose callback (can_msgq_put() in drivers/can/can_common.c) is handed the caller's struct k_msgq * as user_data. The controller driver stores that raw pointer in its filter table and dereferences it from the RX path every time a matching frame arrives. The system call verifier z_vrfy_can_add_rx_filter_msgq() in drivers/can/can_handlers.c validated the queue only with K_SYSCALL_OBJ(), which is a point-in-time check of type, initialization and caller permission and says nothing about the object's lifetime.

On a build with CONFIG_USERSPACE=y and CONFIG_DYNAMIC_OBJECTS=y, an unprivileged user-mode thread that has been granted access to a CAN device can obtain a message queue whose lifetime it fully controls: k_object_alloc(K_OBJ_MSGQ) followed by k_msgq_alloc_init(). The lifetime of such an object is driven solely by its permission bitmask, and a pointer retained by the kernel is not represented there. After registering the filter, the thread calls k_object_release() - or simply terminates - and unref_check() frees the struct k_msgq storage while the CAN driver still holds the pointer.

The next matching CAN frame causes k_msgq_put() to run in supervisor context against freed memory that the attacker can have groomed with another kernel allocation: the frame payload is memcpy()d through the reused block's write_ptr, and the queue's wait_q (and poll_events under CONFIG_POLL) list nodes are manipulated. This yields kernel-heap corruption reachable from a user-mode thread, defeating the isolation CONFIG_USERSPACE is intended to provide; the same dangling pointer also arises benignly when an application thread exits without calling can_remove_rx_filter().

The fix validates the queue with K_SYSCALL_OBJ_STATIC(), which additionally rejects objects carrying K_OBJ_FLAG_ALLOC, so only statically defined queues (CAN_MSGQ_DEFINE()) may be registered from user mode. Supervisor-mode callers bypass the verifier and must themselves keep the queue valid until the filter is removed.

Executive ViewAI

Why It Matters

CVE-2026-85035 is a high-severity use-after-free in the Zephyr RTOS CAN subsystem that allows an unprivileged local thread to corrupt kernel heap memory, affecting products built with userspace and dynamic object support. While exploitation requires an existing CAN device grant and the flaw is not actively exploited, the boundary crossing risks confidentiality and integrity of embedded systems. Leadership should prioritize remediation for any Zephyr-based CAN-connected products.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

Prevalence
Medium
popular embedded RTOS in IoT, automotive, and connected devices
Data Quality
5 sources
Confidence: Medium
EUVD NVD CVE.org Vulnrichment GitHub

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 N/A
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
Scheduled
Exploitation
None
System Exposure· derived
Small
Automatable
No
Human Impact
High
Technical Impact
Total

Priority Score

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

Attack Technique

Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.

Use-after-free vulnerabilities occur when a program continues to access memory through a pointer after that memory has been deallocated.

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