CVE-2026-89847
large1Use-after-free in Linux kernel qla2xxx Fibre Channel driver async IOCB timeout
The qla2xxx SCSI driver in the Linux kernel (used for QLogic/Marvell Fibre Channel host bus adapters) contains a double-completion bug that leads to a use-after-free. When an async IOCB times out, qla2x00_async_iocb_timeout() tries to abort it; if the abort fails, both the SRB_LOGIN_CMD and SRB_CTRL_VP/default paths call sp->done() unconditionally without first confirming the command was actually found and removed from outstanding_cmds[]. If the response ISR completes the same handle concurrently, the submitter (e.g., qla24xx_control_vp()) wakes, clears sp->comp and reclaims its on-stack completion, so the timeout handler's second sp->done() call can invoke complete() on a freed stack frame. An attacker who can trigger IOCB timeouts on a system with an affected HBA gains kernel memory corruption, with denial of service and potentially privilege escalation; the flaw is scored 9.8 (critical) by the kernel.org CNA, though practical triggering requires these timeout race conditions on hosts using the qla2xxx driver. No public PoC or known exploitation exists.
What to do: Patch by updating to a kernel that includes the qla2xxx fix (track the commit through kernel.org stable trees and your distro's security updates; no fixed version number is published in the available data). Inventory hosts for qla2xxx (e.g., loaded module or QLogic FC adapters via lspci) and note whether NPIV/virtual ports are in use, as those configurations exercise the affected path. No practical mitigation exists beyond patching; the flaw is not remotely reachable over IP networks despite the AV:N CVSS vector.
| Linux kernel qla2xxx SCSI driver (QLogic/Marvell Fibre Channel HBAs) | — |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
In the Linux kernel, the following vulnerability has been resolved: scsi: qla2xxx: Avoid double completion in async IOCB timeout qla2x00_async_iocb_timeout() tries to abort a timed-out async IOCB. When qla24xx_async_abort_cmd() fails, both the SRB_LOGIN_CMD path and the SRB_CTRL_VP/default path scan outstanding_cmds[] for the SRB and then call sp->done(sp, QLA_FUNCTION_TIMEOUT) unconditionally, without checking whether the SRB was actually found and removed. If the response ISR completes the same handle first, it removes the SRB under qp_lock_ptr and runs sp->done() -> complete(sp->comp). The submitter qla24xx_control_vp() wakes from wait_for_completion(), clears sp->comp, drops its reference and returns, reclaiming the on-stack completion. The timer reference keeps the SRB alive across the timeout handler, but not the submitter's stack. The timeout then issues a second sp->done() -> qla_ctrlvp_sp_done(), which evaluates "if (sp->comp) complete(sp->comp)"; with the pointer loaded before the submitter's NULL store, complete() writes into the freed stack frame, a use-after-free. Track whether this path removed the SRB from outstanding_cmds and only call sp->done() when it did, so the command is completed exactly once by whichever path owns it. This mirrors the sp_found guard already used in qla24xx_abort_iocb_timeout().
- Vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
In the news0 stories
No ingested article mentions this CVE yet.