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

CVE-2023-53641 Linux内核ath9k驱动内存泄漏漏洞

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

漏洞信息

漏洞编号
CVE-2023-53641
漏洞类型
内存泄漏
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核ath9k wifi驱动 (hif_usb模块)

相关标签

内存泄漏Linux内核ath9kwifi驱动USBSyzkaller拒绝服务CVE-2023-53641内核安全资源管理

漏洞概述

CVE-2023-53641是Linux内核中ath9k无线网卡驱动hif_usb模块存在的一个内存泄漏漏洞。该漏洞涉及ath9k_hif_usb_rx_stream()函数中remain_skb缓冲区的处理逻辑。remain_skb是在该函数中专门分配和使用的缓冲区,用于处理两个连续URB(USB Request Block)之间的逻辑链接关系。当第一个SKB中的特定数据字段指示需要缓存一个SKB时,系统会分配remain_skb,使用memcpy复制部分数据,并在下一次调用ath9k_hif_usb_rx_stream()时继续处理。然而,当设备去初始化或挂起时,URBs可能会在两次调用之间被释放,导致ath9k_hif_usb_rx_stream()函数不再被调用,从而使已分配的remain_skb发生内存泄漏。该漏洞由Linux验证中心(linuxtesting.org)使用Syzkaller工具发现。CVSS评分为5.5,属于中危级别,攻击者需要本地低权限访问即可触发此漏洞,可能导致系统可用性受到影响(系统内存逐渐耗尽)。该漏洞影响多个Linux内核稳定版本,修复补丁已合并到多个内核分支中。

技术细节

该漏洞的技术原理如下:在ath9k_hif_usb_rx_stream()函数中,存在一个名为remain_skb的缓存SKB缓冲区,用于处理跨URB的数据接收场景。当USB接收URB时,如果数据被分割到两个连续的URB中,第一个URB处理后会将未完成的数据缓存到remain_skb中,等待下一个URB到达时合并处理。

问题在于remain_skb的生命周期管理:当设备进行去初始化(deinitialization)或挂起(suspend)操作时,相关的rx URBs会被释放。如果此时remain_skb仍然持有已分配但未处理完成的数据(即remain_skb非NULL),且后续ath9k_hif_usb_rx_stream()函数不再被调用,那么这块内存将永远不会被释放,造成内存泄漏。

Syzkaller模糊测试工具能够通过特定的USB设备操作序列触发此漏洞——通过反复触发设备挂起/恢复或插拔操作,导致remain_skb累积泄漏。

修复方案:引入一个显式释放remain_skb的函数,在rx URBs被释放时调用该函数来释放缓存的SKB(如果非NULL)。remain_skb为NULL的情况有两种:一是hif_dev结构体通过kzalloc分配时初始化为NULL,二是remain_skb已在下一次ath9k_hif_usb_rx_stream()调用中被处理完毕。

攻击链分析

STEP 1
步骤1:本地访问
攻击者需要拥有系统的本地低权限访问权限(PR:L),能够操作USB设备或与ath9k无线网卡交互
STEP 2
步骤2:触发URB接收
通过向ath9k USB设备发送特定数据,触发ath9k_hif_usb_rx_stream()函数分配remain_skb缓冲区
STEP 3
步骤3:设备状态变更
在remain_skb分配后但尚未被处理前,触发设备去初始化或挂起操作(如USB设备断开、suspend等),导致rx URBs被释放
STEP 4
步骤4:内存泄漏累积
由于URBs被释放后ath9k_hif_usb_rx_stream()不再被调用,已分配的remain_skb无法被释放,造成内存泄漏
STEP 5
步骤5:拒绝服务
通过反复执行上述步骤,攻击者可以使系统内存逐渐耗尽,最终导致系统可用性受损(可用性影响为高 A:H)

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53641 PoC - Triggering remain_skb memory leak in ath9k hif_usb // This PoC demonstrates how to trigger the memory leak by manipulating // the ath9k USB device state to cause URBs to be deallocated while // remain_skb is still allocated. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/usbdevice_fs.h> // Simulate the vulnerable code path // In the ath9k driver, remain_skb is allocated in ath9k_hif_usb_rx_stream() // when processing URBs that contain partial data spanning multiple URBs. struct hif_dev { void *remain_skb; // Cached SKB for multi-URB data int rx_urbs_allocated; }; // Vulnerable function: allocates remain_skb but may not free it // when URBs are deallocated void ath9k_hif_usb_rx_stream(struct hif_dev *dev) { if (dev->remain_skb == NULL) { // Allocate remain_skb for partial data dev->remain_skb = malloc(4096); printf("Allocated remain_skb: %p\n", dev->remain_skb); // Simulate memcpy of partial data memcpy(dev->remain_skb, "partial_data", 12); } else { // Process the cached remain_skb printf("Processing remain_skb: %p\n", dev->remain_skb); free(dev->remain_skb); dev->remain_skb = NULL; } } // Trigger: deallocate URBs without processing remain_skb void trigger_memory_leak(struct hif_dev *dev) { // Step 1: Receive first URB - allocates remain_skb ath9k_hif_usb_rx_stream(dev); // Step 2: Simulate device suspend/deinit - URBs are freed // but remain_skb is NOT freed (the bug) dev->rx_urbs_allocated = 0; printf("URBs deallocated, remain_skb leaked: %p\n", dev->remain_skb); // remain_skb is now leaked - it won't be freed // because ath9k_hif_usb_rx_stream() won't be called again } int main() { struct hif_dev dev = {0}; // Trigger the leak multiple times to accumulate leaked memory for (int i = 0; i < 1000; i++) { dev.remain_skb = NULL; // Reset for each iteration trigger_memory_leak(&dev); // In real scenario, the leaked memory accumulates } printf("Memory leak triggered successfully\n"); return 0; } // Fix: Add explicit free of remain_skb when URBs are deallocated // void ath9k_hif_usb_dealloc_urbs(struct hif_dev *dev) { // if (dev->remain_skb) { // kfree_skb(dev->remain_skb); // dev->remain_skb = NULL; // } // // ... deallocate URBs ... // }

影响范围

Linux kernel < 6.1.63
Linux kernel 6.2.x < 6.2.13
Linux kernel 6.3.x < 6.3.2
Linux kernel 6.4.x < 6.4.10
Linux kernel 6.5.x < 6.5.5
Linux kernel 6.6.x < 6.6

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过临时禁用ath9k USB无线网卡驱动(rmmod ath9k_htc或ath9k_hif_usb)来缓解此漏洞。同时应限制本地低权限用户对USB设备的操作权限,避免恶意程序触发内存泄漏。监控系统内存使用情况,如发现异常内存增长应及时排查。

参考链接

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