CVE-2026-43147Linux内核中存在一个拒绝服务漏洞,该问题源于PCI/IOV子系统在处理SR-IOV(单根I/O虚拟化)时的锁机制逻辑错误。具体而言,开发团队回滚了此前引入的“PCI重扫描移除锁”提交,因为该修复实际上导致了死锁。当系统在启用SR-IOV虚拟功能后尝试移除PCI设备时,会递归地获取`pci_rescan_remove_lock`锁,导致内核进程陷入永久等待。本地攻击者可通过向sysfs接口发送特定指令序列触发此漏洞,造成系统死锁或关键服务不可用。该漏洞虽然已被回滚,但恢复了原始问题,需等待后续完整的修复方案。
该漏洞的技术核心在于Linux内核互斥锁的递归获取错误,涉及函数`sriov_disable`与`pci_stop_and_remove_bus_device_locked`之间的调用死锁。受影响的内核路径试图通过`pci_rescan_remove_lock`来保护PCI总线的重扫描和移除操作。然而,当用户先通过`echo <NUM> > .../sriov_numvfs`启用虚拟功能,紧接着执行`echo 1 > .../remove`移除设备时,系统会陷入死锁。分析调用栈发现,`remove_store`函数调用`pci_stop_and_remove_bus_device_locked`时已经持有了锁,但在执行`pci_device_remove`及后续的`sriov_disable`流程时,代码再次尝试获取同一把锁。由于互斥锁不支持递归获取,当前任务在`__mutex_lock_common`中阻塞,等待自己释放锁,从而形成死锁。这导致设备移除操作无法完成,且可能阻塞其他内核线程,最终导致系统崩溃或必须强制重启。