CVE: CVE-2025-37922
Published: 2025-05-20
Description: In the Linux kernel, the following vulnerability has been resolved:

book3s64/radix : Align section vmemmap start address to PAGE_SIZE

A vmemmap altmap is a device-provided region used to provide
backing storage for struct pages. For each namespace, the altmap
should belong to that same namespace. If the namespaces are
created unaligned, there is a chance that the section vmemmap
start address could also be unaligned. If the section vmemmap
start address is unaligned, the altmap page allocated from the
current namespace might be used by the previous namespace also.
During the free operation, since the altmap is shared between two
namespaces, the previous namespace may detect that the page does
not belong to its altmap and incorrectly assume that the page is a
normal page. It then attempts to free the normal page, which leads
to a kernel crash.

Kernel attempted to read user page (18) - exploit attempt? (uid: 0)
BUG: Kernel NULL pointer dereference on read at 0x00000018
Faulting instruction address: 0xc[PII_REDACTED]30c7c
Oops: Kernel access of bad area, sig: 11 [#1]
LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=2048 NUMA pSeries
CPU: 32 PID: 2104 Comm: ndctl Kdump: loaded Tainted: G        W
NIP:  c[PII_REDACTED]30c7c LR: c[PII_REDACTED]30e00 CTR:[PII_REDACTED]007ffe
REGS: c000000015e57040 TRAP: 0300   Tainted: G        W
MSR: [PII_REDACTED]80b033 <SF,VEC,VSX,EE,FP,ME,IR,DR,RI,LE>  CR: 84482404
CFAR: c[PII_REDACTED]30dfc DAR: [PII_REDACTED] DSISR: 40000000 IRQMASK: 0
GPR00: c[PII_REDACTED]30e00 c000000015e572e0 c000000002c5cb00 c00c[PII_REDACTED]40
GPR04: [PII_REDACTED] [PII_REDACTED] [PII_REDACTED][PII_REDACTED]00001f
GPR08: [PII_REDACTED] [PII_REDACTED] [PII_REDACTED] [PII_REDACTED]
GPR12: c[PII_REDACTED]d2fb0 c0000060de6b0080 [PII_REDACTED] c0000060dbf90020
GPR16: c00c[PII_REDACTED]00 [PII_REDACTED] [PII_REDACTED] c000000125b20f00
GPR20: [PII_REDACTED] [PII_REDACTED] ffffffffffffffff c00c000101007fff
GPR24: [PII_REDACTED] [PII_REDACTED] [PII_REDACTED] [PII_REDACTED]
GPR28: [PII_REDACTED] [PII_REDACTED] [PII_REDACTED] c00c[PII_REDACTED]40
NIP [c[PII_REDACTED]30c7c] get_pfnblock_flags_mask+0x7c/0xd0
LR [c[PII_REDACTED]30e00] free_unref_page_prepare+0x130/0x4f0
Call Trace:
free_unref_page+0x50/0x1e0
free_reserved_page+0x40/0x68
free_vmemmap_pages+0x98/0xe0
remove_pte_table+0x164/0x1e8
remove_pmd_table+0x204/0x2c8
remove_pud_table+0x1c4/0x288
remove_pagetable+0x1c8/0x310
vmemmap_free+0x24/0x50
section_deactivate+0x28c/0x2a0
__remove_pages+0x84/0x110
arch_remove_memory+0x38/0x60
memunmap_pages+0x18c/0x3d0
devm_action_release+0x30/0x50
release_nodes+0x68/0x140
devres_release_group+0x100/0x190
dax_pmem_compat_release+0x44/0x80 [dax_pmem_compat]
device_for_each_child+0x8c/0x100
[dax_pmem_compat_remove+0x2c/0x50 [dax_pmem_compat]
nvdimm_bus_remove+0x78/0x140 [libnvdimm]
device_remove+0x70/0xd0

Another issue is that if there is no altmap, a PMD-sized vmemmap
page will be allocated from RAM, regardless of the alignment of
the section start address. If the section start address is not
aligned to the PMD size, a VM_BUG_ON will be triggered when
setting the PMD-sized page to page table.

In this patch, we are aligning the section vmemmap start address
to PAGE_SIZE. After alignment, the start address will not be
part of the current namespace, and a normal page will be allocated
for the vmemmap mapping of the current section. For the remaining
sections, altmaps will be allocated. During the free operation,
the normal page will be correctly freed.

In the same way, a PMD_SIZE vmemmap page will be allocated only if
the section start address is PMD_SIZE-aligned; otherwise, it will
fall back to a PAGE-sized vmemmap allocation.

Without this patch
==================
NS1 start               NS2 start
 _________________________________________________________
|         NS1               |            NS2              |
 ---------------------------------------------------------
| Altmap| Altmap | .....|Altmap| Altmap | ...........
|  NS1  |  NS1   
---truncated---
CVSS Score: 5.5 (MEDIUM)
CWE: CWE-476
References: https://git.kernel.org/stable/c/400be767deaf31a073c6d14c5d151ae5ac2a60e2; https://git.kernel.org/stable/c/7f5476d80f2cb364701cd1fa138a14b241ca99e9; https://git.kernel.org/stable/c/9a8d4d7072d4df108479b1adc4b0840e96f6f61d