Description
In the Linux kernel, the following vulnerability has been resolved:

x86/mm/pat: Allocate split page tables as kernel page tables

A PTE is allocated directly without going through the standard page table
allocation routines (such as pte_alloc_one_kernel()) when the CPA code
splits a large page (__split_large_page()).

This means the page table constructor is never called nor is the page table
marked as a kernel page table.

The former results in the folio associated with the page table not being
marked as a page table (__pagetable_ctor() is never called thus neither is
__folio_set_pgtable()) nor are statistics updated to reflect
it (lruvec_stat_add_folio() is never called).

The latter issue of failing to mark the page table as a kernel page
table (ptdesc_set_kernel() is never called) is far more problematic.

Since commit:

5ba2f0a15564 ("mm: introduce deferred freeing for kernel page tables")

kernel page table freeing has been batched and since the
subsequent commit:

e37d5a2d60a3 ("iommu/sva: invalidate stale IOTLB entries for kernel address space")

IOTLB cache entries for kernel page tables have been invalidated upon
being freed.

Since split page tables are freed without this invalidation, the IOTLB
can contain stale entries for them.

Resolve the issue by using the ordinary PTE allocation API at split time.

This results in these kernel page tables invoking a page table constructor,
and thus requires a page table destructor.

Destructors are not always present, like for early allocated direct map
page tables). Conditionally call pagetable_dtor_free() if the PG_table
folio flag for the ptdesc is set, otherwise we free the page table via
pagetable_free().

Regardless of which path is taken page tables marked as kernel page tables,
which now includes split page tables, take the correct route through
pagetable_free_kernel().

There is a user-visible side effect in that split page tables will appear
in nr_page_table_pages in /proc/vmstat (as do other kernel page tables
allocated after early boot), however this is a positive change.

This issue started being markedly problematic after commit:

5ba2f0a15564 ("mm: introduce deferred freeing for kernel page tables")

so choose this as the Fixes target.

[ dhansen: rephrase in imperative mood ]
Published: 2026-09-25
Score: 8.2 High
EPSS: < 1% Very Low
KEV: No
Impact: Stale IOTLB entries could lead to memory corruption or denial of service
Action: Immediate patch
AI Analysis

Impact

The flaw, characterized by CWE-825, is in the Linux kernel’s handling of large page splits on x86. When a large page is split, the kernel allocates a new page-table entry directly, bypassing the normal page-table allocation API. Because the page-table constructor is never invoked, the resulting page table is not marked as a kernel page table, so the IOTLB cache is not invalidated when the split page table is freed. This can leave stale IOTLB entries that may reference invalid memory, potentially causing memory corruption or a crash.

Affected Systems

All Linux kernels that include the x86/mm/pat code path and contain commit 5ba2f0a15564 or later— that is, every distribution using a kernel version where deferred freeing of kernel page tables was introduced and where large pages may be split during normal operation. The issue applies regardless of distribution, configuration, or whether direct map page tables are used.

Risk and Exploitability

A CVSS score of 8.2 indicates high severity, but the EPSS score is less than 1%, so the likelihood of exploitation is low. The vulnerability is not listed in CISA's KEV catalog, meaning no known active attacks. Based on the description, it is inferred that exploiting this vulnerability would require kernel‑level privileges or the ability to trigger a large‑page split, after which stale IOTLB entries could be used to corrupt memory or crash the kernel. Due to the high impact if successfully exploited, users should treat this as a priority to patch.

Generated by OpenCVE AI on October 1, 2026 at 14:20 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Apply a kernel update that routes split page tables through the standard PTE allocator, ensuring proper constructor use and IOTLB invalidation.
  • Reboot the system after installing the update to rebuild all page tables with the corrected logic.
  • Verify that kernel logs no longer contain IOTLB warnings and check /proc/vmstat to confirm that split page tables are now accounted for as kernel page tables.

Generated by OpenCVE AI on October 1, 2026 at 14:20 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Thu, 01 Oct 2026 12:30:00 +0000

Type Values Removed Values Added
Weaknesses CWE-416
CWE-665
CWE-781

Tue, 29 Sep 2026 13:15:00 +0000


Sat, 26 Sep 2026 00:00:00 +0000

Type Values Removed Values Added
Weaknesses CWE-416
CWE-665
CWE-781

Fri, 25 Sep 2026 15:00:00 +0000

Type Values Removed Values Added
Metrics cvssV3_1

{'score': 8.2, 'vector': 'CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H'}


Fri, 25 Sep 2026 10:30:00 +0000

Type Values Removed Values Added
Description In the Linux kernel, the following vulnerability has been resolved: x86/mm/pat: Allocate split page tables as kernel page tables A PTE is allocated directly without going through the standard page table allocation routines (such as pte_alloc_one_kernel()) when the CPA code splits a large page (__split_large_page()). This means the page table constructor is never called nor is the page table marked as a kernel page table. The former results in the folio associated with the page table not being marked as a page table (__pagetable_ctor() is never called thus neither is __folio_set_pgtable()) nor are statistics updated to reflect it (lruvec_stat_add_folio() is never called). The latter issue of failing to mark the page table as a kernel page table (ptdesc_set_kernel() is never called) is far more problematic. Since commit: 5ba2f0a15564 ("mm: introduce deferred freeing for kernel page tables") kernel page table freeing has been batched and since the subsequent commit: e37d5a2d60a3 ("iommu/sva: invalidate stale IOTLB entries for kernel address space") IOTLB cache entries for kernel page tables have been invalidated upon being freed. Since split page tables are freed without this invalidation, the IOTLB can contain stale entries for them. Resolve the issue by using the ordinary PTE allocation API at split time. This results in these kernel page tables invoking a page table constructor, and thus requires a page table destructor. Destructors are not always present, like for early allocated direct map page tables). Conditionally call pagetable_dtor_free() if the PG_table folio flag for the ptdesc is set, otherwise we free the page table via pagetable_free(). Regardless of which path is taken page tables marked as kernel page tables, which now includes split page tables, take the correct route through pagetable_free_kernel(). There is a user-visible side effect in that split page tables will appear in nr_page_table_pages in /proc/vmstat (as do other kernel page tables allocated after early boot), however this is a positive change. This issue started being markedly problematic after commit: 5ba2f0a15564 ("mm: introduce deferred freeing for kernel page tables") so choose this as the Fixes target. [ dhansen: rephrase in imperative mood ]
Title x86/mm/pat: Allocate split page tables as kernel page tables
First Time appeared Linux
Linux linux Kernel
CPEs cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
Vendors & Products Linux
Linux linux Kernel
References

Subscriptions

Linux Linux Kernel
cve-icon MITRE

Status: PUBLISHED

Assigner: Linux

Published:

Updated: 2026-10-19T09:08:43.483Z

Reserved: 2026-09-24T16:01:01.152Z

Link: CVE-2026-97525

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-09-25T11:17:02.647

Modified: 2026-10-19T10:17:21.410

Link: CVE-2026-97525

cve-icon Redhat

Severity : Moderate

Publid Date: 2026-09-25T00:00:00Z

Links: CVE-2026-97525 - Bugzilla

cve-icon OpenCVE Enrichment

Updated: 2026-10-01T14:30:08Z

Weaknesses
  • CWE-825

    Expired Pointer Dereference