CVE-2026-31553Linux内核中的KVM (Kernel-based Virtual Machine) arm64组件存在一个严重的内存访问漏洞。该漏洞源于`__kvm_at_swap_desc()`函数中描述符地址的计算逻辑错误。在获取S1/S2描述符的虚拟地址时,代码使用了`(u64 __user *)hva + offset`的方式进行指针运算。当offset不为零时,由于指针类型为u64,实际计算出的地址为`hva + offset * 8`,而非预期的`hva + offset`。这种指针算术错误导致内核访问了错误的内存地址,可能引发越界读写。鉴于KVM运行在内核高权限级别,该漏洞可能被本地低权限用户利用,导致系统崩溃、权限提升甚至虚拟机逃逸,严重威胁系统的机密性、完整性和可用性。
该漏洞主要影响Linux内核的ARM64架构KVM虚拟化模块。问题出在`__kvm_at_swap_desc()`函数中,该函数负责交换阶段1(S1)和阶段2(S2)的页表描述符。原始代码意图是根据宿主机虚拟地址(HVA)和偏移量来定位描述符,正确的逻辑应该是字节级的偏移,即`hva + offset`。然而,开发者错误地将HVA强制转换为`u64 __user *`指针后直接加上offset。在C语言中,指针加法会根据指针指向的数据类型大小进行调整。由于`u64`占用8个字节,编译器将offset乘以8,导致最终地址偏移量是预期的8倍。这种逻辑缺陷使得内核可能访问到非预期的内存区域。攻击者如果能够控制相关参数或利用特定的内存布局,即可触发越界访问,覆盖关键内核数据结构或泄露敏感信息,从而实现本地权限提升(LPE)。