Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain user-mode thread with CAN device access
-
DeliveryAllocate dynamic k_msgq, register CAN RX filter
-
ExploitRelease queue via k_object_release()
-
ExecutionGroom freed heap slot with supervisor allocation
-
PersistSend matching CAN frame via loopback
-
ImpactCorrupt 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
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
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
AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H
Local execution context required; low-privilege thread with CAN device grant sufficient; scope change to kernel supervisor yields full C/I/A impact.
Primary rating from Vendor (zephyr).
CVSS VectorVendor: zephyr
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
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.
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
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.
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-115823
NVD
CVE.org
Vulnrichment
GitHub
Exploit-DB