CVE-2026-89854
WysokieCVSS 7.8Streszczenie
W sterowniku scsi: qla2xxx jądra Linux funkcja qla84xx_put_chip() zwalnia ostatnie odwołanie do ha->cs84xx i uwalnia je przez __qla84xx_chip_release() bez wyczyszczenia ha->cs84xx. Podczas rozbierania urządzenia działała ona przed scsi_remove_host(), która usuwa atrybut sysfs 84xx_fw_version. Równoległy odczyt tego atrybutu w oknie między tymi wywołaniami wywołuje qla24xx_84xx_fw_version_show(), która wyłuskuje zwolniony ha->cs84xx, powodując use-after-free.
Ocena ryzyka
Use-after-free może prowadzić do uszkodzenia pamięci jądra lub awarii systemu, a w sprzyjających warunkach do eskalacji uprawnień. Ryzyko występuje podczas rozbierania hosta przy równoczesnym odczycie atrybutu sysfs.
Rekomendacja
Zaktualizuj jądro Linux do wersji zawierającej poprawkę przenoszącą qla84xx_put_chip() po scsi_remove_host() w qla2x00_remove_one() i qla2x00_disable_board_on_pci_error(). Do czasu wdrożenia poprawki unikaj równoczesnego odczytu atrybutu 84xx_fw_version podczas usuwania hosta.
Inne podatności w Linux kernel (qla2xxx)
Zobacz wszystkie- CVE-2026-89856Wysokie
W sterowniku scsi: qla2xxx jądra Linux liczba kolejek wyliczana z liczby wektorów MSI-X (msix_count - 1) jest zapisywana do pola typu u8, co powoduje obcięcie wartości. Przy 257 wektorach MSI-X wynik 256 obcina się do 0, a w trybie target kolejna dekrementacja powoduje niedomknięcie do 255. Gdy liczba kolejek wynosi 0, alokacja zwraca ZERO_SIZE_PTR, który nie jest NULL-em, więc sprawdzenie przechodzi i dochodzi do wyłuskania tego wskaźnika, co psuje pamięć lub powoduje awarię jądra.
- CVE-2026-89855Nieznane
W sterowniku scsi: qla2xxx jądra Linux operacja resetu przez sysfs "update cache versions without reset" (0x20261) wywołuje get_flash_version(), która odczytuje rejestry flash sprzętu, bez trzymania muteksu ha->optrom_mutex. Ścieżka aktualizacji VPD serializuje to samo wywołanie pod optrom_mutex, więc ścieżka resetu może przeplatać dostępy do rejestrów flash z równoległą operacją VPD lub optrom i uszkodzić odczyty.
- CVE-2026-89853Nieznane
W sterowniku scsi: qla2xxx jądra Linux funkcja qla2x00_free_fce_trace() zwalniała i czyściła ha->fce trzymając tylko fce_mutex. Konsumenci zrzutu firmware qla27xx_fwdt_entry_t264() i qla25xx_copy_fce() odczytują ha->fce (sprawdzenie NULL, a następnie kopiowanie bufora) pod hardware_lock i nigdy nie biorą fce_mutex. Wyłączenie FCE przez debugfs mogło więc zwolnić bufor DMA między sprawdzeniem NULL a kopiowaniem, powodując use-after-free.
- CVE-2026-89852Nieznane
W sterowniku scsi: qla2xxx jądra Linux struktura mbx_cmd_t jest alokowana na stosie, ale pozostaje niezainicjalizowana. qla2x00_mailbox_command() ma kilka ścieżek wczesnego powrotu (trwała awaria PCI, awaria urządzenia, zajętość EEH, oczekujący abort ISP, przekroczenie czasu dostępu do skrzynki pocztowej, purge mbox), które wracają bez zapisania rejestrów wejściowych skrzynki do mcp->mb[]. qla2x00_get_firmware_state() następnie bezwarunkowo kopiuje mcp->mb[1..6] (oraz mb[12]) do tablicy states[] wywołującego, niezależnie od wartości zwracanej.
- CVE-2026-89851Nieznane
W sterowniku scsi: qla2xxx jądra Linux funkcja qla2x00_dfs_fce_write() wywoływała kstrtoul() z wskaźnikiem wyniku ustawionym na NULL, więc udane parsowanie powodowało wyłuskanie NULL i oops. Co gorsza, wartość zwracana typu int (0 przy sukcesie, ujemny errno przy błędzie) była przypisywana do flagi enable typu unsigned long, odwracając zamierzoną logikę: prawidłowa liczba była traktowana jako "wyłącz", a błąd parsowania włączał FCE.
Oryginalny opis (angielski, źródło NVD)
In the Linux kernel, the following vulnerability has been resolved: scsi: qla2xxx: Fix cs84xx use-after-free on host teardown qla84xx_put_chip() drops the last reference to ha->cs84xx and frees it via __qla84xx_chip_release() without clearing ha->cs84xx. During teardown it ran before scsi_remove_host(), which is what removes the 84xx_fw_version host sysfs attribute. A concurrent read of that attribute in the window between the two calls executes qla24xx_84xx_fw_version_show(), which dereferences the freed ha->cs84xx, resulting in a use-after-free. Move qla84xx_put_chip() to after scsi_remove_host() in both qla2x00_remove_one() and qla2x00_disable_board_on_pci_error(). Once scsi_remove_host() returns, the sysfs attribute is gone and kernfs has drained any in-flight show(), so no reader can touch cs84xx; the put still runs before the host and ha are freed.

