CVE-2023-53678CVE-2023-53678是Linux内核drm/i915图形驱动中的一个空指针解引用漏洞。该漏洞出现在系统挂起(suspend)过程中,当fbdev(帧缓冲设备)未被初始化时,系统仍然尝试执行fbdev的挂起操作,导致内核空指针解引用错误。在没有显示设备的平台上(例如某些嵌入式系统或服务器),fbdev不会被初始化,但驱动代码在系统挂起时未对此情况进行检查,直接对未初始化的fbdev结构体进行操作,从而触发空指针引用。漏洞触发后会导致内核崩溃(kernel panic),系统可用性完全丧失。CVSS评分为5.5分,属于中危级别。该漏洞需要本地低权限访问权限,无需用户交互即可触发,主要影响系统可用性,对机密性和完整性无影响。此漏洞已在多个稳定内核版本中通过补丁修复,修复方式是在fbdev未初始化时跳过其挂起操作,并添加断言确保fbdev挂起操作仅在显示设备存在时执行。
该漏洞的技术原理在于Linux内核drm/i915驱动中系统挂起流程对fbdev状态缺乏充分检查。具体而言,在i915_drm_suspend()函数中,会调用intel_fbdev_set_suspend()来挂起帧缓冲设备。然而,在某些平台上(特别是没有实际显示硬件的平台),fbdev可能未被正确初始化,此时fbdev结构体中的关键指针(如互斥锁mutex)为NULL。当intel_fbdev_set_suspend()尝试获取该互斥锁时(通过mutex_lock()调用),就会触发空指针解引用错误。
从崩溃日志可以看出,崩溃发生在mutex_lock()函数中(地址0x1c8处),调用链为:state_store -> pm_suspend -> suspend_devices_and_enter -> dpm_suspend -> __device_suspend -> dpm_run_callback -> pci_pm_suspend -> i915_drm_suspend -> intel_fbdev_set_suspend -> mutex_lock。
漏洞利用方式:攻击者只需拥有本地低权限访问权限,触发系统挂起操作(如执行'echo mem > /sys/power/state'或通过systemd等触发s2idle挂起),即可在无显示设备的平台上导致内核崩溃。虽然此漏洞不能直接用于权限提升或代码执行,但可以用于本地拒绝服务攻击(DoS),使系统完全不可用。