Tworzenie struktury badawczej

https://chacker.pl/

Zaczynamy krótką dyskusją na temat powierzchni ataku hypervisora, a następnie obejmuje opracowanie struktury, której będziemy używać do celów badawczych dotyczących podatności. Aby śledzić laboratoria w tym rozdziale, będziesz potrzebować zaawansowanej wiedzy na temat języków C i Python.

Plik Dockerfile zapewnia środowisko programistyczne niezbędne do zbudowania i uruchomienia kodu:

Hiperwizor, z którym będziemy pracować w tym rozdziale to KVM (domyślny Linux), który musi zostać zainstalowany na hoście. Aby użyć go z kontenera, musisz przekierować urządzenie /dev/kvm, tak jak tutaj:

Po wejściu do kontenera Docker cały kod można znaleźć w katalogu /labs.

Podsumowanie

https://chacker.pl/

Przyjrzeliśmy się ogólnym koncepcjom wirtualizacji — przechodząc od modeli teoretycznych do konkretnych implementacji w architekturze x86. Omówiliśmy niektóre z początkowych ograniczeń architektury x86 i techniki stosowane w celu ich przezwyciężenia. Na koniec omówiliśmy zarówno ewolucję oprogramowania hypervisora, jak i samą architekturę x86, wraz z wprowadzeniem rozszerzeń wirtualizacji sprzętowej. W następnym rozdziale wykorzystamy tę wiedzę do mapowania powierzchni ataku dla szerokiego zakresu implementacji hypervisora: od tych obsługujących stare modele x86, po implementacje wykorzystujące obecne możliwości sprzętowe i te obejmujące obsługę parawirtualizacji.

EPT

https://chacker.pl/

Widzieliśmy, jak można wdrożyć stronicowanie w tle na istniejącym mechanizmie stronicowania, aby wirtualizować MMU. Stronicowanie w tle jest złożone, a aktualizacje tablic stron są kosztowne; dlatego, aby poprawić tę sytuację, opracowano nową technologię wspomaganą sprzętowo, znaną jako Second Level Address Translation (SLAT). Intel implementuje SLAT z Extended Page Tables (EPT29). W skrócie, EPT działa jak tablice stron; różnica polega na tym, że podczas gdy tablice stron tłumaczą VA na PA, EPT tłumaczy GPA na SPA. VMM działający w trybie głównym VMX musi skonfigurować i utrzymywać zestaw wielopoziomowych tablic stron EPT, które są używane do tłumaczenia GPA na SPA. Wskaźnik EPT najwyższego poziomu (EPTP30) jest przechowywany w jednym z pól sterujących VMCS. Z perspektywy gościa nadal używamy tablic stron jak zwykle, aby tłumaczyć VA na PA; w rzeczywistości są to GVA i GPA. Aby uzyskać dostęp do strony, procesor najpierw przechodzi przez tabele stron gościa, aby uzyskać GPA z jego GVA; następnie przechodzi przez tabele EPT (które są niewidoczne dla gościa), aby uzyskać SPA z GPA. Jeśli przypomnimy sobie sprzętowy wirtualizator Goldberga, moglibyśmy zobaczyć tabele stron jako mapę ϕ, a EPT jako mapę f. Tłumaczenie GVA na SPA jest wykonywane przez złożoną mapę „f ° ϕ”. Należy pamiętać, że gdy procesor przechodzi przez wielopoziomowe tabele stron gościa, każdy poziom (w trybie długim: PML4, PDPT, PD, PT) wskazuje na następny przez swój GPA, co oznacza, że ​​każdy poziom tabeli stron musi zostać przetłumaczony przez mechanizm EPT. Jest to znane jako „dwuwymiarowe przejście strony”, a w najgorszym przypadku (gdy każdy krok tłumaczenia powoduje brak pamięci podręcznej) do przetłumaczenia GVA potrzeba 24 obciążeń pamięci. Nawet jeśli translacja adresów może być droższa niż w przypadku stronicowania w tle, największą zaletą EPT jest to, że aktualizacje tablicy stron są bezpośrednie, co zmniejsza liczbę pułapek i upraszcza implementację VMM.

Podobnie jak w przypadku tabel stron, EPT umożliwia mapowanie adresu na nieistniejącą stronę fizyczną. Próba dostępu w tym przypadku spowoduje wyjście maszyny wirtualnej. Podstawowym powodem wyjścia dla tego rodzaju pułapki jest naruszenie EPT.32 Ponadto pola kwalifikacji wyjścia i adresu fizycznego gościa są ustawione. W niektórych przypadkach EPT może nie być całkowicie niewidoczne dla gości; w celu poprawy wydajności niektóre funkcje związane z EPT mogą być udostępnione maszynom wirtualnym. Jedną z tych funkcji jest funkcja przełączania EPT (wywoływana za pomocą instrukcji VMFUNC), która umożliwia gościowi jawne przełączanie swojego EPTP z listy wartości ustalonych przez VMM. Inną ważną funkcją są wyjątki wirtualizacji (#VE34). Jak sama nazwa wskazuje, funkcja ta może być używana do dostarczania wyjątków związanych z wirtualizacją do gościa za pośrednictwem wektora IDT 20. Ta funkcja może być używana razem z naruszeniami konwertowalnego EPT, więc gdy dochodzi do naruszenia EPT, nie powoduje to wyjścia maszyny wirtualnej. Zamiast tego gość otrzymuje komunikat #VE, który go obsługuje, dzięki czemu unika się pułapek w VMM.

Powody wyjścia VM

https://chacker.pl/

VM-Exit mogą być synchroniczne lub asynchroniczne, przy czym te drugie pochodzą ze źródeł, takich jak przerwania zewnętrzne lub timer wywłaszczania VMX. Synchroniczne wyjścia VM są spowodowane zachowaniem VM i mogą być warunkowe lub bezwarunkowe. Tylko bardzo niewiele instrukcji powoduje bezwarunkowe wyjścia VM (CPUID jest jednym z nich), a pozostałe spowodują warunkowe wyjście VM w zależności od konfiguracji VMCS (pola kontrolne). Można by pomyśleć, że instrukcje wrażliwe na sterowanie zawsze będą powodować wyjścia VM, ale jak widzieliśmy, można przyznać maszynie wirtualnej dostęp do zasobów systemowych, więc nie zawsze jest to prawdą. Może się również zdarzyć sytuacja odwrotna: niegroźne instrukcje, takie jak instrukcja PAUSE spin-loop hint, mogą być ustawione tak, aby powodować VM-Exit (aby rozwiązać problem wywłaszczenia posiadacza blokady). Inne wrażliwe instrukcje mogą być obsługiwane przez VMM (warunkowe VMExit) lub bezpośrednio przez sprzęt wirtualizacji. Wreszcie, te nieuprzywilejowane, wrażliwe instrukcje, o których mówiliśmy wcześniej w tym rozdziale, mogą być teraz prawidłowo obsługiwane.

Pola informacji o wyjściu maszyny wirtualnej VMCS

https://chacker.pl/

W przypadku zdarzeń wyjścia maszyny wirtualnej kilka pól VMCS jest aktualizowanych informacjami o charakterze zdarzenia. Najważniejsze jest pole exit-reason, które koduje przyczynę VM-Exit. Inne pola uzupełniają je o informacje specyficzne dla zdarzenia; niektóre z nich to kwalifikacja wyjścia, długość instrukcji, informacje o instrukcji, informacje o przerwaniu, liniowy adres gościa i fizyczny adres gościa.

Pola sterowania VMCS

https://chacker.pl/

Zachowanie trybu VMX innego niż root można selektywnie kontrolować za pomocą zestawu pól sterowania VMCS. Między innymi umożliwiają one:

  • Kontrolę, które zdarzenia mogą powodować wyjście maszyny wirtualnej.
  • Kontrolę przejść VM-Exit i VM-Enter, w tym szczegółów dotyczących zapisywania stanu procesora. W przypadku VM-Enter możliwe jest syntezowanie przerwań i wyjątków („wstrzykiwanie zdarzeń”).
  • Konfigurowanie różnych innych funkcji wirtualizacji, takich jak EPT, wirtualizacja APIC, nieograniczony gość i cieniowanie VMCS.

• Udzielanie dostępu do zasobów systemowych (mapy bitowe IO i MSR). Umożliwia to tworzenie uprzywilejowanych maszyn wirtualnych z możliwościami dostępu sprzętowego.

Obszar „stanu gościa” VMCS

https://chacker.pl/

Ten obszar odpowiada polom VMCS, w których stan procesora wirtualnego jest zapisywany po wyjściu z maszyny wirtualnej, a te same pola są używane do ładowania stanu procesora wirtualnego po wejściu do maszyny wirtualnej. Jest to minimalny stan, który powinien być obsługiwany przez sprzęt, aby bezpiecznie przejść z trybów VMX i powinien obejmować co najmniej następujące elementy:

  • RIP, RSP, RFLAGS.
  • Rejestry sterujące, DR7.
  • Selektor, prawa dostępu, baza i limit rejestrów segmentów, LDTR i TR. Baza i limit GDTR i IDTR.

• MSR: IA32_EFER, IA32_SYSENTER_CS, IA32_SYSENTER_ESP i IA32_SYSENTER_EIP.

VMX

https://chacker.pl/

Firma Intel wprowadziła zestaw instrukcji Virtual Machine Extensions (VMX), dodając dwa nowe tryby wykonywania procesora: tryb operacyjny VMX root i tryb operacyjny VMX non-root.23 Podobnie jak w trybie nadzorcy, tryb VMX root to miejsce, w którym działa oprogramowanie VMM, podczas gdy maszyny wirtualne działają w trybie VMX non-root. Nie należy mylić trybów działania VMX z poziomami pierścienia; są one całkowicie niezwiązane. Co więcej, maszyna wirtualna w trybie VMX non-root może wykonywać kod na dowolnym poziomie pierścienia; w związku z tym jednym z ograniczeń rozwiązywanych przez rozszerzenia wirtualizacji sprzętowej jest kompresja pierścieniowa.

UWAGA: Możesz znaleźć osoby mówiące o „Ring -1” (ujemna jedynka). Tak naprawdę mają na myśli tryb główny VMX. Tryby działania VMX nie są powiązane z poziomami pierścienia, a odwoływanie się do „Ring -1” powoduje jedynie zamieszanie.

Przejście z trybu głównego do trybu nie-root nazywa się VM-Enter,24 natomiast przejście z trybu nie-root do trybu głównego znane jest jako VM-Exit. Możemy myśleć o tym ostatnim jako o czymś podobnym do mechanizmu pułapki niewidocznej dla oprogramowania opisanego w sprzętowym wirtualizatorze Goldberga. Dzięki temu nowemu mechanizmowi pułapki wprowadzonemu przez tryby działania VMX, VMM nie musi już używać IDT do celów wirtualizacji, ale nadal musi go używać do obsługi wyjątków sprzętowych i przerwań. Do struktury danych znanej jako struktura sterowania maszyną wirtualną (VMCS) można uzyskać dostęp z trybu głównego VMX. Manipulując tą strukturą, VMM może kontrolować wiele aspektów wirtualizacji, w tym zachowanie przejść między trybami VMX. Zwykle VMCS jest przypisany do każdego wirtualnego procesora każdej maszyny wirtualnej (maszyna wirtualna może mieć więcej niż jeden wirtualny procesor), ale każdy fizyczny procesor (lub logiczny procesor, biorąc pod uwagę SMT) może mieć tylko jeden „bieżący” VMCS. Pola VMCS można sklasyfikować w kilku różnych grupach, które omówimy.

Wirtualizacja wspomagana sprzętowo

https://chacker.pl/

Do tej pory widzieliśmy, jak wirtualizację osiągnięto w architekturze x86 przed pojawieniem się wirtualizacji wspomaganej sprzętowo. Aby przezwyciężyć wcześniejsze ograniczenia architektoniczne i pomóc w rozwoju VMM, wprowadzono rozszerzenia sprzętowe. Około 2005 r. niezależnie opracowano dwie główne implementacje: Intel Virtualization Technology Extensions (VT-x) i AMD Virtualization (AMD-V), wcześniej znane jako Secure Virtual Machine (SVM). Pozostała część tego rozdziału obejmie niektóre aspekty VT-x.