CVE-2022-50471CVE-2022-50471是Linux内核xen/gntdev驱动中的一个内存管理缺陷漏洞。该漏洞源于gntdev驱动代码未能正确处理VMA(虚拟内存区域)拆分场景,特别是在半虚拟化(PV)Xen域环境中。当用户进程创建由多个grant映射组成的gntdev映射,并对这些页面进行munmap操作时,会导致内核在dmesg中记录'BUG: Bad page map'错误消息,同时Xen管理程序(如果使用CONFIG_DEBUG编译)会触发受影响PV域中的通用保护错误(General Protection Fault)。该漏洞的根本原因是gntdev_grant_map结构中的vma字段主要用于检查映射的起始和结束地址,但在VMA拆分后这些地址可能发生变化,并且一个gntdev映射可能关联多个VMA。攻击者可以利用此漏洞通过本地低权限操作导致系统崩溃或拒绝服务,影响系统可用性。CVSS评分为5.5分,攻击向量为本地,需要低权限认证,无需用户交互,对机密性和完整性无影响,但对可用性影响较高。
该漏洞的技术原理涉及gntdev驱动中VMA(虚拟内存区域)管理和grant映射引用计数的不一致性。在漏洞版本中,gntdev_grant_map结构体的vma字段被用于跟踪映射的虚拟内存区域,但该字段存在以下问题:1)当VMA被拆分时,map->vma指向的地址范围可能不再准确;2)一个gntdev映射可能对应多个VMA,但代码逻辑仅维护单个vma指针;3)MMU notifier的移除时机不当,可能在仍有VMA引用时被移除。漏洞利用方式如下:攻击者首先通过mmap创建包含两个grant映射的gntdev映射,然后分别对每个页面调用munmap。由于vma字段处理不当,第一次munmap会触发bad pte错误,第二次munmap会引发Xen管理程序的GPF故障。此外,攻击者还可以通过MAP_FIXED方式在相同地址范围重新映射已存在的gntdev映射,利用unmap_grant_pages中的'being_removed'标志绕过清理逻辑,导致Xen报告grant页面正在被解映射并触发GPF。修复方案包括:移除map->vma字段,改用map->pages_vm_start和(map->count << PAGE_SHIFT)确定原始映射范围;将mmu_interval_notifier_remove调用移至gntdev_put_map末尾;使用原子变量防止意外的gntdev映射重用。