CVE-2026-23448Linux内核的cdc_ncm驱动程序在处理NDP16数据包时存在边界检查缺陷。在验证NDP头和DPE条目是否适配时,由于第二次检查未将`ndpoffset`计算在内,导致当NDP位于NTB(网络传输块)末尾附近时,DPE条目可能超出skb数据缓冲区范围。这允许本地攻击者通过特制的USB设备或网络流量触发越界内存读取,可能导致内核崩溃或信息泄露。
该漏洞位于`net/usb/cdc_ncm.c`的`cdc_ncm_rx_verify_ndp16`函数中。该函数负责验证NDP16报头及其DPE条目是否在接收到的skb(套接字缓冲区)范围内。代码首先正确使用了`ndpoffset`进行初步检查:`if ((ndpoffset + sizeof(struct usb_cdc_ncm_ndp16)) > skb_in->len)`。但在验证DPE数组大小时,代码错误地省略了`ndpoffset`:`if ((sizeof(struct usb_cdc_ncm_ndp16) + ret * sizeof(struct usb_cdc_ncm_dpe16))) > skb_in->len)`。这导致当`wNdpIndex`较大(即NDP位于缓冲区末尾)时,尽管检查通过,DPE条目实际已位于缓冲区之外。随后的`cdc_ncm_rx_fixup()`函数在遍历DPE数组时会读取越界内存,造成内核不稳定或内存信息泄露。