CVE-2023-53647CVE-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命名空间根对象,如果是则终止资源查找循环,避免对根对象句柄进行解引用操作。