CVE-2023-53627CVE-2023-53627是Linux内核中hisi_sas驱动存在的一个空指针解引用漏洞,位于drivers/scsi/hisi_sas/hisi_sas_v3_hw.c文件中。该漏洞源于在slot_complete_v3_hw()函数释放slot时,sas_dev.list链表可能正在被其他线程(如SCSI错误处理线程scsi_eh)通过dereg_device_v3_hw()函数遍历。当两者并发执行时,list_del_init()操作与list_for_each_entry_safe()遍历操作之间存在竞态条件,导致链表节点被删除后仍然被访问,从而触发空指针解引用异常。漏洞利用需要本地低权限访问权限,无需用户交互,攻击成功后将导致系统内核崩溃(Kernel Panic),可用性影响为高。CVSS 3.1评分为5.5分,属于中危级别。该漏洞影响使用HiSilicon SAS控制器(如华为TaiShan服务器系列)的Linux系统,可能在正常的SCSI错误恢复流程中意外触发,造成系统不可用。
该漏洞本质上是一个典型的内核竞态条件问题。hisi_sas驱动管理HiSilicon SAS(Serial Attached SCSI)主控制器的slot(命令槽位)。在正常运行时,完成队列(cq)线程通过slot_complete_v3_hw()处理已完成的I/O请求,并在hisi_sas_slot_task_free()中调用list_del_init()从sas_dev.list链表中移除对应节点。同时,当SCSI设备出现错误时,scsi错误处理线程(scsi_eh)会通过sas_eh_handle_sas_errors() → sas_scsi_find_task() → lldd_abort_task() → hisi_sas_abort_task() → dereg_device_v3_hw()的调用链,使用list_for_each_entry_safe()遍历sas_dev.list链表。问题在于这两个操作路径之间没有适当的同步保护机制。当cq线程正在执行list_del_init()删除链表节点时,错误处理线程可能同时遍历该链表,访问已被删除或正在被删除的节点,导致next指针变为NULL,从而触发空指针解引用(pc位于dereg_device_v3_hw+0x68/0xa8)。修复方案是在dereg_device_v3_hw()和hisi_sas_release_tasks()中遍历sas_dev.list时获取sas_dev锁,以避免并发添加和删除成员的操作。攻击者可通过触发大量SCSI I/O错误来增加竞态条件触发的概率,进而导致内核崩溃。