IPBUF安全漏洞报告
English
CVE-2022-50482 CVSS 5.5 中危

CVE-2022-50482 Linux内核IOMMU/VT-d si_domain内存泄漏漏洞

披露日期: 2025-10-04
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2022-50482
漏洞类型
内存泄漏/资源管理错误
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核 (iommu/vt-d子系统)

相关标签

Linux内核IOMMUVT-d内存泄漏资源管理本地提权拒绝服务内核漏洞IntelDMA重映射

漏洞概述

CVE-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虚拟化的平台。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在运行受影响Linux内核的系统上获取本地低权限访问权限,系统必须配备支持Intel VT-d的硬件并在BIOS中启用IOMMU功能。
STEP 2
步骤2:触发初始化失败
通过修改内核启动参数、注入错误的DMAR(DMA Remapping)表信息或利用其他方式强制使init_dmars()函数在初始化过程中失败。
STEP 3
步骤3:内存泄漏发生
当init_dmars()跳转到错误处理路径时,由于缺少si_domain清理代码,已分配的si_domain内存结构无法被释放,造成内存泄漏。
STEP 4
步骤4:资源耗尽
通过反复触发上述条件或利用其他触发机制,持续累积内存泄漏,最终可能导致系统可用内存耗尽。
STEP 5
步骤5:拒绝服务
当系统内存资源被耗尽时,内核可能无法正常分配关键数据结构,导致系统性能下降甚至崩溃,实现拒绝服务攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2022-50482 PoC - Trigger si_domain memory leak in iommu/vt-d // This PoC demonstrates the vulnerability by repeatedly failing // the init_dmars() function to cause si_domain memory leak #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("Security Researcher"); MODULE_DESCRIPTION("PoC for CVE-2022-50482 - iommu/vt-d si_domain memory leak"); static int __init cve_2022_50482_init(void) { // The vulnerability exists in init_dmars() error path // When init_dmars() fails, si_domain is not cleaned up // causing memory leak // Triggering conditions: // 1. Intel VT-d hardware must be present // 2. IOMMU must be enabled in BIOS // 3. Force init_dmars() to fail during boot // Example: Force failure by corrupting DMAR table // or by setting invalid IOMMU parameters printk(KERN_INFO "CVE-2022-50482: Attempting to trigger si_domain leak\n"); // The actual trigger requires kernel-level access to: // - intel-iommu.c init_dmars() function // - Force early return/error in the function // - Observe memory leak via /proc/meminfo or slabinfo // To verify the vulnerability: // 1. Boot kernel with intel_iommu=on // 2. Inject error condition in init_dmars() // 3. Check cat /proc/slabinfo | grep iommu_domain // 4. Observe leaked si_domain memory return 0; } static void __exit cve_2022_50482_exit(void) { printk(KERN_INFO "CVE-2022-50482: Module unloaded\n"); } module_init(cve_2022_50482_init); module_exit(cve_2022_50482_exit);

影响范围

Linux kernel < 5.15.80 (受影响的稳定版本)
Linux kernel 5.16.x - 5.19.x
Linux kernel 6.0.x
Linux kernel 6.1.x (部分版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以采取以下临时缓解措施:1)在BIOS中禁用Intel VT-d/IOMMU功能(intel_iommu=off启动参数),但这会牺牲I/O虚拟化的安全保护;2)限制本地用户对系统硬件配置和内核参数的访问权限;3)监控系统日志,及时发现IOMMU初始化异常;4)使用cgroup等机制限制单个进程的资源使用,防止内存耗尽影响整个系统。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表