CVE-2026-31474Linux内核中的CAN ISO-TP协议栈存在一个释放后重用漏洞。该漏洞源于isotp_sendmsg()和isotp_release()之间的竞态条件。当关闭socket时,如果信号打断了等待事件,isotp_release()会提前释放so->tx.buf内存,而isotp_sendmsg()可能仍在读取该缓冲区。这会导致内核崩溃或潜在的权限提升。攻击者需具备本地低权限即可触发此漏洞。
该漏洞的核心在于Linux内核CAN子系统中ISO-TP协议实现(net/can/isotp.c)的同步机制缺陷。isotp_sendmsg()仅使用cmpxchg()来序列化对so->tx.state的访问,而在释放资源时,isotp_release()通过wait_event_interruptible()等待状态变为ISOTP_IDLE。竞态窗口开启于:当isotp_release()处于等待状态时,如果捕获到一个信号(如用户强制终止进程),等待循环会提前退出,跳转到ISOTP_SHUTDOWN逻辑。此时,代码会立即调用kfree(so->tx.buf)释放传输缓冲区。然而,如果此时isotp_sendmsg()正处于发送最后帧数据的状态(即isotp_fill_dataframe()正在读取so->tx.buf),由于状态检查和内存释放之间存在时间差,发送函数会访问已被释放的内存区域(UAF)。攻击者可以通过创建ISOTP socket,启动发送操作,并在发送过程中通过信号机制触发关闭流程,从而诱导内核访问悬垂指针。