CVE-2026-31397Linux内核mm/huge_memory模块在处理UFFDIO_MOVE操作时存在漏洞。当处理huge zero page路径时,src_folio被显式设为NULL,move_pages_huge_pmd函数未做有效检查直接使用,导致空指针解引用或伪造物理页帧号。此外,重建目标PMD时丢弃了pmd_special()状态,导致内核将特殊映射误判为普通页面,破坏引用计数。本地低权限攻击者可利用此造成系统崩溃或权限提升。
该漏洞位于Linux内核的mm/huge_memory.c文件中,具体涉及move_pages_huge_pmd()函数对UFFDIO_MOVE功能的处理。在处理huge zero page(大零页)时,代码将src_folio显式设置为NULL作为哨兵值。然而,在后续调用folio_mk_pmd(NULL, pgprot)时,NULL指针被传入folio_pfn()和page_to_pfn()。在启用SPARSEMEM_VMEMMAP的架构上,这会静默产生一个伪造的PFN,安装指向不存在物理内存的PMD;在其他内存模型上则直接导致NULL解引用崩溃。此外,修复前代码在huge zero page分支重建目标PMD,导致CONFIG_ARCH_HAS_PTE_SPECIAL架构上的pmd_special()状态丢失。这使得vm_normal_page_pmd()将移动后的huge zero PMD误认为普通页面,进而破坏其引用计数。攻击者需具备本地低权限,通过精心构造的userfaultfd操作触发该漏洞路径,导致内核崩溃或潜在的权限提升。