Skip to main content

Zephyr RTOS CVE-2026-79979

| EUVDEUVD-2026-109142 HIGH
Use After Free (CWE-416)
2026-10-23 zephyr
7.8
CVSS 3.1 · Vendor: zephyr
View

Attack ChainAIDerived

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

  1. Access
    Run code in unprivileged user thread
  2. Delivery
    Drive memory pressure to force page eviction
  3. Exploit
    Keep accessing stale TLB-mapped address
  4. Execution
    Read/write reused kernel or domain frame
  5. Impact
    Escalate to full system compromise

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 an arm64 Zephyr build with BOTH CONFIG_USERSPACE and CONFIG_DEMAND_PAGING (the latter is marked EXPERIMENTAL) enabled, an active backing store, and at least one demand-paged page that is also privately mapped into a user memory domain - specifically a k_mem_partition added via arch_mem_domain_partition_add() or a user thread stack mapped by map_thread_stack(). The attacker must already be executing unprivileged code in a user thread (PR:L) on the device and must drive memory pressure to force eviction and frame reuse (AC:H). Exploitation is limited to versions 4.3.0 through 4.4.2 on arm64; non-arm64 targets, builds without demand paging or userspace, and deployments with no privately-mapped demand-paged pages are not affected.

Impact

This is a genuine high-severity isolation bypass but not an emergency. The provided CVSS 3.1 vector (AV:L/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H, 7.8 High) is internally consistent with the description: a local, already-present unprivileged user thread (PR:L, AV:L) must force demand-paging eviction and reuse a frame it previously mapped (AC:H), then crosses the CONFIG_USERSPACE trust boundary (S:C) to read and write supervisor data, another domain's partition, or another thread's stack (C:H/I:H/A:H). No EPSS score, no CISA KEV entry, and no PoC/exploit reference are present in the input, so by the precision rules this is 'no public exploit identified at time of analysis' - though the fixing commit diff publicly documents the exact mechanism (ASID field always 0 in TLBI VAE1, non-global domain leaves surviving the flush), which lowers the research barrier. The vuln.today Decision label is 'this_week', which aligns with act-this-week urgency rather than act_now/emergency; combined with a vendor patch available and the EXPERIMENTAL status of CONFIG_DEMAND_PAGING, real-world exposure is narrow. The signals do not conflict, but note that despite CRITICAL-level impact (full system compromise), the required build configuration sharply limits the population of actually vulnerable deployments.

Exploit ScenarioDerived

On an affected arm64 Zephyr build, an attacker running unprivileged code inside a user thread drives memory pressure to force the demand-paging eviction algorithm to reclaim a page the thread had privately mapped (a k_mem_partition or its own stack). Because invalidate_tlb_page() flushed only ASID 0 while the domain's non-global entry lived under ASID >= 1, the thread's EL0 translation survives, so it keeps accessing the stale virtual address and now reads/writes whatever the kernel placed in that reused physical frame. No public exploit exists, but the fixing commit describes the trigger in full detail.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.1% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Oct 23, 2026

Stale arm64 TLB entries in Zephyr RTOS 4.3.0 through 4.4.2 let an unprivileged user thread (CVSS PR:L, local access) retain read/write mappings to a physical page frame after the demand paging eviction algorithm has reclaimed and reissued that frame to the kernel or to another memory domain. Because the single-VA invalidation only ever matched ASID 0 and global entries, a domain-private non-global leaf created for a k_mem_partition or a user thread stack survives page-out, enabling information disclosure and memory corruption that breaks CONFIG_USERSPACE isolation with scope-changing impact beyond the vulnerable component. Exploitation requires an arm64 build with both CONFIG_USERSPACE and the experimental CONFIG_DEMAND_PAGING enabled, an active backing store, and a demand-paged page privately mapped into a user memory domain; the attacker must already be running user-mode code and must drive memory pressure to force eviction and immediate frame reuse (AC:H). No public exploit code or PoC reference was identified in the available sources and the issue is not listed in CISA KEV; vendor fix commits are merged upstream on main with a projected fixed version of 4.5.0, while branch backports remain open.

RemediationAI

Vendor fix commits are merged upstream: main carries commit d732e9f808f16911d06769b3f756246f3528669f (PR #115880), and the advisory projects 4.5.0 as the fixed release, which should be confirmed against the actual published tag before relying on it; backports for the v4.4-branch (PR #117529) and v4.3-branch (PR #117528) are open, so a released patched version on those branches is not yet confirmed. Upgrading to a build containing the fix replaces TLBI VAE1{IS} with TLBI VAAE1{IS} and preserves domain-private attributes across paging synchronization. Where an update cannot be applied, the exposure can be removed by configuration rather than by generic hardening: disabling CONFIG_DEMAND_PAGING eliminates every caller of invalidate_tlb_page() at the cost of losing page eviction and requiring all memory to be resident, and disabling CONFIG_USERSPACE removes the memory-domain isolation that the stale translation bypasses at the cost of losing user-mode sandboxing for threads, partitions and stacks; alternatively, restricting the workload so that no demand-paged page is privately mapped into a user memory domain (no demand-paged k_mem_partition added with arch_mem_domain_partition_add() and no demand-paged thread stack created by map_thread_stack()) avoids the vulnerable mapping combination but is fragile because it depends on application memory layout. Consult https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-6pqm-hfxf-48qv and the commit diff for details.

Affected VersionsENISA

Zephyr 4.3.0 <4.5.0

Affected Packages

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

The flaw is in the arm64 MMU backend of the Zephyr RTOS kernel, arch/arm64/core/mmu.c, and is tracked as CWE-416 (use-after-free): a translation that should have been discarded continues to reference a physical frame that has been freed and repurposed. Zephyr memory domains do not share the kernel address space identity; arch_mem_domain_init() allocates ASIDs starting at 1 (next_asid starts at 1, and domain_ptables->ttbr0 encodes that ASID), while the kernel page tables are installed via write_ttbr0_el1(base_xlat_table) under ASID 0. Every domain-private leaf produced by private_map() is created with attrs | MT_NG, i.e. non-global, and private_map() is reached from arch_mem_domain_partition_add() (k_mem_partition) and map_thread_stack() (user thread stacks). The pre-fix invalidate_tlb_page() issued TLBI VAE1{IS} with an operand of virt >> 12, an encoding in which bits [63:48] carry the ASID, so the ASID field was always zero and the invalidation only matched ASID 0 plus global entries - never the ASID-tagged non-global domain leaves. All callers of that helper sit on demand-paging paths: when the eviction algorithm reclaims a frame, page_frame_prepare_locked() in kernel/mmu.c calls arch_mem_page_out(), which marks the kernel leaf invalid, propagates the invalid descriptor to every domain through sync_domains() -> globalize_page_range(), and then flushes only ASID 0, after which do_page_fault() immediately reuses the same k_mem_page_frame for the incoming mapping via arch_mem_page_in(). A thread that had already touched the evicted page keeps a valid EL0 read/write translation to that frame under its own ASID. The fix has two parts: invalidate_tlb_page() switches to TLBI VAAE1{IS}, which matches all ASIDs and both global and non-global entries, and globalize_table()/globalize_page_range() gain a preserve_private flag so that paging synchronization no longer strips EL0 permission, UXN/PXN, non-global, guarded-page and software-writable attributes from domain-private leaves (that stripping previously caused user threads to lose access to their own partitions and stacks), while reset_map() still passes preserve_private=false to revert private entries to the global ones. The read-only bit is treated as dirty-tracking state only for writable mappings. Note that arch_mem_map()/arch_mem_unmap() already use invalidate_tlb_all(), so no equivalent single-ASID gap exists on those paths; the trigger specifics of the fault path are documented in the advisory, and the missing-ASID-match mechanism is confirmed by the source evidence.

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

Attacker runs as an unprivileged local user thread (AV:L/PR:L); success needs a specific experimental build plus forced eviction and frame reuse (AC:H); the MMU isolation boundary is crossed (S:C) with full read/write (C/I/A:H).

3.1 AV:L/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:H
4.0 AV:L/AC:H/AT:P/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (zephyr).

CVSS VectorVendor: zephyr

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

DescriptionCVE.org

The arm64 MMU backend invalidates a single virtual address from the TLB with invalidate_tlb_page() in arch/arm64/core/mmu.c, which issued TLBI VAE1{IS} with an operand of virt >> 12. That operand encodes the ASID in bits [63:48], so the invalidation only ever matched ASID 0 (the kernel page tables) and global entries. Memory domains, however, are allocated ASIDs starting at 1 in arch_mem_domain_init(), and every domain-private leaf created by private_map() is mapped with MT_NG, i.e. non-global. A domain's cached translation therefore survived the invalidation.

All callers of invalidate_tlb_page() are demand-paging paths. When the eviction algorithm reclaims a frame, page_frame_prepare_locked() in kernel/mmu.c calls arch_mem_page_out(), which marks the kernel leaf invalid, propagates the invalid descriptor into every domain via sync_domains(), and then flushes only ASID 0. do_page_fault() immediately reuses the very same page frame for the incoming mapping through arch_mem_page_in(). A user thread that had already touched the evicted page - a k_mem_partition added with arch_mem_domain_partition_add(), or its own stack mapped by map_thread_stack() - retains a valid EL0 read/write translation to that physical frame under its own ASID.

Unprivileged code running in a user thread can drive memory pressure to force eviction and then keep accessing the stale address, obtaining read and write access to whatever the kernel subsequently placed in that frame: supervisor data, another memory domain's partition, or another thread's stack. This defeats the isolation that CONFIG_USERSPACE is meant to enforce, allowing information disclosure and memory corruption up to full compromise of the system.

The fix switches the implementation to TLBI VAAE1{IS}, which matches every ASID and both global and non-global entries, so no domain-tagged translation survives a page out, dirty-bit update or access-flag clear. Exploitation requires an arm64 build with both CONFIG_USERSPACE and CONFIG_DEMAND_PAGING enabled, an active backing store, and at least one demand-paged page that is also privately mapped into a user memory domain. The same commit additionally stops globalize_table() from stripping EL0 permission and non-global attributes off domain-private leaves during paging synchronization, which previously caused user threads to lose access to their own partitions and stacks.

Technical POC Analysis

CWE-416 (use-after-free), realized at the hardware-translation layer rather than in a heap allocator: a physical page frame is returned to the page-frame allocator and immediately reissued while a st…

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

Zephyr RTOS versions 4.3.0 through 4.4.2 on arm64 with demand paging and userspace isolation enabled contain a TLB management flaw that lets a local unprivileged thread retain stale read/write access to physical memory reclaimed by the kernel or another domain. This breaks the memory isolation boundary, enabling information disclosure and memory corruption across trust boundaries. Leadership should care because products relying on Zephyr's userspace isolation for security guarantees are affected, and exploitation requires only local user-mode code plus memory pressure, not remote access.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.1%
Top 97% exploitable
Prevalence
Medium
widely used embedded RTOS; vulnerable arm64 demand-paging userspace build uncommon
Social Media
1
Sightings
Data Quality
3 sources
Confidence: Low

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 0.1%
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· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Small
Automatable· derived
No
Human Impact
High

Priority Score

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

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.

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.

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

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