CVE-2022-50505CVE-2022-50505是Linux内核中AMD IOMMU(Input/Output Memory Management Unit)驱动程序中的一个资源管理缺陷漏洞。该漏洞位于ppr_notifier()函数中,具体表现为PCI设备的引用计数泄漏问题。根据pci_get_domain_bus_and_slot()函数的注释说明,该函数在返回PCI设备时会增加其引用计数,调用者在使用完该设备后必须通过调用pci_dev_put()来递减引用计数。然而,在ppr_notifier()函数的原始实现中,缺少了对pci_dev_put()的调用,导致每次调用该函数时都会产生一次引用计数泄漏。随着系统运行时间的推移,泄漏的引用计数会不断累积,最终可能导致PCI设备结构无法被正常释放,引发系统稳定性问题,严重时可导致系统崩溃或不可用。该漏洞的CVSS评分为5.5,属于中危级别,主要影响系统的可用性,对机密性和完整性没有直接影响。攻击者需要本地低权限访问权限即可触发此漏洞,无需用户交互。该漏洞已在多个Linux内核稳定版本中得到修复。
从技术层面分析,该漏洞的根本原因在于Linux内核AMD IOMMU驱动中ppr_notifier()函数的资源管理不当。ppr_notifier()函数用于处理PCI设备的PPR(Peripheral Page Request)通知,当IOMMU检测到设备发出的页请求时会调用此函数。在函数实现中,通过调用pci_get_domain_bus_and_slot()来获取对应的PCI设备指针,该函数内部会调用pci_dev_get()增加目标设备的引用计数,确保设备在使用期间不会被释放。然而,原代码在完成设备操作后直接返回,没有调用对应的pci_dev_put()来递减引用计数。这种泄漏在系统长时间运行或频繁触发PPR通知的场景下会逐渐累积,导致内核为该PCI设备维护的kobject引用计数持续增长。泄漏的引用计数会阻止设备在热插拔或驱动卸载时被正确释放,可能造成内核内存泄漏,严重时触发内核警告(WARNING)或导致系统不稳定甚至崩溃。攻击利用方面,由于该漏洞需要本地权限才能触发(AV:L),攻击者可以通过编写恶意程序持续触发PPR通知路径,加速引用计数泄漏,或者在特定条件下利用此缺陷结合其他漏洞进行权限提升或拒绝服务攻击。修复方案是在ppr_notifier()函数的适当位置添加pci_dev_put()调用,确保引用计数平衡。