IPBUF安全漏洞报告
English
CVE-2025-39937 CVSS 5.5 中危

CVE-2025-39937 Linux内核rfkill-gpio驱动未初始化指针解引用漏洞

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

漏洞信息

漏洞编号
CVE-2025-39937
漏洞类型
空指针解引用
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (rfkill-gpio驱动)

相关标签

Linux内核空指针解引用rfkill-gpio拒绝服务本地攻击ACPI无线驱动CVE-2025-39937内核漏洞

漏洞概述

CVE-2025-39937是Linux内核中rfkill-gpio驱动存在的一个空指针解引用漏洞。该漏洞源于提交7d5e9737efda("net: rfkill: gpio: get the name and type from device property")引入的代码变更。在该变更之后,rfkill_find_type()函数被调用时,传入的本地变量"const char *type_name;"可能未被初始化。当rfkill-gpio驱动绑定到x86系统上的"BCM4752"或"LNV4752" ACPI设备时,rfkill->type通过ACPI设备ID的driver_data字段设置。由于这些设备没有"type"属性,device_property_read_string()调用将失败,导致type_name变量保持未初始化状态,从而可能引发空指针解引用导致系统崩溃。该漏洞的CVSS评分为5.5,属于中危级别,攻击向量为本地(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性和完整性无影响,但会导致高可用性影响(A:H),即系统崩溃或拒绝服务。值得注意的是,该漏洞长期未被捕获的原因有两个:一是实际拥有"BCM4752"/"LNV4752" ACPI设备的x86机器不多;二是栈上恰好在type_name存储位置处存放了NULL值。

技术细节

该漏洞的技术原理如下:在Linux内核rfkill-gpio驱动的probe函数中,驱动通过ACPI设备ID匹配来识别硬件设备。对于BCM4752和LNV4752设备,rfkill->type通过(unsigned)id->driver_data直接设置,不依赖设备属性。然而,在获取设备名称和类型时,代码调用device_property_read_string()来读取"type"属性。由于这些ACPI设备没有定义"type"设备属性,该调用会失败并返回非零值,但代码并未检查返回值,也未初始化type_name局部变量。随后,rfkill_find_type(type_name)被调用,传入未初始化的指针。虽然rfkill_find_type()本身接受NULL指针,但由于type_name未被显式初始化为NULL,其值取决于栈上的残留数据。如果栈上恰好有非NULL值,rfkill_find_type()将尝试解引用该指针,可能导致内核崩溃。修复方法非常简单:将type_name变量初始化为NULL,即"const char *type_name = NULL;"。这一修复确保了即使device_property_read_string()失败,type_name也保持为有效值(NULL),从而避免潜在的空指针解引用问题。该漏洞的利用需要本地访问权限,攻击者需要能够加载或触发rfkill-gpio驱动与特定ACPI设备的绑定。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要拥有运行受影响Linux内核版本的x86系统的本地访问权限,且该系统需要配备BCM4752或LNV4752 ACPI设备(通常为Broadcom或Lenovo的无线射频控制芯片)。
STEP 2
步骤2:触发驱动绑定
当系统启动或ACPI设备被枚举时,rfkill-gpio驱动会通过ACPI设备ID匹配绑定到BCM4752/LNV4752设备,触发probe函数执行。
STEP 3
步骤3:触发未初始化指针解引用
在probe函数中,device_property_read_string()尝试读取"type"属性失败后,type_name变量未被初始化。随后调用rfkill_find_type(type_name)时,若栈上type_name位置残留非NULL值,将导致空指针解引用。
STEP 4
步骤4:系统崩溃
内核检测到空指针解引用后触发kernel oops或panic,导致系统拒绝服务(DoS),系统可用性受到严重影响。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * CVE-2025-39937 PoC - Trigger NULL pointer dereference in rfkill-gpio driver * * This PoC demonstrates the vulnerability by attempting to bind the rfkill-gpio * driver to a BCM4752 or LNV4752 ACPI device on an x86 system. * * Prerequisites: * - Linux kernel version affected by commit 7d5e9737efda * - x86 system with BCM4752 or LNV4752 ACPI device * - Stack memory at type_name location must be non-NULL * * Note: This is a reliability issue that may cause system crash (kernel oops/panic). * The crash occurs during driver probe when rfkill_find_type() is called with * an uninitialized type_name pointer. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> /* * Trigger the vulnerability by writing to the rfkill device or * by attempting to rebind the rfkill-gpio driver to the ACPI device. * * On vulnerable systems, this will cause a kernel oops due to * dereferencing an uninitialized pointer in rfkill_find_type(). */ int main(int argc, char *argv[]) { int fd; char buf[8]; /* Attempt to trigger rfkill-gpio probe by accessing the device */ fd = open("/dev/rfkill", O_RDWR); if (fd < 0) { perror("open /dev/rfkill"); /* Try sysfs approach */ system("echo 1 > /sys/class/rfkill/rfkill0/state 2>/dev/null"); } else { /* Read current state to trigger any lazy initialization */ read(fd, buf, sizeof(buf)); close(fd); } printf("Attempted to trigger CVE-2025-39937\n"); printf("Check dmesg for kernel oops related to rfkill-gpio\n"); return 0; }

影响范围

Linux Kernel (引入提交7d5e9737efda之后的所有版本,直至修复提交)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解风险:1)在系统启动时通过modprobe黑名单机制禁用rfkill-gpio模块(echo "blacklist rfkill_gpio" >> /etc/modprobe.d/blacklist.conf),但这可能导致无线设备的射频管理功能不可用;2)在ACPI层面禁用BCM4752/LNV4752设备的自动绑定;3)监控系统稳定性,如出现频繁的内核oops/panic,及时更换受影响的硬件或升级内核。

参考链接

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