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

CVE-2026-31616 Linux内核Phonet函数skb溢出漏洞

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

漏洞信息

漏洞编号
CVE-2026-31616
漏洞类型
缓冲区溢出
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

缓冲区溢出Linux KernelUSB Gadget本地漏洞堆溢出

漏洞概述

该漏洞存在于Linux内核的USB gadget Phonet功能中。当Linux设备作为USB gadget暴露Phonet函数时,恶意的USB主机可以通过发送无限制的全页OUT数据传输序列,触发`pn_rx_complete()`函数中的逻辑缺陷。由于该函数仅在接收数据小于页大小时才重置skb,连续的全页传输会导致skb片段数量超过限制,从而溢出`skb_shared_info->frags[]`数组并覆盖堆内存。

技术细节

该漏洞源于Linux内核USB gadget子系统中f_phonet驱动的接收逻辑缺陷。在`pn_rx_complete()`函数中,代码逻辑仅在`req->actual < req->length`时才认为数据包接收完毕并重置接收缓冲区。然而,恶意的USB主机可以构造特定数据流,持续发送长度恰好等于PAGE_SIZE的数据包。在这种情况下,接收条件永不满足,驱动程序会不断向同一个skb结构中添加片段。当片段数量超过`MAX_SKB_FRAGS`(默认为17)时,继续调用`skb_add_rx_frag()`会导致数组越界写入,覆盖堆上相邻的内存区域,进而引发内核崩溃或潜在的权限提升。

攻击链分析

STEP 1
物理连接
攻击者将恶意USB主机连接到目标Linux设备,该设备需已启用USB gadget Phonet功能。
STEP 2
发送特制数据
攻击者向目标设备的OUT端点持续发送长度恰好等于PAGE_SIZE(通常为4096字节)的数据包。
STEP 3
触发逻辑缺陷
由于`pn_rx_complete()`未检测到数据包结束,继续向同一个skb添加片段,导致`nr_frags`计数器增加。
STEP 4
堆内存溢出
当片段数超过17(MAX_SKB_FRAGS)时,后续的写入操作覆盖相邻的堆内存区域,造成内核崩溃或代码执行。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import usb.core import usb.util # Find the USB gadget device # dev = usb.core.find(idVendor=YOUR_VENDOR_ID, idProduct=YOUR_PRODUCT_ID) # if dev is None: # raise ValueError('Device not found') PAGE_SIZE = 4096 data = b'A' * PAGE_SIZE ENDPOINT_OUT = 0x01 try: # Send full-page packets continuously to trigger overflow for i in range(20): # Sending more than MAX_SKB_FRAGS (17) # dev.write(ENDPOINT_OUT, data, timeout=1000) print(f"Sending packet {i} of size {PAGE_SIZE}") except Exception as e: print(e)

影响范围

Linux Kernel (stable branches before commit c088d5dd2fffb4de1fb8e7f57751c8b82942180a)

防御指南

临时缓解措施
建议用户在未升级内核前,禁用USB gadget Phonet功能或限制对USB端口的物理访问,以防止恶意USB设备连接。

参考链接

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