{"id":"CVE-2026-89860","state":"PUBLISHED","title":"scsi: qla2xxx: Initialize NVMe abort_work once at submission","description":"In the Linux kernel, the following vulnerability has been resolved:\n\nscsi: qla2xxx: Initialize NVMe abort_work once at submission\n\nqla_nvme_fcp_abort() and qla_nvme_ls_abort() ran INIT_WORK() on\npriv->abort_work immediately before schedule_work(). INIT_WORK()\nreinitializes the work_struct, resetting its list head and clearing the\npending bit. If an abort is issued more than once for the same command\n(for example, concurrent transport teardown and a timeout-driven abort),\nthe second INIT_WORK() reinitializes a work item that is already queued,\nwhich can corrupt the workqueue list and lead to crashes or a looping\nworker.\n\nInitialize priv->abort_work once at command submission, next to the\nexisting per-command spin_lock_init(&priv->cmd_lock), and leave only\nschedule_work() in the abort paths. schedule_work() already does nothing\nwhen the work item is still pending, so a repeated abort no longer\ndisturbs an in-flight work item. The command is not returned to the\ntransport until the final kref_put()/release callback runs after\nabort_work has completed, so the work item is idle before priv is reused\nand the single submission-time INIT_WORK() is safe.","publishedAt":"2026-09-16T10:31:32.263Z","updatedAt":"2026-10-30T12:33:20.624Z","severity":{"score":8.8,"label":"High","version":"3.1","vector":"CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","source":"Linux"},"assigner":"Linux","products":["Linux Linux"],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"6ee4e3774349fa04bba13e668f3322db47d89b08","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"55259e225412721c3cc09e4d95a489542c0c05b0","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"17d9011c96f819e69074f465c04ee79e693de6a1","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"b403700ac62fbf3c310196386e125879a182efcf","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"6a1b50c4879c2e6a034e8e85f9c055f0eea157c7","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"67f0d5187c29360388f7e1e503c627ec45d01089","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"f4aaa4a4e6f1da6f3abfd80e1917bef922287177","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"7e85f6dbc85616de2172bce8eaf84b387a723cd1","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/scsi/qla2xxx/qla_nvme.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"4.17","status":"affected"},{"version":"0","status":"unaffected","lessThan":"4.17","versionType":"semver"},{"version":"5.10.273","status":"unaffected","lessThanOrEqual":"5.10.*","versionType":"semver"},{"version":"5.15.224","status":"unaffected","lessThanOrEqual":"5.15.*","versionType":"semver"},{"version":"6.1.191","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.157","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.110","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.18.51","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.5","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/scsi/qla2xxx/qla_nvme.c"]}],"references":["https://git.kernel.org/stable/c/6ee4e3774349fa04bba13e668f3322db47d89b08","https://git.kernel.org/stable/c/55259e225412721c3cc09e4d95a489542c0c05b0","https://git.kernel.org/stable/c/17d9011c96f819e69074f465c04ee79e693de6a1","https://git.kernel.org/stable/c/b403700ac62fbf3c310196386e125879a182efcf","https://git.kernel.org/stable/c/6a1b50c4879c2e6a034e8e85f9c055f0eea157c7","https://git.kernel.org/stable/c/67f0d5187c29360388f7e1e503c627ec45d01089","https://git.kernel.org/stable/c/f4aaa4a4e6f1da6f3abfd80e1917bef922287177","https://git.kernel.org/stable/c/7e85f6dbc85616de2172bce8eaf84b387a723cd1"],"weaknesses":[],"ingestedAt":"2026-10-30T12:52:04.348Z","source":{"repository":"CVEProject/cvelistV5","path":"cves/2026/89xxx/CVE-2026-89860.json","commit":"1f312381e38164a43607eebab851b151dd16861e","baselineCommit":"556c9d3a8cd17e218bb8e452ba7cd619a384ff47"},"raw":{"dataType":"CVE_RECORD","dataVersion":"5.2","cveMetadata":{"cveId":"CVE-2026-89860","state":"PUBLISHED","datePublished":"2026-09-16T10:31:32.263Z","dateUpdated":"2026-10-30T12:33:20.624Z","assignerShortName":"Linux","assignerOrgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateReserved":"2026-09-11T19:38:34.771Z"},"containers":{"cna":{"title":"scsi: qla2xxx: Initialize NVMe abort_work once at submission","descriptions":[{"lang":"en","value":"In the Linux kernel, the following vulnerability has been resolved:\n\nscsi: qla2xxx: Initialize NVMe abort_work once at submission\n\nqla_nvme_fcp_abort() and qla_nvme_ls_abort() ran INIT_WORK() on\npriv->abort_work immediately before schedule_work(). INIT_WORK()\nreinitializes the work_struct, resetting its list head and clearing the\npending bit. If an abort is issued more than once for the same command\n(for example, concurrent transport teardown and a timeout-driven abort),\nthe second INIT_WORK() reinitializes a work item that is already queued,\nwhich can corrupt the workqueue list and lead to crashes or a looping\nworker.\n\nInitialize priv->abort_work once at command submission, next to the\nexisting per-command spin_lock_init(&priv->cmd_lock), and leave only\nschedule_work() in the abort paths. schedule_work() already does nothing\nwhen the work item is still pending, so a repeated abort no longer\ndisturbs an in-flight work item. The command is not returned to the\ntransport until the final kref_put()/release callback runs after\nabort_work has completed, so the work item is idle before priv is reused\nand the single submission-time INIT_WORK() is safe."}],"affected":[{"vendor":"Linux","product":"Linux","defaultStatus":"unaffected","versions":[{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"6ee4e3774349fa04bba13e668f3322db47d89b08","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"55259e225412721c3cc09e4d95a489542c0c05b0","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"17d9011c96f819e69074f465c04ee79e693de6a1","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"b403700ac62fbf3c310196386e125879a182efcf","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"6a1b50c4879c2e6a034e8e85f9c055f0eea157c7","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"67f0d5187c29360388f7e1e503c627ec45d01089","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"f4aaa4a4e6f1da6f3abfd80e1917bef922287177","versionType":"git"},{"version":"e473b3074104ee09227cfbba5f872e3ea15dd280","status":"affected","lessThan":"7e85f6dbc85616de2172bce8eaf84b387a723cd1","versionType":"git"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/scsi/qla2xxx/qla_nvme.c"]},{"vendor":"Linux","product":"Linux","defaultStatus":"affected","versions":[{"version":"4.17","status":"affected"},{"version":"0","status":"unaffected","lessThan":"4.17","versionType":"semver"},{"version":"5.10.273","status":"unaffected","lessThanOrEqual":"5.10.*","versionType":"semver"},{"version":"5.15.224","status":"unaffected","lessThanOrEqual":"5.15.*","versionType":"semver"},{"version":"6.1.191","status":"unaffected","lessThanOrEqual":"6.1.*","versionType":"semver"},{"version":"6.6.157","status":"unaffected","lessThanOrEqual":"6.6.*","versionType":"semver"},{"version":"6.12.110","status":"unaffected","lessThanOrEqual":"6.12.*","versionType":"semver"},{"version":"6.18.51","status":"unaffected","lessThanOrEqual":"6.18.*","versionType":"semver"},{"version":"7.2.5","status":"unaffected","lessThanOrEqual":"7.2.*","versionType":"semver"},{"version":"7.3","status":"unaffected","lessThanOrEqual":"*","versionType":"original_commit_for_fix"}],"repo":"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git","programFiles":["drivers/scsi/qla2xxx/qla_nvme.c"]}],"references":[{"url":"https://git.kernel.org/stable/c/6ee4e3774349fa04bba13e668f3322db47d89b08"},{"url":"https://git.kernel.org/stable/c/55259e225412721c3cc09e4d95a489542c0c05b0"},{"url":"https://git.kernel.org/stable/c/17d9011c96f819e69074f465c04ee79e693de6a1"},{"url":"https://git.kernel.org/stable/c/b403700ac62fbf3c310196386e125879a182efcf"},{"url":"https://git.kernel.org/stable/c/6a1b50c4879c2e6a034e8e85f9c055f0eea157c7"},{"url":"https://git.kernel.org/stable/c/67f0d5187c29360388f7e1e503c627ec45d01089"},{"url":"https://git.kernel.org/stable/c/f4aaa4a4e6f1da6f3abfd80e1917bef922287177"},{"url":"https://git.kernel.org/stable/c/7e85f6dbc85616de2172bce8eaf84b387a723cd1"}],"metrics":[{"cvssV3_1":{"version":"3.1","vectorString":"CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H","baseScore":8.8,"baseSeverity":"HIGH"},"scenarios":[{"lang":"en","value":"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.\nAC: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.\nPR: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.\nUI: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.\nS: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.\nC: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.\nI: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.\nA:H - The corrupted workqueue can oops, panic, or run a looping worker, crashing or hanging the kernel, so availability is high."}]}],"providerMetadata":{"shortName":"Linux","orgId":"416baaa9-dc9f-4396-8d5f-8c081fb06d67","dateUpdated":"2026-10-30T12:33:20.624Z"},"cpeApplicability":[{"nodes":[{"operator":"OR","negate":false,"cpeMatch":[{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.17","versionEndExcluding":"5.10.273"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.17","versionEndExcluding":"5.15.224"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.17","versionEndExcluding":"6.1.191"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.17","versionEndExcluding":"6.6.157"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.17","versionEndExcluding":"6.12.110"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.17","versionEndExcluding":"6.18.51"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.17","versionEndExcluding":"7.2.5"},{"vulnerable":true,"criteria":"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*","versionStartIncluding":"4.17","versionEndExcluding":"7.3"}]}]}],"x_generator":{"engine":"bippy-1.2.0"}}}}}