CVE-2026-31623Linux内核中的CDC Phonet驱动程序存在严重的缓冲区溢出漏洞(CVE-2026-31623)。该漏洞源于`rx_complete()`函数在处理USB批量传输时,未对`skb_shared_info->frags[]`数组的边界进行验证。攻击者只需将特制的恶意USB设备连接至目标主机,伪装成CDC Phonet调制解调器,并向主机发送无限制的整页数据流,即可触发数组越界写入。此漏洞可导致内核内存损坏、系统崩溃(拒绝服务),在特定条件下甚至可能被利用于本地权限提升。
该漏洞属于典型的内核态缓冲区溢出,影响Linux内核的`net: usb: cdc-phonet`组件。在`drivers/net/usb/cdc-phonet.c`文件的`rx_complete()`函数中,驱动负责处理来自USB设备的数据接收。当接收到数据包时,如果数据长度较大,驱动会调用`skb_add_rx_frag()`将数据页添加到socket buffer(skb)的`frags[]`数组中。正常情况下,该数组的大小受限于`MAX_SKB_FRAGS`(通常为17或18)。然而,漏洞代码在循环处理USB批量传输数据时,仅检查了传输状态,未对当前分片数量(`nr_frags`)进行上限检查。恶意USB设备可以利用这一逻辑缺陷,发送大量恰好等于内存页大小(如4096字节)的连续数据包。驱动会为每个包分配新页面并添加到数组,直到写入超出数组边界,覆盖相邻的内核内存结构,从而导致系统崩溃或潜在的代码执行。