CVE-2026-31532Linux内核的CAN raw套接字模块中存在一个释放后重用漏洞。问题出在raw_release函数释放ro->uniq后,接收器删除操作被RCU机制延迟,导致raw_rcv函数仍可能在释放后访问该内存区域。攻击者利用此漏洞可能导致系统崩溃或权限提升。该漏洞已通过将释放操作移动到套接字析构函数中修复。
该漏洞的根本原因在于Linux内核CAN raw模块的资源释放时机不当。在raw_release函数执行流程中,调用can_rx_unregister注销接收过滤器时,使用了call_rcu进行延迟删除。这意味着接收器的实际清理是在RCU回调中完成的,而非同步进行。然而,raw_release紧接着就调用了free_percpu(ro->uniq)释放了per-cpu存储区域。此时存在一个时间窗口:如果raw_rcv函数正处于RCU读侧临界区执行中,它可能会尝试访问已被释放的ro->uniq指针,从而触发释放后重用。由于can_rx_unregister会持有对socket的额外引用直到RCU回调执行完毕,修复方案是将free_percpu调用移动到sk_destruct析构函数中。这确保了只有在所有相关的RCU回调执行完毕后,才会释放uniq内存,从而消除了竞态条件。