CVE-2026-43414Linux内核中的qla2xxx驱动程序存在一个严重的双重释放漏洞。该漏洞源于在`qla24xx_els_dcmd_iocb()`函数处理特定错误路径时,对`fcport`结构体进行了不当的重复释放操作。具体而言,当错误发生时,`kref_put()`机制会触发释放回调函数`qla2x00_els_dcmd_sp_free()`,该函数内部已经调用了`qla2x00_free_fcport()`来释放相关资源。然而,代码在`kref_put()`之后错误地再次调用了`qla2x00_free_fcport()`。这种逻辑缺陷导致内存被释放两次,可能引发内核崩溃(拒绝服务)或潜在的任意代码执行风险。
该漏洞位于Linux内核SCSI子系统的QLogic Fibre Channel驱动(qla2xxx)中,具体涉及`qla24xx_els_dcmd_iocb()`函数的错误处理逻辑。在该函数初始化阶段,`sp->free`回调函数指针被设置为`qla2x00_els_dcmd_sp_free()`。当执行过程中发生错误时,代码路径会调用`kref_put(&sp->cmd_kref, qla2x00_sp_release)`。由于此时引用计数归零,`qla2x00_sp_release`会被触发,进而执行先前注册的`sp->free`回调,即`qla2x00_els_dcmd_sp_free()`。在这个回调函数内部,`qla2x00_free_fcport(fcport)`被执行,彻底释放了`fcport`结构体及其关联的内存资源。然而,原始代码在`kref_put()`调用返回后,并没有意识到内存已被回收,错误地认为`fcport`仍然有效,并显式地再次调用了`qla2x00_free_fcport(fcport)`。这种“释放后再次释放”的严重错误破坏了内核内存管理器的堆元数据。攻击者可以通过发送特制的SCSI ELS指令触发该逻辑,结合堆喷射或堆风水技术控制被释放的内存块,从而可能导致内核崩溃(拒绝服务)或在特定条件下实现本地权限提升。