CVE-2026-31616该漏洞存在于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()`会导致数组越界写入,覆盖堆上相邻的内存区域,进而引发内核崩溃或潜在的权限提升。