NOWOŚĆ! Szkolenie AI w pracy admina

Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!

 

Krytyczna luka w Linux KVM na ARM64. W określonych warunkach można przejąć kontrolę nad hostem [CVE-2026-89775]

27 września 2026, 23:10 | Aktualności | 0 komentarzy
Tagi: , , ,

Na portalu openwall.com badacz bezpieczeństwa Hyunwoo Kim opublikował wpis zawierający szczegóły krytycznej podatności w podsystemie KVM (Kernel-based Virtual Machine) dla architektury ARM64 w jądrze Linuxa. Luka oznaczona identyfikatorem CVE-2026-89775 umożliwia ucieczkę z maszyny wirtualnej i uzyskanie dostępu do pamięci hosta. Może to prowadzić do przejęcia kontroli nad systemem (hypervisorem). 

TLDR:

  • Badacz Hyunwoo Kim wykrył krytyczną podatność (CVE-2026-89775) w podsystemie KVM dla architektury ARM64 w jądrze Linuxa.
  • Aby luka mogła zostać wykorzystana, w systemie musi być aktywna funkcja wirtualizacji zagnieżdżonej (nested virtualization).
  • W efekcie istnieje możliwość uzyskania dostępu do pamięci hosta, a w szczególnych sytuacjach RCE bezpośrednio w systemie gospodarza.
  • Błąd został naprawiony, zalecamy aktualizację jądra systemu Linux.

Co gorsza, ataki wykorzystujące tę wadę nie wyzwalają standardowych mechanizmów wykrywania (takich jak traps czy zdarzenia VM exit). W tej sytuacji działania atakującego są praktycznie niewidoczne z poziomu hypervisora.

Aby podatność mogła zostać wykorzystana, w systemie musi być włączona funkcja wirtualizacji zagnieżdżonej (nested virtualization), która na architekturze ARM64 pozostaje domyślnie wyłączona. Znacząco zawęża to powierzchnię ataku, co jednak w żaden sposób nie zmniejsza wagi samego problemu. Tam, gdzie funkcja ta została aktywowana zagrożenie jest realne, a skutki mogą być bardzo poważne.

Załóżmy, że wewnątrz maszyny wirtualnej chcemy uruchomić kolejną maszynę wirtualną. W domyślnej konfiguracji takie zadanie będzie niewykonalne – chociażby ze względu na brak wsparcia sprzętowego dla wirtualizacji (np. instrukcji Intel VT-x, AMD-V czy też ARM64 NV). Po aktywowaniu funkcji nested virtualization hypervisor przekazuje wsparcie dla tych instrukcji bezpośrednio do wnętrza maszyny wirtualnej. Dzięki temu można w niej zainstalować kolejny hypervisor, który uruchomi własną maszynę wirtualną (tzw. nested guest).

Nested virtualization. Źródło: opracowanie własne

Funkcja ta jest kluczowa m.in. dla chmur publicznych (AWS, AZURE) oraz środowisk testowych CI/CD.

CVE-2026-89775

Źródłem błędu jest logika zaimplementowana w obsłudze struktur kontrolnych wirtualizacji zagnieżdżonej, a dokładniej w procesie czyszczenia bufora TLB (Translation Lookaside Buffer) dla rejestru VNCR (Virtual Nested Control Register). 

Podczas obliczania rozmiaru obszaru do unieważnienia w buforze TLB, jądro systemu analizuje w pierwszej kolejności poziom przechodzenia tablicy stron Etapu 1 (stage-1 walk level). Na podstawie tego poziomu system określa, czy unieważnieniu podlega mała strona pamięci czy też większy blok.

Kiedy jednostka zarządzania pamięcią (MMU) dla Etapu 1 jest wyłączona, KVM przypisuje poziomowi przechodzenia stałą wartość S1_MMU_DISABLED równą -127.

Problem polegał na tym, że funkcja pgshift_level_to_ttl() przyjmowała tę wartość i bez żadnego ostrzeżenia rzutowała ją na typ u8 (unsigned byte, czyli liczbę z przedziału 0 – 255). Następnie funkcja brała pod uwagę jedynie dwa najniższe bity, co w tej sytuacji skutkowało przyjęciem wartości 0. 

W strukturze KVM wartość 0 jest zarezerwowana do oznaczania nieznanego rozmiaru bloku. Podczas czyszczenia bufora wartość ta została zinterpretowana jako poprawny zakres o długości 0 bajtów. W efekcie skutkowało to tym, że nieaktualny wpis w pamięci podręcznej procesora (stale mapping) został zachowany.

W praktyce oznacza to, że potencjalny atakujący posiada dostęp do zapisu i odczytu obszaru pamięci hosta, który został już zwolniony i nie powinien być osiągalny z poziomu maszyny wirtualnej. Co więcej, modyfikacja pamięci odbywa się w sposób niezauważalny dla hypervisora, omijając wszelkie zaimplementowane mechanizmy ochronne.

Przedstawiona sytuacja otwiera drogę nie tylko do wycieku danych z pamięci jądra, ale może również doprowadzić do potencjalnego wykonania złośliwego kodu. Biorąc pod uwagę, że wiele dystrybucji Linuksa udostępnia plik urządzenia /dev/kvm z uprawnieniami 0666, luka ta umożliwia lokalne podniesienie uprawnień (LPE) bezpośrednio na hoście przez nieuprzywilejowanego użytkownika.

Podatny kod występował w commicie 7270cc9157f47 i był obecny do czasu wydania oficjalnej poprawki w commit 8053393680d4. 

Listing kodu podatnej funkcji (commit 7270cc9157f4). Źródło: git.kernel.org
Funkcja po wdrożeniu poprawek (commit 8053393680d4). Źródło: git.kernel.org 

Najlepszym sposobem naprawy błędu jest aktualizacja jądra Linuksa do wersji zawierającej oficjalną poprawkę lub wdrożenie zaktualizowanego pakietu jądra dostarczonego przez dystrybutora systemu. W środowiskach, w których natychmiastowy restart hosta nie jest możliwy, zaleca się czasowe wyłączenie wirtualizacji zagnieżdżonej (oczywiście tam gdzie nie jest to niezbędne) oraz ograniczenie uprawnień do pliku /dev/kvm.

Źródło: openwall.com, git.kernel.org

~_secmike

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

Odpowiedz