CVE-2023-53665CVE-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命令,通过这种高频率的并发操作来增加触发竞争条件的概率。