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

CVE-2023-53647:Linux内核VMBus驱动ACPI根对象空指针解引用漏洞

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

漏洞信息

漏洞编号
CVE-2023-53647
漏洞类型
空指针解引用(NULL Pointer Dereference)
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux内核(hv_vmbus驱动)

相关标签

Linux内核空指针解引用拒绝服务Hyper-VVMBusACPI内核漏洞本地提权hv_vmbusCVE-2023-53647

漏洞概述

CVE-2023-53647是Linux内核中Hyper-V VMBus客户端驱动(hv_vmbus)存在的一个空指针解引用漏洞。该漏洞源于VMBus客户端驱动在查找Hyper-V MMIO(内存映射I/O)范围时,会从VMBus ACPI设备向上遍历ACPI命名空间,直到ACPI命名空间根对象。当驱动无法在VMBus ACPI设备或其祖先节点中找到Hyper-V MMIO范围时,会错误地尝试遍历ACPI命名空间根对象本身的资源。然而,ACPI命名空间根对象具有全1(all-ones)句柄,在ACPI代码中对该指针进行偏移解引用时会导致空指针解引用,从而触发内核oops崩溃。该漏洞在使用QEMU VMBus实现(不提供Hyper-V MMIO范围)的VMBus主机实现上启动时会被触发,导致系统崩溃。攻击者需要具有本地低权限即可触发此漏洞,无需用户交互。该漏洞影响系统的可用性,可能导致系统拒绝服务(DoS)。Linux内核开发团队已通过在ACPI命名空间根对象处显式终止查找来修复此问题。

技术细节

该漏洞的技术原理如下:

1. **触发条件**:VMBus客户端驱动(hv_vmbus)在探测阶段调用vmbus_platform_driver_probe函数,该函数通过acpi_walk_resources遍历ACPI命名空间以查找Hyper-V MMIO范围。

2. **漏洞路径**:驱动从VMBus ACPI设备节点开始,通过acpi_ns_get_node和acpi_ns_evaluate等函数向上遍历ACPI命名空间。当遍历到ACPI命名空间根对象(其句柄为ACPI_ROOT_OBJECT,即全1值0xFFFFFFFF)时,acpi_ns_internalize_name函数尝试对该句柄进行内部化处理,但由于该句柄对应的是一个特殊对象,对其进行指针偏移解引用时会产生空指针解引用。

3. **崩溃栈**:内核oops发生在acpi_ns_lookup函数中,具体调用链为:vmbus_platform_driver_probe -> acpi_walk_resources -> acpi_rs_get_method_data -> acpi_ut_evaluate_object -> acpi_ns_evaluate -> acpi_ns_get_node -> acpi_ns_get_node_unlocked -> acpi_ns_internalize_name -> acpi_ns_lookup,在acpi_ns_lookup+0x7a处发生页错误。

4. **利用方式**:攻击者只需在不支持Hyper-V MMIO范围的VMBus主机实现(如QEMU VMBus)上启动Linux guest,即可触发此漏洞。Linux guest在KVM/QEMU下默认不使用Hyper-V PV接口,除非KVM PV接口缺失或被禁用。当使用Hyper-V PV接口时,内核模块hv_vmbus在加载过程中会自动触发漏洞路径。

5. **修复方案**:在内核代码中显式检查是否已到达ACPI命名空间根对象,如果是则终止资源查找循环,避免对根对象句柄进行解引用操作。

攻击链分析

STEP 1
步骤1:环境准备
攻击者需要在使用QEMU/KVM虚拟化的环境中运行Linux guest,并启用Hyper-V PV(半虚拟化)接口。这可以通过在QEMU命令行中添加Hyper-V相关的CPU特性标志来实现。
STEP 2
步骤2:触发模块加载
当Linux guest内核启动或hv_vmbus模块被加载时,vmbus_platform_driver_probe函数会被调用,开始探测VMBus ACPI设备。
STEP 3
步骤3:ACPI命名空间遍历
驱动通过acpi_walk_resources从VMBus ACPI设备开始向上遍历ACPI命名空间,查找Hyper-V MMIO范围。
STEP 4
步骤4:到达根对象
由于QEMU VMBus实现不提供Hyper-V MMIO范围,遍历过程会一直向上到达ACPI命名空间根对象(句柄为ACPI_ROOT_OBJECT,即全1值)。
STEP 5
步骤5:空指针解引用
acpi_ns_internalize_name函数尝试对根对象句柄进行内部化处理,由于该句柄的特殊性,进行指针偏移解引用时触发空指针解引用,导致内核oops。
STEP 6
步骤6:系统崩溃
内核检测到页错误并触发oops,在不支持kexec/kdump的环境中可能导致系统完全崩溃或重启,造成拒绝服务(DoS)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2023-53647 PoC - Trigger NULL pointer dereference in hv_vmbus driver # This vulnerability is triggered automatically when loading the hv_vmbus module # on a VMBus host implementation that doesn't provide Hyper-V MMIO ranges (e.g., QEMU) # Method 1: Trigger via modprobe (requires root) # On a QEMU/KVM guest with Hyper-V PV interface enabled: modprobe hv_vmbus # Method 2: Trigger via kernel boot parameter # Add to kernel command line: # modprobe.blacklist=hv_vmbus (to prevent crash during boot) # Method 3: QEMU command line to reproduce # qemu-system-x86_64 \ # -enable-kvm \ # -cpu host \ # -machine type=pc-q35 \ # -device hv-vmbus \ # (without providing MMIO ranges in VMBus ACPI device) # Example kernel oops stack trace observed: # [ 3.710827] ? __die+0x1f/0x60 # [ 3.715030] ? page_fault_oops+0x159/0x460 # [ 3.716008] ? exc_page_fault+0x73/0x170 # [ 3.716959] ? asm_exc_page_fault+0x22/0x30 # [ 3.717957] ? acpi_ns_lookup+0x7a/0x4b0 # [ 3.718898] ? acpi_ns_internalize_name+0x79/0xc0 # [ 3.720018] acpi_ns_get_node_unlocked+0xb5/0xe0 # [ 3.729476] ? vmbus_platform_driver_probe+0x1d0/0x1d0 [hv_vmbus] # [ 3.733398] vmbus_platform_driver_probe+0x9f/0x1d0 [hv_vmbus] # [ 3.745207] hv_acpi_init+0x3c/0x1000 [hv_vmbus] # Trigger script (requires root privileges): #!/bin/bash # Trigger CVE-2023-53647 if [ "$(id -u)" -ne 0 ]; then echo "This script requires root privileges" exit 1 fi # Check if running in a VM with Hyper-V enlightenments if grep -q hyperv /proc/cpuinfo; then echo "Hyper-V enlightenments detected" # Load the vulnerable module modprobe hv_vmbus echo "Module loaded - check dmesg for oops" else echo "Not running in a Hyper-V enlightened environment" exit 1 fi

影响范围

Linux kernel < 6.6(受影响的稳定版本)
Linux kernel 6.6.x(部分版本受影响)
Linux kernel 6.1.x(长期支持版本受影响)
Linux kernel 5.15.x(长期支持版本受影响)
Linux kernel 5.10.x(长期支持版本受影响)

防御指南

临时缓解措施
在无法立即升级内核的情况下,可以通过以下临时措施缓解:1)在内核启动参数中添加modprobe.blacklist=hv_vmbus来禁用有漏洞的hv_vmbus模块加载;2)如果使用QEMU/KVM虚拟化,确保主机提供完整的Hyper-V MMIO范围信息;3)限制对虚拟机控制台的物理访问权限,防止未授权用户触发系统崩溃;4)配置kexec/kdump以便在系统崩溃时能够收集诊断信息并自动重启。

参考链接

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