CVE-2022-50532CVE-2022-50532是Linux内核mpt3sas SCSI驱动中的一个资源泄漏漏洞,位于mpt3sas_transport_port_add()函数中。该漏洞源于在sas_rphy_add()函数返回错误时,缺少对sas_rphy_free()的调用,导致在sas_end_device_alloc()中分配的资源无法被正确释放。具体而言,当transport_add_device()未被调用时,设备未被正确添加到系统中,而在后续的remove()路径中调用sas_rphy_remove()移除设备时,会触发空指针解引用,导致内核崩溃。该漏洞需要本地低权限用户即可触发,无需用户交互,主要影响系统的可用性,可能导致系统拒绝服务(内核崩溃)。该漏洞已在多个Linux内核稳定版本中修复,包括6a92129c8f99、6f6768e2fc86、78316e9dfc24、ce1a69cc8500和d17bca3ddfe5等多个补丁提交。
该漏洞的技术原理如下:在mpt3sas_transport_port_add()函数中,当创建一个SAS远程PHY(rphy)时,会先调用sas_end_device_alloc()分配资源,然后调用sas_rphy_add()将设备添加到传输层。正常情况下,如果sas_rphy_add()成功,transport_add_device()会被调用,设备被正确注册。但在错误处理路径中,当sas_rphy_add()返回错误时,代码没有调用sas_rphy_free()来释放sas_end_device_alloc()中分配的资源。由于transport_add_device()未被调用,设备结构中的某些字段未被初始化(保持为NULL)。当后续在设备移除路径中调用sas_rphy_remove()时,代码尝试访问这些未初始化的字段(如通过device_del()),从而触发NULL指针解引用。崩溃发生在device_del+0x54处,调用链为:sas_rphy_remove -> sas_port_delete -> do_sas_phy_delete -> device_for_each_child -> sas_remove_children -> sas_remove_host -> scsih_remove。攻击者只需具有本地低权限即可通过触发特定的SCSI设备操作(如插入/移除SAS设备)来触发该漏洞。