CVE-2022-50524CVE-2022-50524是Linux内核中MediaTek IOMMU(输入输出内存管理单元)驱动的一个空指针解引用漏洞。该漏洞源于iommu/mediatek驱动在调用platform_get_resource()函数获取平台资源后,未对其返回值进行有效性检查,便直接将其传递给resource_size()函数进行处理。在某些情况下,platform_get_resource()可能返回NULL指针,当代码尝试对NULL指针调用resource_size()时,将触发空指针解引用错误,导致内核崩溃或系统不可用。
该漏洞的CVSS 3.1评分为5.5分,属于中危级别。其攻击向量为本地攻击(AV:L),攻击者需要具有低权限(PR:L)即可触发,无需用户交互(UI:N)。漏洞对机密性影响较低(C:L),对完整性无影响(I:N),但对系统可用性影响较高(A:H),意味着成功利用该漏洞可能导致系统拒绝服务(DoS)。
此漏洞影响Linux内核的MediaTek IOMMU子系统,该子系统主要用于在基于MediaTek芯片的平台上管理DMA(直接内存访问)和设备的内存映射。由于IOMMU是系统硬件资源管理的关键组件,其异常可能导致整个系统崩溃。该漏洞已在多个Linux内核稳定版本中得到修复,包括通过git.kernel.org发布的多个补丁。
该漏洞的技术原理如下:
1. **漏洞位置**:Linux内核drivers/iommu/mtk_iommu.c文件中的MediaTek IOMMU驱动初始化代码。
2. **根本原因**:在驱动初始化或探测(probe)过程中,代码调用platform_get_resource()函数从设备树(Device Tree)或ACPI表中获取平台资源(如内存区域寄存器地址)。platform_get_resource()函数在无法找到对应资源时,会返回NULL指针。
3. **缺陷代码模式**:原始代码未检查platform_get_resource()的返回值是否为NULL,直接将其结果传递给resource_size()函数。resource_size()函数内部会访问传入的resource结构体的成员,当传入NULL指针时,会触发空指针解引用(null-ptr-deref),导致内核Oops或panic。
4. **触发条件**:当MediaTek IOMMU设备在设备树中的资源描述缺失或异常时(例如某些定制硬件平台或模拟环境中),platform_get_resource()将返回NULL,触发漏洞。
5. **利用方式**:本地攻击者可以通过加载特定的内核模块、修改设备树配置或在支持的MediaTek平台上运行特制的代码来触发该漏洞。由于需要本地访问权限和低权限认证,利用门槛相对较低,但影响仅限于本地拒绝服务。
6. **修复方案**:在调用resource_size()之前,增加对platform_get_resource()返回值的NULL检查,如果返回NULL则返回错误码(如-ENODEV或-EINVAL),阻止后续的空指针访问。