CVE-2022-50470CVE-2022-50470是Linux内核xHCI(可扩展主机控制器接口)驱动中的一个高危内存安全漏洞。该漏洞源于xHCI驱动在释放虚拟设备(virt device)时未能正确将设备端点从带宽列表(bandwidth list)中移除。在正常情况下,端点在被丢弃时会从带宽列表中删除,之后虚拟设备才会被释放。然而,当xHC主机控制器正在关闭或被移除时,相关函数会提前返回以避免与非可访问的主机控制器交互,导致端点无法被干净地从带宽列表中删除。
该漏洞会在解绑xhci-pci模块时触发list_del损坏(list_del corruption)内核崩溃,具体发生在xhci_mem_cleanup()函数尝试从带宽列表中删除已经被释放的端点时。此漏洞仅影响使用软件带宽检查的主机控制器,目前仅有Intel Panther Point PCH(Ivy Bridge)中的xHC控制器受此影响。攻击者利用此漏洞需要本地低权限访问,但一旦成功利用,可导致内核崩溃(拒绝服务),并可能造成权限提升或任意代码执行,严重影响系统的机密性、完整性和可用性。
从技术层面分析,该漏洞的核心问题在于xHCI驱动中端点生命周期管理与带宽列表管理的同步缺陷。
在xHCI驱动的正常执行流程中,当虚拟设备的端点被丢弃(drop)时,会先将其从带宽列表(bandwidth list)中移除,然后再释放虚拟设备结构体。这一顺序确保了带宽列表中的指针在端点被释放前已经清理完毕,避免了悬挂指针(dangling pointer)问题。
然而,当xHC主机控制器处于死亡状态(dying)或正在被移除(being removed)时,xhci_free_dev()等关键函数会检测到主机控制器状态异常,并提前返回以避免与不可访问的硬件交互。这种防御性提前返回导致端点未能从带宽列表中正确移除,但虚拟设备的释放流程仍然继续执行。
随后,当xhci_mem_cleanup()函数被调用以清理主机控制器的内存资源时,它会遍历带宽列表并尝试删除其中的端点。由于这些端点已经被释放,list_del操作将访问已释放的内存区域,触发list_del corruption内核崩溃。
该漏洞的利用条件包括:1)系统使用Intel Panther Point PCH(Ivy Bridge)芯片组的xHCI控制器;2)攻击者具有本地低权限访问权限;3)触发条件为解绑xhci-pci驱动(如通过echo命令卸载xhci_pci模块)。攻击者可通过执行modprobe -r xhci_pci等操作触发漏洞,导致系统内核崩溃(拒绝服务攻击),在某些情况下可能进一步利用内存损坏实现权限提升。