CVE-2026-22997CVE-2026-22997是Linux内核中net:can:j1939模块的一个高危安全漏洞,CVSS评分7.5。该漏洞存在于j1939_xtp_rx_rts_session_active()函数中,当接收到第二个RTS(Request To Send)消息时,未能正确调用j1939_session_deactivate_activate_next()函数来释放会话资源。由于j1939_session_deactivate_activate_next()仅在定时器启用时被调用,当定时器被取消时,该函数不会被执行,导致j1939_session的引用计数泄漏。长时间运行后,受影响系统的vcan0设备会出现"unregister_netdevice: waiting for vcan0 to become free. Usage count = 2"的错误信息,表明资源未被正确释放,可能导致系统可用性下降或拒绝服务。攻击者可通过发送特制的CAN J1939协议数据包触发此漏洞。
该漏洞位于Linux内核的CAN J1939(Controller Area Network J1939)协议实现中。问题出在j1939_xtp_rx_rts_session_active()函数处理第二个RTS消息的逻辑中。当该函数接收到第二个RTS消息时,虽然取消了定时器(timer),但未能调用j1939_session_deactivate_activate_next()函数来正确释放会话资源。具体来说,j1939_tp_rxtimer()函数中的j1939_session_deactivate_activate_next()调用依赖于定时器的启用状态。在某些情况下(如接收到第二个RTS),定时器会被提前取消,导致该释放函数永远不会被执行。这会造成j1939_session对象的引用计数持续增加而无法归零,最终导致内核无法卸载vcan网络设备。攻击者需要构造包含两个RTS消息的恶意CAN数据包,通过网络发送到目标系统的CAN接口即可触发此漏洞。