CVE-2025-39939CVE-2025-39939是Linux内核s390架构IOMMU子系统中存在的一个高危内存损坏漏洞。该漏洞位于`zpci_get_iommu_ctrs()`函数中,当系统使用identity domain(身份映射域)为PCI设备配置IOMMU时,由于identity domain并非由`s390_domain`结构体支撑,函数通过`to_s390_domain()`宏进行类型转换时会得到一个无效的地址(初始值为零)。该地址在后续通过sysfs读取设备统计信息时会被按需读取,从而触发KASAN(Kernel Address Sanitizer)检测到全局越界访问错误(global-out-of-bounds),具体表现为`zpci_fmb_enable_device`函数中的BUG报告。攻击者在拥有本地低权限的情况下,可利用该漏洞触发内存损坏,可能导致内核崩溃、信息泄露或权限提升。该漏洞影响机密性、完整性和可用性,CVSS评分为7.8,属于高危级别。漏洞已在Linux内核主线通过提交17a58caf3863163c4a84a218a9649be2c8061443和b3506e9bcc777ed6af2ab631c86a9990ed97b474进行修复。
该漏洞的根本原因在于s390架构IOMMU子系统中identity domain与s390_domain结构体的不匹配设计。在Linux内核的s390 IOMMU实现中,`zpci_get_iommu_ctrs()`函数用于获取PCI设备的IOMMU计数器信息,这些计数器作为设备统计信息的一部分存储在`s390_domain`结构体中。函数内部通过`to_s390_domain()`宏将通用domain指针转换为`s390_domain`类型指针以访问计数器字段。然而,identity domain是一种特殊的IOMMU域,它使用恒等映射(identity mapping),并不包含`s390_domain`结构体的私有数据。当对identity domain执行`to_s390_domain()`转换时,宏会基于container_of机制计算出一个错误的地址偏移,该地址指向内存中的零值区域(bss段或未初始化区域)。此地址随后在sysfs读取触发`zpci_fmb_enable_device`时被解引用,导致全局越界内存访问。KASAN能够捕获此类越界访问并报告BUG。攻击向量为本地攻击(AV:L),攻击复杂度低(AC:L),仅需低权限(PR:L),无需用户交互(UI:N),可造成高机密性影响(C:H)、高完整性影响(I:H)和高可用性影响(A:H)。修复方案是在identity domain情况下直接返回NULL,跳过计数器获取逻辑,因为identity domain本身不需要这些统计计数器。