CVE-2022-50482CVE-2022-50482是Linux内核Intel IOMMU(VT-d)驱动程序中的一个资源管理漏洞。该漏洞位于init_dmars()函数的错误处理路径中,当函数执行过程中发生失败时,没有正确清理已分配的si_domain内存结构,导致内存泄漏问题。
在Linux内核中,Intel VT-d(Virtualization Technology for Directed I/O)是用于实现I/O虚拟化的硬件辅助技术,iommu/vt-d驱动程序负责管理DMA重映射和中断重映射功能。si_domain(Source Identifier Domain)是该驱动程序中的重要数据结构,用于管理和跟踪IOMMU域信息。
该漏洞最初是在kmem_cache_destroy()调用时通过splat信息发现的。在引入commit ee2653bbe89d(移除domain和devinfo mempool)之前的内核版本中,由于iommu_domain缓存中仍存在对象,导致销毁时出现异常。虽然mempool代码已被移除,但在init_dmars()失败时仍然存在si_domain内存泄漏的问题。该漏洞的CVSS评分为5.5,属于中等严重等级,攻击者需要本地低权限访问即可触发,可导致系统可用性受到严重影响。
该漏洞的根本原因在于Linux内核iommu/vt-d驱动程序的错误处理路径不完善。具体技术细节如下:
1. **漏洞位置**:drivers/iommu/intel-iommu.c文件中的init_dmars()函数。
2. **触发条件**:当init_dmars()函数在初始化过程中遇到错误(如硬件初始化失败、内存分配失败等)时,函数跳转到错误处理标签,但错误处理代码没有正确释放已分配的si_domain资源。
3. **漏洞原理**:si_domain是IOMMU子系统中用于标识和管理I/O虚拟化域的核心数据结构。在init_dmars()正常执行路径中,si_domain会被正确初始化和使用。但在错误路径中,由于缺少对si_domain的清理代码(如domain_exit()或iommu_domain_free()调用),导致si_domain占用的内存无法被释放。
4. **历史背景**:在commit ee2653bbe89d之前,由于mempool机制的存在,iommu_domain缓存中残留的对象会导致kmem_cache_destroy()触发splat警告。虽然该commit移除了mempool代码,但底层的内存泄漏问题并未得到完全解决。
5. **利用方式**:攻击者可以通过反复触发IOMMU初始化失败的条件(如通过特定的硬件配置或系统状态),导致si_domain内存持续累积泄漏。虽然每次泄漏的内存量有限,但持续触发可导致系统内存耗尽,最终引发系统不稳定或拒绝服务。
6. **影响范围**:该漏洞影响所有使用Intel VT-d硬件的Linux系统,包括服务器、工作站等支持I/O虚拟化的平台。