Dwa błędy w obsłudze protokołu iSCSI w jądrze Linuxa zostały zidentyfikowane i naprawione 1. Luki, obecne w kodzie od wielu lat, mogły być wykorzystane przez zdalnego atakującego do spowodowania błędu krytycznego jądra i w konsekwencji paraliżu systemu. Problem dotyczy serwerów pełniących rolę celu iSCSI, co jest częstą konfiguracją w centrach danych i firmowych macierzach dyskowych, również w Polsce.

TL;DR

  • Produkt: Jądro Linuxa, podsystem scsi: target: iscsi (LIO).
  • Podatność: CVE-2026-63888 2 — kombinacja błędu odczytu poza bufor (out-of-bounds read) i podwójnego zwolnienia pamięci (double-free).
  • Wektor: Zdalny, nieuwierzytelniony atak poprzez wysłanie spreparowanych pakietów iSCSI (Text PDU) do serwera (targetu).
  • Wpływ: Na systemach z utwardzonym jądrem (domyślna konfiguracja w większości dystrybucji) atak prowadzi do zdalnego wywołania błędu krytycznego jądra (kernel BUG()), czyli odmowy usługi (DoS) 3. Na systemach bez tych zabezpieczeń dochodzi do uszkodzenia pamięci jądra 4.
  • Kogo dotyczy: Administratorów systemów Linux udostępniających zasoby dyskowe przez iSCSI, np. w polskich firmach hostingowych, prywatnych chmurach czy korporacyjnych sieciach SAN.
  • Pierwszy ruch: Identyfikacja serwerów z aktywnym targetem iSCSI i zaplanowanie pilnej aktualizacji jądra systemu operacyjnego.

Wektor ataku

Podatność oznaczona jako CVE (Common Vulnerabilities and Exposures, identyfikator publicznie znanej luki) CVE-2026-63888 2 rezyduje w funkcji iscsit_handle_text_cmd() 5. Funkcja ta odpowiada za przetwarzanie poleceń tekstowych w protokole iSCSI (Internet Small Computer Systems Interface), który służy do komunikacji z zasobami dyskowymi przez sieć IP. Błędy dotyczą implementacji celu iSCSI w jądrze, znanej jako LIO, i są obecne od momentu jej integracji 1.

Zaobserwowano dwa odrębne problemy logiczne.

Błąd 1: Odczyt poza bufor (Buffer Over-read)

Pierwszy błąd polega na odczytaniu 4 bajtów danych poza alokowany bufor pamięci 6. Dochodzi do tego podczas weryfikacji sumy kontrolnej CRC32C dla pakietów tekstowych. Funkcja iscsit_crc_buf() błędnie obliczała rozmiar danych do przetworzenia, co skutkowało odczytem spoza przeznaczonego na to obszaru 7.

Narzędzie diagnostyczne KASAN (KernelAddressSANitizer) potwierdza ten błąd jako slab-out-of-bounds 8. Wartość odczytana spoza bufora nie jest bezpośrednio zwracana atakującemu. Służy jedynie do obliczenia sumy kontrolnej 9. Mimo to, jest to poważne naruszenie bezpieczeństwa pamięci, które w innych okolicznościach mogłoby prowadzić do wycieku informacji. Poprawka polega na przekazaniu do funkcji prawidłowego rozmiaru bufora 10.

Błąd 2: Podwójne zwolnienie pamięci (Double-Free)

Drugi, znacznie poważniejszy błąd, to podwójne zwolnienie tego samego obszaru pamięci 11. Scenariusz ataku wygląda następująco:

  1. Atakujący wysyła pakiet tekstowy iSCSI z celowo uszkodzoną sumą kontrolną (DataDigest).
  2. Jeśli na serwerze włączony jest mechanizm odzyskiwania po błędach (ErrorRecoveryLevel > 0), jądro po cichu odrzuca pakiet i zwalnia bufor pamięci, w którym był on przechowywany (kfree(text_in)) 12.
  3. Krytyczny błąd polega na tym, że wskaźnik do tego bufora (cmd->text_in_ptr) nie jest zerowany. Nadal wskazuje na zwolniony, „wiszący” obszar pamięci.
  4. Gdy atakujący wyśle kolejne żądanie tekstowe w tej samej sesji, jądro bezwarunkowo próbuje zwolnić ten sam bufor po raz drugi 13. Do podwójnego zwolnienia może dojść również w momencie zrywania połączenia 14.

Konsekwencje są dwojakie. Na większości nowoczesnych dystrybucji Linuxa, które używają jądra z włączoną opcją CONFIG_SLAB_FREELIST_HARDENED=y, próba podwójnego zwolnienia pamięci jest natychmiast wykrywana i kończy się błędem krytycznym BUG() 3. Z perspektywy administratora wygląda to jak nagła, niewyjaśniona awaria systemu. Ponieważ atak można przeprowadzić zdalnie, jest to prosta droga do ataku typu Denial of Service na krytyczną infrastrukturę storage.

Na systemach bez tego zabezpieczenia, podwójne zwolnienie prowadzi do uszkodzenia wewnętrznych struktur jądra zarządzających pamięcią (slab freelist) 4. Taki stan jest niestabilny i może prowadzić do nieprzewidywalnych awarii lub, w teorii, stwarzać warunki do eskalacji uprawnień. Poprawka polega na wyzerowaniu wskaźnika zaraz po pierwszym zwolnieniu pamięci 15.

Wskaźniki kompromitacji

Luka CVE-2026-63888 jest podatnością w oprogramowaniu, a nie aktywną kampanią złośliwego oprogramowania. W związku z tym nie istnieją klasyczne wskaźniki kompromitacji (IoC — Indicators of Compromise) takie jak hashe plików, adresy IP serwerów C2 (Command and Control) czy złośliwe domeny.

Jedynym wskaźnikiem jest posiadanie systemu Linux z podatną wersją jądra, który jednocześnie pełni rolę celu iSCSI i jest dostępny sieciowo dla potencjalnych inicjatorów (klientów).

Co zrobić w 24-48h

Obie poprawki są niewielkie, jednolinijkowe 16 i zostały już zintegrowane w głównych gałęziach rozwojowych jądra. Producenci dystrybucji (Red Hat, Canonical, SUSE, Debian itd.) powinni wkrótce udostępnić lub już udostępnili zaktualizowane pakiety jądra.

Sugerowane podejście:

  1. Identyfikacja zasobów: Zidentyfikuj wszystkie systemy Linux w swojej infrastrukturze, które działają jako cel iSCSI (target). Można to zrobić, sprawdzając, czy działają odpowiednie usługi (np. targetcli, lio-utils) i czy port TCP 3260 jest otwarty na nasłuch.

  2. Aktualizacja jądra: Zainstaluj najnowsze dostępne aktualizacje jądra dla używanej dystrybucji. To jedyny skuteczny sposób na permanentne załatanie luki. Po aktualizacji wymagany jest restart systemu.

  3. Ograniczenie dostępu: W ramach dobrej praktyki, a także jako tymczasowe zabezpieczenie, upewnij się, że dostęp do portu iSCSI (TCP 3260) jest ściśle ograniczony. Reguły firewalla powinny zezwalać na połączenia tylko z zaufanych adresów IP serwerów (inicjatorów), które muszą mieć dostęp do zasobów dyskowych. Publiczne wystawienie portu iSCSI do internetu jest konfiguracją skrajnie ryzykowną.

  4. Monitoring: Monitoruj logi systemowe pod kątem nieoczekiwanych restartów lub błędów jądra (kernel panic / BUG) na serwerach iSCSI. Może to wskazywać na próby wykorzystania luki. Luki w niskopoziomowych komponentach, takich jak sterowniki jądra, są szczególnie dotkliwe. Dotykają fundamentu, na którym zbudowane są usługi. W kontekście regulacji takich jak NIS2 (unijna dyrektywa o bezpieczeństwie sieci), zapewnienie integralności i dostępności kluczowych systemów storage jest obowiązkiem podmiotów kluczowych i ważnych. Powyższe rekomendacje stanowią sugerowane podejście i nie zastępują pełnej analizy ryzyka ani konsultacji z zespołem do spraw bezpieczeństwa.

Źródła

Zobacz też

Przypisy

  1. Wykryto dwa błędy w obsłudze fazy tekstowej (Text-phase handler), obecne od integracji LIO w commicie e48354ce078c. — nvd.nist.gov › CVE 2026 63888 2

  2. W jądrze Linuxa rozwiązano lukę CVE-2026-63888. — nvd.nist.gov › CVE 2026 63888 2

  3. Na jądrach dystrybucyjnych z CONFIG_SLAB_FREELIST_HARDENED=y (domyślnie) podwójne zwolnienie pamięci staje się zdalnym błędem jądra (kernel BUG()). — nvd.nist.gov › CVE 2026 63888 2

  4. Na jądrach bez CONFIG_SLAB_FREELIST_HARDENED podwójne zwolnienie pamięci uszkadza listę wolnych bloków slab (slab freelist). — nvd.nist.gov › CVE 2026 63888 2

  5. Luka dotyczy funkcji iscsit_handle_text_cmd() w sterowniku scsi: target: iscsi. — nvd.nist.gov › CVE 2026 63888

  6. Pierwszy błąd to odczyt poza bufor (overread) CRC DataDigest o 4 bajty poza text_in. — nvd.nist.gov › CVE 2026 63888

  7. Funkcja iscsit_crc_buf() odczytuje rx_size bajtów z text_in za pomocą crc32c(), co prowadzi do odczytu 4 bajtów poza alokację text_in gdy DataDigest jest negocjowany. — nvd.nist.gov › CVE 2026 63888

  8. KASAN odtwarza ten błąd jako slab-out-of-bounds w crc32c() wywoływanym ze ścieżki Text PDU. — nvd.nist.gov › CVE 2026 63888

  9. Odczytane bajty poza bufor są używane do crc32c() i porównywane z sumą kontrolną dostarczoną przez inicjatora, więc wartość nie trafia z powrotem do atakującego. — nvd.nist.gov › CVE 2026 63888

  10. Naprawiono to poprzez przekazanie rzeczywistej długości ładunku (ALIGN(payload_length, 4)) użytej do kzalloc(). — nvd.nist.gov › CVE 2026 63888

  11. Drugi błąd to podwójne zwolnienie pamięci (double-free) w przypadku niezgodności DataDigest z ErrorRecoveryLevel > 0. — nvd.nist.gov › CVE 2026 63888

  12. W przypadku niezgodności DataDigest i ErrorRecoveryLevel > 0, handler cicho odrzuca PDU i zwalnia text_in, ale cmd->text_in_ptr nadal wskazuje na zwolniony bufor. — nvd.nist.gov › CVE 2026 63888

  13. Kolejne żądanie tekstowe na tym samym ITT ponownie wchodzi do iscsit_setup_text_cmd(), co bezwarunkowo zwalnia ten sam wskaźnik po raz drugi. — nvd.nist.gov › CVE 2026 63888

  14. Zakończenie sesji przez iscsit_release_cmd() również prowadzi do podwójnego zwolnienia pamięci, jeśli połączenie zostanie zerwane przed nadejściem drugiego żądania tekstowego. — nvd.nist.gov › CVE 2026 63888

  15. Naprawiono to poprzez wyczyszczenie cmd->text_in_ptr po kfree() w ścieżce odrzucenia ERL>0. — nvd.nist.gov › CVE 2026 63888

  16. Obie poprawki to jednolinijkowe zmiany. — nvd.nist.gov › CVE 2026 63888