CVE-2026-89844 PUBLISHED

scsi: qla2xxx: Hold vport_slock for host map update in report ID acquisition

Assigner: Linux
Reserved: 11.09.2026 Published: 16.09.2026 Updated: 16.09.2026

In the Linux kernel, the following vulnerability has been resolved:

scsi: qla2xxx: Hold vport_slock for host map update in report ID acquisition

qla24xx_report_id_acquisition() format-1 handling drops vport_slock after taking the vport reference and then calls qla_update_host_map() without the lock. That reaches qla_update_vp_map(), which mutates the ha->host_map btree via btree_insert32()/btree_update32()/btree_remove32() and is documented to require vport_slock to be held by the caller. Running it unlocked can race concurrent host_map updates and corrupt the btree.

The format-2 path in the same function already wraps its host_map update (SET_AL_PA) in vport_slock; the format-1 path is the lone outlier.

Hold vport_slock across the format-1 qla_update_host_map() call to honor the documented locking contract. The vref_count taken in the loop keeps the vport valid, so this only adds the missing host_map serialization.

Metrics

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 - qla24xx_report_id_acquisition() runs from qla2xxx response and ATIO interrupt paths when firmware reports NPIV N_Port ID acquisition or VP_STAT_ID_CHG after fabric FDISC. A peer or switch on the same Fibre Channel SAN can drive those events; FC is a non-routable fabric, so Adjacent is the highest defensible vector. AC:L - A fabric attacker can bounce the link or induce ID changes so multiple NPIV ports re-acquire IDs while the ATIO MSI-X path (atio_lock) and the response-queue path both call qla_update_host_map() on the shared ha->host_map btree. The attacker drives both sides of that race and can retry at fabric-event rate. PR:N - Report-ID IOCBs are firmware completions of unauthenticated Fibre Channel fabric login and ID assignment. The path checks no Linux credentials or capabilities on the victim host; FC-SP/EDIF is opt-in and not required. UI:N - Host-map updates run automatically in interrupt context when the HBA logs NPIV ports into the fabric or the fabric changes a VP ID. No user or administrator action such as mounting a device is required. S:U - Concurrent btree mutation corrupts qla2xxx host-map and kernel heap state inside the same host kernel security authority. This is not a VM escape, IOMMU bypass, or other cross-boundary impact. C:H - Unlocked btree_insert32/update32/remove32 on ha->host_map can free or reuse btree nodes while another CPU walks them, and the tree stores scsi_qla_host pointers consumed by qla_find_host_by_d_id(). That is UAF-class heap corruption enabling kernel memory disclosure. I:H - The same unlocked btree mutation can corrupt node pointers, double-free mempool objects via btree_shrink(), and install attacker-influenced scsi_qla_host pointers used to dispatch incoming FCP/ATIO commands, yielding write and control-flow primitives. A:H - lib/btree.c BUG_ON()s on inconsistent nodes, and a corrupted host_map causes oopses in interrupt context when ATIO or response processing dereferences a bad vha pointer, panicking the storage host.

Product Status

Vendor Linux
Product Linux
Versions Default: unaffected
  • affected from 430eef03a763e5e76a371ba6d02779ae4a64b6ea to e8f1b0cb9782338c6341ceed816e9c1243743cdd (excl.)
  • affected from 430eef03a763e5e76a371ba6d02779ae4a64b6ea to 6ed66e2a67bbd22877008ff9aa64bd574a7fc011 (excl.)
  • affected from 430eef03a763e5e76a371ba6d02779ae4a64b6ea to 776e4e8cbcf155302f430ce9793d1502e3c113a0 (excl.)
  • affected from 430eef03a763e5e76a371ba6d02779ae4a64b6ea to 7d0b3f745efb24c0aac5e06b49b3420bc65d23b9 (excl.)
  • affected from 430eef03a763e5e76a371ba6d02779ae4a64b6ea to 7944039ba9cb5c3a935d17c91004e3b8649ff58e (excl.)
Vendor Linux
Product Linux
Versions Default: affected
  • Version 6.3 is affected
  • unaffected from 0 to 6.3 (excl.)
  • unaffected from 6.6.157 to 6.6.* (incl.)
  • unaffected from 6.12.110 to 6.12.* (incl.)
  • unaffected from 6.18.51 to 6.18.* (incl.)
  • unaffected from 7.2.5 to 7.2.* (incl.)
  • unaffected from 7.3-rc1 to * (incl.)

References