CVE-2025-39937CVE-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设备的绑定。