CVE-2026-31686该漏洞存在于Linux内核的内存管理子系统中,具体涉及KASAN(内核地址消毒剂)机制对页目录(pXds)的处理。问题的根源在于`kasan_free_pxd()`函数错误地假设页表始终与结构页对齐。然而,在某些架构(如使用64K页大小的PowerPC)上,PUD表可能来自名为`pgtable-2^9`的slab缓存,并不一定满足这种对齐要求。这导致在使用`page_to_virt(pxd_page())`时获取了错误的地址,进而引发双重释放错误。该错误会导致系统在处理PMEM(持久内存)相关操作(如ndctl命令)时触发内核崩溃,严重影响了系统的稳定性和可用性。
漏洞的核心在于Linux内核`mm/kasan.c`中的`kasan_free_pxd()`函数实现缺陷。该函数原本设计用于释放KASAN的页目录影子内存。在实现中,它通过`page_to_virt(pxd_page())`来获取要释放的内存地址,这隐含了页表项(PUD/PMD等)必须直接映射到一个完整的`struct page`的假设。然而,在PowerPC等特定架构上,特别是当启用64KB页面大小时,页目录表(例如PUD表)的大小为4096字节。为了节省内存,这些表并非总是从伙伴系统分配,而是从专用的slab缓存(如`pgtable-2^9`)中分配。由于slab分配的对象不一定具备`struct page`对齐的特性,直接使用`page_to_virt`转换会导致地址计算错误。当系统尝试释放这些内存时,由于地址计算错误,内核尝试释放一个已经被释放或无效的内存区域,从而触发了KASAN的double-free检测机制。攻击者或本地低权限用户可以通过触发特定的内存管理操作(例如利用`ndctl`工具管理持久内存命名空间)来诱发该崩溃,导致系统拒绝服务。