CVE-2026-31787Linux内核中的xen/privcmd驱动程序存在一个双重释放漏洞。该漏洞是由于VMA(虚拟内存区域)分割机制处理不当引起的。当用户空间对privcmd映射执行部分munmap操作时,内核会分割VMA。由于缺少.may_split回调,分割被允许,且新的VMA会共享原VMA的vm_private_data(指向pages数组)。当部分区域关闭时,释放了pages数组,导致剩余VMA持有悬垂指针,最终发生双重释放,可能导致系统崩溃或权限提升。
该漏洞位于Linux内核的Xen hypervisor接口代码中,具体涉及`privcmd_vm_ops`的实现。该结构体定义了`.close`回调函数`privcmd_close`用于清理资源,但未定义`.open`和`.may_split`回调。当用户空间程序对通过privcmd创建的内存映射执行部分`munmap()`系统调用时,内核会调用`__split_vma()`尝试分割该VMA。由于`may_split`为空,分割操作默认被允许。在分割过程中,`vm_area_dup()`会将原VMA的`vm_private_data`(一个指向页数组的指针)直接复制到新的VMA中,而没有任何引用计数更新或内存复制操作。这导致两个VMA指向同一块内存。当被取消映射的部分VMA被关闭时,`privcmd_close`被触发,执行`xen_unmap_domain_gfn_range()`、`xen_free_unpopulated_pages()`以及`kvfree(pages)`,释放了共享的pages数组。此时,剩余的VMA仍然持有一个指向已释放内存的指针(悬垂指针)。当该VMA后续被销毁时,`privcmd_close`会再次尝试释放同一块内存,从而触发双重释放错误。攻击者可利用此漏洞造成内核崩溃(拒绝服务)或潜在的本地权限提升。