IPBUF安全漏洞报告
English
CVE-2025-39960 CVSS 7.8 高危

CVE-2025-39960 Linux内核gpiolib未初始化结构体导致驱动故障漏洞

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

漏洞信息

漏洞编号
CVE-2025-39960
漏洞类型
未初始化内存使用
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (gpiolib: acpi子系统)

相关标签

Linux KernelgpiolibACPI未初始化内存本地提权拒绝服务内核漏洞i2c_hid_acpiCWE-457HIGH

漏洞概述

CVE-2025-39960是Linux内核gpiolib ACPI子系统中存在的一个高危漏洞。该漏洞源于自commit 7c010d463372("gpiolib: acpi: Make sure we fill struct acpi_gpio_info")引入的回归问题。在该提交之后,未初始化的acpi_gpio_info结构体被传递给__acpi_find_gpio()函数,在调用栈深处,acpi_populate_gpio_lookup函数会使用info->quirks字段。由于该字段未被初始化,包含了栈上的随机数据,导致后续逻辑判断出错。该漏洞最直接的影响是导致i2c_hid_acpi驱动探测失败,系统日志中会出现"HID over i2c has not been provided an Int IRQ"的错误提示,最终返回错误码-22(EINVAL),使得相关I2C HID设备(如触摸屏、键盘等)无法正常工作。CVSS评分为7.8,属于高危级别,攻击者需要本地低权限即可利用,无需用户交互,可能对系统的机密性、完整性和可用性造成高影响。

技术细节

该漏洞的技术原理在于Linux内核gpiolib ACPI模块中的结构体未初始化问题。具体而言,__acpi_find_gpio()函数接收一个acpi_gpio_info结构体指针作为参数,在commit 7c010d463372之前,该结构体在调用前会被正确填充。但在此提交之后,调用方传递的是栈上未初始化的acpi_gpio_info结构体。在acpi_populate_gpio_lookup()函数中,会直接读取info->quirks字段的值,该字段包含了栈上的残留数据(garbage data)。由于quirks字段的值不确定,可能导致GPIO查找逻辑进入错误的分支,最终返回-22错误码(EINVAL)。对于i2c_hid_acpi驱动而言,这意味着无法获取中断IRQ,导致驱动probe失败,I2C HID设备(如笔记本的触摸屏、触摸板等)无法使用。攻击者作为本地低权限用户,可以通过触发相关代码路径(如加载特定ACPI表或连接特定设备)来利用此漏洞,可能导致系统服务不可用或权限提升的潜在风险。修复方案是在调用__acpi_find_gpio()之前,使用memset或其他方式将acpi_gpio_info结构体清零初始化。

攻击链分析

STEP 1
步骤1
攻击者获得系统的本地低权限访问权限(如普通用户账户)
STEP 2
步骤2
在内核中触发使用未初始化acpi_gpio_info结构体的代码路径,例如通过加载特定ACPI表或触发i2c_hid_acpi驱动的probe流程
STEP 3
步骤3
acpi_populate_gpio_lookup读取未初始化的info->quirks字段,该字段包含栈上的随机数据
STEP 4
步骤4
由于quirks值不确定,GPIO查找逻辑进入错误分支,返回-22(EINVAL)错误
STEP 5
步骤5
驱动probe失败,导致I2C HID设备(如触摸屏、触摸板)无法使用,影响系统可用性,或利用未初始化内存中的残留信息进行信息泄露

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-39960 PoC - Demonstrating uninitialized struct usage in gpiolib:acpi // This PoC shows the kernel code path that triggers the vulnerability // The vulnerable code path is in drivers/gpio/gpiolib-acpi.c // Before the fix, acpi_gpio_info was not initialized before being passed // to __acpi_find_gpio() #include <linux/init.h> #include <linux/acpi.h> // Simulate the vulnerable call pattern static int trigger_vuln_path(struct acpi_device *adev) { struct acpi_gpio_info info; // BUG: uninitialized struct! // Fix would be: memset(&info, 0, sizeof(info)); // This call uses info.quirks which contains garbage struct gpio_desc *desc = __acpi_find_gpio(adev, NULL, 0, &info); if (IS_ERR(desc)) { // Returns -22 (EINVAL) due to uninitialized quirks pr_err("GPIO lookup failed: %ld\n", PTR_ERR(desc)); return PTR_ERR(desc); } return 0; } // Trigger via i2c_hid_acpi driver probe // On affected systems, loading i2c_hid_acpi will show: // [ 58.122916] i2c_hid_acpi i2c-UNIW0001:00: HID over i2c has not been provided an Int IRQ // [ 58.123097] i2c_hid_acpi i2c-UNIW0001:00: probe with driver i2c_hid_acpi failed with error -22 // To reproduce: // 1. Boot a kernel with the vulnerable commit (7c010d463372) but without the fix // 2. Ensure an I2C HID device is present (e.g., touchscreen) // 3. Observe the probe failure in dmesg

影响范围

Linux Kernel 引入commit 7c010d463372之后到修复commit 19c839a98c731169f06d32e7c9e00c78a0086ebe之前的版本

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过在内核启动参数中添加init_on_alloc=1来启用内存分配时的自动清零功能,降低未初始化内存带来的风险。同时,应避免在受影响系统上使用可能触发i2c_hid_acpi驱动的I2C HID设备,或在ACPI表中禁用相关GPIO查找逻辑。

参考链接

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