CVE-2026-31649Linux内核中的stmmac网络驱动在处理链模式下的巨型帧时存在一个严重的整数下溢漏洞。该漏洞源于函数在计算数据长度时,错误地使用了线性数据长度而非总长度进行减法运算。当接收到线性部分较小但总长度很大的分片数据包时,减法操作会导致无符号整数回绕,产生巨大的长度值。这会导致驱动程序进入异常循环,将越界的内核内存地址映射到DMA引擎,从而引发内核内存泄露或潜在的内存损坏。
该漏洞位于Linux内核的drivers/net/ethernet/stmicro/stmmac/stmmac_main.c文件中的jumbo_frm()函数。漏洞触发的核心条件是:数据包的线性长度(skb_headlen)小于缓冲区大小(bmax,通常为8KB或2KB),但数据包的总长度(skb->len)大于bmax。
由于jumbo_frm()函数无条件计算len = nopaged_len - bmax,当nopaged_len < bmax时,发生无符号整数下溢,len变为接近0xFFFFFFFF的值。随后的while循环会基于这个错误的len值执行,不断计算skb->data + bmax * i并传递给dma_map_single()。在没有IOMMU保护的系统上,这会将任意内核内存映射给设备,导致严重的安全后果。