CVE-2026-23386Linux内核中的Google Virtual Ethernet (gve)驱动程序在DQ-QPL模式下存在一处缓冲区清理错误漏洞。在`gve_tx_clean_pending_packets`函数中,代码错误地使用了RDA缓冲区清理路径,而非QPL专用路径。这导致了两个严重问题:首先,由于`dma`数组与`tx_qpl_buf_ids`共享存储空间,错误地将缓冲区ID解释为DMA地址会导致尝试解除映射错误的内存位置;其次,QPL模式下的`num_bufs`(计数2K块)可能显著超过`dma`数组的固定大小,从而引发数组越界访问。该漏洞可能被本地低权限攻击者利用,导致内核崩溃或拒绝服务。
该漏洞位于Linux内核源码的`drivers/net/ethernet/google/gve/gve_tx_dqo.c`文件中。其根本原因是在处理DQ-QPL(Descriptor Queue - Queue Page List)模式下的挂起数据包清理时,未能正确区分数据模式。在QPL模式下,`dma`数组和`tx_qpl_buf_ids`通过union共享内存,且`num_bufs`表示的是2K块的数量,其数值往往远大于`dma`数组的预定义长度(例如18)。当`gve_tx_clean_pending_packets`函数执行时,它遍历了`num_bufs`次并尝试访问`dma`数组,导致`array-index-out-of-bounds`错误。此外,将int类型的buffer ID强制转换为`dma_addr_t`进行DMA unmap操作,会导致内存管理混乱。该错误通常在网卡接口关闭(`gve_close`)或重置(`gve_reset`)的服务任务中被触发。