CVE-2022-50521CVE-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,使内核不分配输出缓冲区,从而避免内存泄漏。