CVE-2025-39958CVE-2025-39958是Linux内核s390架构IOMMU(输入输出内存管理单元)子系统中的一个高危漏洞。当PCI设备通过热插拔方式被意外移除(surprise hotplug)时,内核仍可能尝试将该设备附加到默认域中,这一操作发生在__iommu_release_dma_ownership()拆卸过程中,或在__iommu_probe_device()探测过程中由于移除发生在探测期间而触发。
在上述两种情况下,zpci_register_ioat()调用会失败并返回一个表示设备句柄无效的条件码(cc值),因为该设备已不再被虚拟机监控器(hypervisor)视为实例的一部分。当前实现中,这种失败会导致s390_iommu_attach_device()返回错误,进而触发__iommu_group_set_domain_nofail()中的WARN_ON()警告,因为附加到默认域的操作绝不应该失败。
该漏洞的CVSS评分为7.8,属于高危级别。虽然设备被hypervisor隔离后无法进行DMA操作,IOMMU翻译也不会产生实际影响,但WARN_ON()的触发可能导致内核日志污染、系统不稳定甚至在某些配置下导致内核panic。攻击者需要本地低权限访问即可触发此漏洞,无需用户交互。
该漏洞的技术原理涉及Linux内核s390架构下IOMMU的设备管理机制。具体技术细节如下:
1. **触发路径**:当PCI设备被surprise hotplug移除时,内核中的IOMMU子系统仍会尝试通过s390_iommu_attach_device()将设备附加到默认域。这一调用最终会执行zpci_register_ioat(),该函数通过PCI指令与hypervisor通信以注册IOAT(I/O Address Translation)表。
2. **失败原因**:由于设备已被移除,hypervisor不再识别该设备句柄,因此zpci_register_ioat()返回的条件码指示设备句柄无效。这是hypervisor层面的状态变化导致的,与内核逻辑无关。
3. **错误传播问题**:当前代码在收到错误返回值后直接返回错误,导致s390_iommu_attach_device()失败。由于附加到默认域是一个必须成功的操作(否则设备将无法正常工作),内核通过WARN_ON()来检测这种异常情况。
4. **修复方案**:修复方案是引入一个辅助函数来检查错误是否需要传播或忽略。对于设备处于错误状态或已被移除的情况,错误应该被忽略,因为设备已被hypervisor隔离,DMA操作不可能发生,IOMMU翻译也不会产生实际效果。热插拔事件处理将负责后续的设备清理工作。
5. **利用方式**:本地攻击者可以通过触发PCI设备的surprise hotplug移除事件来利用此漏洞。虽然该漏洞本身不会直接导致权限提升或代码执行,但它可能导致内核警告、系统不稳定,在极端情况下可能触发内核panic造成拒绝服务。