CVE-2023-53630CVE-2023-53630是Linux内核iommufd(IOMMU file descriptor)子系统中存在的一个内存安全漏洞。该漏洞位于`__iopt_area_unfill_domain`函数中,涉及页面解除固定(unpinning)操作的逻辑错误。当存在访问权限时,函数在计算`batch_last_index`时错误地使用了错误的索引值,导致解除映射操作越过了页面的实际边界,破坏了从未被映射的页面数据。
该漏洞由著名的内核模糊测试工具syzkaller发现,在测试过程中触发了内核的调试警告(WARNING),提示检测到固定页面数量不一致的问题。漏洞的影响路径涉及`iopt_area_unfill_domain`、`iopt_table_remove_domain`、`iommufd_device_selftest_detach`等多个内核函数调用链,最终在`iommufd_destroy`过程中触发。
从CVSS评分来看,该漏洞评分为5.5分,属于中危级别。攻击者需要本地低权限访问即可触发此漏洞,无需用户交互。漏洞的主要影响是可用性(高),可能导致系统不稳定、内存损坏或内核崩溃。虽然机密性和完整性影响较低,但内存损坏可能导致更严重的安全后果。该漏洞主要影响使用iommufd功能的系统,如虚拟化环境中的设备直通场景。
该漏洞的根本原因在于`__iopt_area_unfill_domain`函数中`batch_last_index`的计算逻辑错误。在函数输入时,批次(batch)要么为空,要么已经被调整以跨越任何访问,因此它将从我们解除映射的位置开始。然而,代码错误地使用了错误的索引来计算`batch_last_index`,而非正确的`start_index`。
具体技术细节如下:
1. 在iommufd的页面管理中,当解除IOMMU域的页面映射时,需要逐批处理页面解除固定操作
2. `batch_last_index`的计算应该基于`start_index`,因为批次要么是空的,要么已经调整到从解除映射的起始点开始
3. 由于使用了错误的索引,解除映射操作会越过实际页面的边界,访问并修改从未映射的页面数据
4. 这导致内存损坏,在大多数情况下会触发内核的调试警告,检测到固定页面数量与预期不符
利用方式:
- 攻击者需要本地访问权限(PR:L)
- 通过调用iommufd相关的ioctl接口,触发页面解除映射流程
- 具体路径为:`iommufd_fops_ioctl` → `iommufd_destroy` → `iommufd_object_destroy_user` → `iommufd_selftest_destroy` → `iommufd_device_selftest_detach` → `iopt_table_remove_domain` → `iopt_area_unfill_domain` → `__iopt_area_unfill_domain`
- 在该路径中触发错误的页面解除固定操作,导致内存损坏
内核版本6.3.0-rc2及之前的版本受此漏洞影响,修复版本通过正确使用`start_index`来计算`batch_last_index`,并添加了WARN_ON健全性检查。