In the Linux kernel, the following vulnerability has been resolved:
scsi: qla2xxx: Initialize NVMe abort_work once at submission
qla_nvme_fcp_abort() and qla_nvme_ls_abort() ran INIT_WORK() on
priv->abort_work immediately before schedule_work(). INIT_WORK()
reinitializes the work_struct, resetting its list head and clearing the
pending bit. If an abort is issued more than once for the same command
(for example, concurrent transport teardown and a timeout-driven abort),
the second INIT_WORK() reinitializes a work item that is already queued,
which can corrupt the workqueue list and lead to crashes or a looping
worker.
Initialize priv->abort_work once at command submission, next to the
existing per-command spin_lock_init(&priv->cmd_lock), and leave only
schedule_work() in the abort paths. schedule_work() already does nothing
when the work item is still pending, so a repeated abort no longer
disturbs an in-flight work item. The command is not returned to the
transport until the final kref_put()/release callback runs after
abort_work has completed, so the work item is idle before priv is reused
and the single submission-time INIT_WORK() is safe.
CVSS Vector: CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CVSS Score: 8.8
AV:A - The bug is in the QLogic qla2xxx NVMe-FC initiator abort callbacks. A Fibre Channel peer (compromised NVMe-FC target or zoned SAN device) can stall commands to force timeouts and concurrently drop the link or send LOGO/RSCN so nvme_fc tears down, both of which call ls_abort/fcp_abort. FC is a non-IP fabric, so the vector is adjacent.
AC:L - A malicious NVMe-FC target controls both sides of the documented race: delaying completions triggers timeout-driven abort while a concurrent link-down or logout triggers teardown abort. INIT_WORK() on still-queued abort_work is then attacker-influenceable under I/O load, so complexity is low.
PR:N - The attacker is a Fibre Channel peer and needs no host credentials or capabilities. Fabric zoning/WWPN is a topology restriction captured by Adjacent, not an OS privilege, and NVMe in-band authentication is optional and off by default.
UI:N - With ql2xnvmeenable defaulting to on, an established NVMe-FC association issues keepalives and I/O without user action. The target can stall those commands and flap the link without anyone mounting a volume or running a tool.
S:U - Impact is kernel workqueue list corruption in the same host kernel that runs qla2xxx. That is ordinary kernel memory-corruption impact, not a VM escape, IOMMU bypass, or other crossed security authority.
C:H - INIT_WORK() on a queued work_struct resets its list head without unlinking it, corrupting the workqueue and creating a use-after-free of work items. That UAF can be used to read kernel memory, so confidentiality is high.
I:H - The same workqueue UAF can overwrite adjacent objects and hijack work->func when the worker runs a freed item, yielding an arbitrary-write / control-flow primitive, so integrity is high.
A:H - The corrupted workqueue can oops, panic, or run a looping worker, crashing or hanging the kernel, so availability is high.
| Attack Vector |
Adjacent Network |
Scope |
Unchanged |
| Attack Complexity |
Low |
Confidentiality Impact |
High |
| Privileges Required |
None |
Integrity Impact |
High |
| User Interaction |
None |
Availability Impact |
High |
AV:A - The bug is in the QLogic qla2xxx NVMe-FC initiator abort callbacks. A Fibre Channel peer (compromised NVMe-FC target or zoned SAN device) can stall commands to force timeouts and concurrently drop the link or send LOGO/RSCN so nvme_fc tears down, both of which call ls_abort/fcp_abort. FC is a non-IP fabric, so the vector is adjacent.
AC:L - A malicious NVMe-FC target controls both sides of the documented race: delaying completions triggers timeout-driven abort while a concurrent link-down or logout triggers teardown abort. INIT_WORK() on still-queued abort_work is then attacker-influenceable under I/O load, so complexity is low.
PR:N - The attacker is a Fibre Channel peer and needs no host credentials or capabilities. Fabric zoning/WWPN is a topology restriction captured by Adjacent, not an OS privilege, and NVMe in-band authentication is optional and off by default.
UI:N - With ql2xnvmeenable defaulting to on, an established NVMe-FC association issues keepalives and I/O without user action. The target can stall those commands and flap the link without anyone mounting a volume or running a tool.
S:U - Impact is kernel workqueue list corruption in the same host kernel that runs qla2xxx. That is ordinary kernel memory-corruption impact, not a VM escape, IOMMU bypass, or other crossed security authority.
C:H - INIT_WORK() on a queued work_struct resets its list head without unlinking it, corrupting the workqueue and creating a use-after-free of work items. That UAF can be used to read kernel memory, so confidentiality is high.
I:H - The same workqueue UAF can overwrite adjacent objects and hijack work->func when the worker runs a freed item, yielding an arbitrary-write / control-flow primitive, so integrity is high.
A:H - The corrupted workqueue can oops, panic, or run a looping worker, crashing or hanging the kernel, so availability is high.
CVSS 3.1