NOWOŚĆ! Szkolenie AI w pracy admina
Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!
NOWOŚĆ! Szkolenie AI w pracy admina
Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!
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:
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).

Funkcja ta jest kluczowa m.in. dla chmur publicznych (AWS, AZURE) oraz środowisk testowych CI/CD.
Ź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.


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