Katalog CVE

CVE-2026-89856

WysokieCVSS 8.4
Opublikowano: Zaktualizowano: Przetłumaczono: NVD NIST

Streszczenie

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.

Ocena ryzyka

Podatność może prowadzić do uszkodzenia pamięci jądra lub jego awarii (panic), powodując odmowę usługi. Ryzyko jest szczególnie istotne przy urządzeniach hot-plug lub skonfigurowanych w sposób umożliwiający zgłoszenie dużej liczby wektorów MSI-X.

Rekomendacja

Zaktualizuj jądro Linux do wersji zawierającej poprawkę wprowadzającą funkcję qla_calc_queue_count() ograniczającą wyliczoną wartość do zakresu [1, QLA_MAX_QUEUES - 1]. Jeśli aktualizacja nie jest możliwa, ogranicz możliwość hot-plug niezaufanych urządzeń qla2xxx.

Inne podatności w Linux kernel (qla2xxx)

Zobacz wszystkie
Oryginalny opis (angielski, źródło NVD)

In the Linux kernel, the following vulnerability has been resolved: scsi: qla2xxx: Clamp MSI-X derived queue counts to avoid truncation ha->msix_count is u16, but ha->max_req_queues, ha->max_rsp_queues and ha->max_qpairs are u8. Deriving the queue count as "ha->max_req_queues = ha->msix_count - 1" therefore truncates: a board (or a misconfigured/malicious hot-plugged device) advertising 257 MSI-X vectors yields msix_count - 1 == 256, which truncates to 0. An MSI-X count of 1 zeroes it as well, and in target mode the subsequent "ha->max_req_queues--" then underflows 0 to 255. When the count is 0, qla2x00_alloc_queues() calls kzalloc_objs(struct req_que *, 0), which returns ZERO_SIZE_PTR. That is not NULL, so the allocation check passes and the following "ha->req_q_map[0] = req" dereferences ZERO_SIZE_PTR, corrupting memory or crashing the kernel. Add qla_calc_queue_count() to clamp the derived value into [1, QLA_MAX_QUEUES - 1] so it always fits in u8 and is never zero, and use it at all three derivation sites (qla25xx_iospace_config(), qla83xx_iospace_config() and qla24xx_enable_msix()). Also guard the target-mode decrement so it cannot reintroduce a zero (which would in turn underflow max_qpairs).

Dane podatności pochodzą z NVD (NIST) · CISA KEV · EPSS