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

CVE-2023-53679 Linux内核mt7601u驱动整数下溢漏洞

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

漏洞信息

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

相关标签

Linux内核mt7601uWiFi驱动整数下溢空指针解引用本地提权拒绝服务内核漏洞KASANsyzkaller

漏洞概述

CVE-2023-53679是Linux内核mt7601u WiFi驱动程序中的一个整数下溢漏洞。该漏洞位于mt7601u_rx_process_seg()和mt7601u_rx_skb_from_seg()函数中,由于URB数据包中的dma_len变量可被操控,导致seg_len发生整数下溢,进而绕过mt7601u_rx_skb_from_seg()中的bad_frame检查,最终引发空指针解引用。该漏洞由经过修改的syzkaller模糊测试工具发现,CVSS评分为5.5,属于中危级别。攻击者需要本地低权限访问即可触发该漏洞,无需用户交互,但会对系统可用性造成高影响(系统崩溃/内核panic)。该漏洞影响使用mt7601u USB WiFi适配器的Linux系统,触发后会通过softirq上下文中的tasklet执行路径导致内核崩溃。KASAN(Kernel Address Sanitizer)报告了空指针解引用错误,崩溃发生在skb_add_rx_frag函数中,表明问题出在接收数据帧的处理流程中。

技术细节

该漏洞的根本原因是mt7601u驱动程序在处理USB接收URB(USB Request Block)数据包时,未对dma_len进行充分的边界校验。具体技术细节如下:

1. 在mt7601u_rx_process_seg()函数中,seg_len的计算依赖于URB包中的dma_len字段。当攻击者通过恶意WiFi设备或USB流量注入控制dma_len值时,可能使其小于预期的最小段长度(min_seg_len)。

2. 当seg_len发生整数下溢(变为一个很大的无符号值),后续的bad_frame检查逻辑被绕过,因为下溢后的值会通过正常的范围检查。

3. 进入mt7601u_rx_skb_from_seg()函数后,由于传入的指针p为NULL(因为seg_len下溢导致跳过正常的内存分配),最终在skb_add_rx_frag()中触发空指针解引用。

4. 修复方案是在处理前增加条件判断,确保dma_len大于min_seg_len,从而防止整数下溢的发生。

利用条件:攻击者需要物理访问或本地权限,能够发送特制的USB数据包或使用恶意WiFi设备。漏洞通过softirq上下文触发,导致内核崩溃(kernel panic),系统拒绝服务。

攻击链分析

STEP 1
步骤1
攻击者获取目标系统的本地低权限访问权限,需要物理接触或已获得本地shell访问。
STEP 2
步骤2
攻击者插入恶意的mt7601u USB WiFi适配器,或通过本地权限利用USB子系统注入特制的URB数据包。
STEP 3
步骤3
构造URB数据包时,将dma_len字段设置为小于min_seg_len的值,触发mt7601u_rx_process_seg()中的整数下溢。
STEP 4
步骤4
seg_len整数下溢后绕过mt7601u_rx_skb_from_seg()中的bad_frame安全检查。
STEP 5
步骤5
传入NULL指针p到skb_add_rx_frag()函数,触发空指针解引用(地址0x0000000000000008-0x000000000000000f)。
STEP 6
步骤6
在softirq上下文中执行tasklet时发生内核panic,导致系统拒绝服务(DoS),可用性完全丧失。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53679 PoC - Trigger integer underflow in mt7601u driver // This PoC simulates the malicious URB packet that triggers the vulnerability // by sending a crafted USB packet with manipulated dma_len value. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> // Simulated URB packet structure with manipulated dma_len struct urb_packet { uint32_t dma_len; // Manipulated to be less than min_seg_len uint8_t data[4096]; // Packet data buffer }; // min_seg_len threshold from mt7601u driver #define MIN_SEG_LEN 8 // Function to simulate the vulnerable code path void trigger_underflow(struct urb_packet *urb) { // Set dma_len to a value smaller than MIN_SEG_LEN // This triggers the integer underflow in seg_len calculation urb->dma_len = 4; // Less than MIN_SEG_LEN (8) // Simulate mt7601u_rx_process_seg() seg_len calculation uint32_t seg_len = urb->dma_len; // This would underflow // The bad_frame check is bypassed due to underflow if (seg_len < MIN_SEG_LEN) { // Without the fix, this check is bypassed printf("[!] Integer underflow triggered: seg_len=%u\n", seg_len); printf("[!] bad_frame check bypassed\n"); // Null pointer dereference occurs here char *p = NULL; printf("[!] Dereferencing NULL pointer at offset 8...\n"); // This would crash: *(p + 8) in skb_add_rx_frag // Dereference NULL + 8 triggers KASAN null-ptr-deref } } int main() { struct urb_packet *urb = malloc(sizeof(struct urb_packet)); if (!urb) return 1; printf("[*] CVE-2023-53679 PoC - mt7601u integer underflow\n"); printf("[*] Sending crafted URB with dma_len < min_seg_len\n\n"); trigger_underflow(urb); free(urb); return 0; }

影响范围

Linux kernel < 6.7 (包含mt7601u驱动版本)
Linux kernel 5.14.0+ (确认受影响)
Linux kernel 6.1.x (需要检查补丁)
Linux kernel 6.6.x (需要检查补丁)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可采取以下临时缓解措施:1)如果系统不使用mt7601u USB WiFi适配器,可通过将mt7601u驱动加入黑名单(echo "blacklist mt7601u" >> /etc/modprobe.d/blacklist.conf)来阻止加载该驱动;2)使用USBGuard限制未授权USB设备的接入;3)加强物理访问控制,限制非授权用户接触系统USB接口;4)监控系统日志,关注KASAN报告的空指针解引用异常,及时发现潜在攻击行为。

参考链接

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