CVE-2026-31570Linux内核CAN网关模块在处理CRC8校验和计算时存在越界读写漏洞。`cgw_csum_crc8_rel()`函数虽然通过`calc_idx()`计算了安全的索引边界,但在实际循环和结果写入中错误使用了原始的`s8`字段。当配置负索引(如-64)时,边界检查虽通过,但实际操作会访问堆上`cf->data`之前的内存区域,导致内核越界访问。利用此漏洞需具备`CAP_NET_ADMIN`权限。
漏洞位于`net/can/gw.c`中的`cgw_csum_crc8_rel()`函数。该函数旨在计算CAN帧的相对CRC8校验和。代码首先调用`calc_idx()`处理可能为负的索引参数(`from_idx`, `to_idx`, `result_idx`),确保其在帧长度范围内。然而,开发人员在后续的`for`循环初始化和数组赋值时,未使用`calc_idx()`返回的安全变量,而是直接使用了原始的`s8`类型参数。例如,若设置`from_idx = -64`,`calc_idx`将其视为有效偏移,但循环变量`i`仍被初始化为-64,导致读取`cf->data[-64]`。这种逻辑错误允许具有`CAP_NET_ADMIN`权限的攻击者触发堆越界读写,可能导致拒绝服务或权限提升。