Haftungsausschluss: Ich strebe ein relativ hohes Verständnis an. Wenn Sie eine detaillierte Anleitung wünschen, ist dies nicht möglich. Darüber hinaus gibt es andere Möglichkeiten (vollständig in Software), virtuelle Maschinen zu implementieren, für die dies nicht gilt. Ich konzentriere mich auch darauf, nur durch die Virtualisierungsmechanismen "auszubrechen" - dh nicht durch solche, die auf tatsächlich hart vernetzten Hosts von PC zu PC passieren können.
Ich mag Details, also hier sind wir geh mit einigen. Erstens verfügt Codeproject über einige hervorragende Assembler-Referenzen zu den verschiedenen Modi einer x86-CPU (real, geschützt und lang) und zur Verwendung der Virtualisierung. Es gibt einen Intel VT-Blog (ich bin mir nicht sicher, ob Intel dies schreibt) und schließlich ist der erste Teil des Rootkit Arsenal der Erklärung von x86 gewidmet und eine ausgezeichnete Lektüre. Komplett mit exemplarischen Vorgehensweisen und schönen Diagrammen. Um alles zu verstehen, ist Geduld erforderlich. Ich werde hier also eine kurze Einführung in die Funktionsweise geben.
Die Art und Weise, wie wir gerockt haben, als wir DOS p ausgeführt haben >
DOS- und frühe 16-Bit-Realmodus-Systeme betreiben ein segmentiertes Speichermodell. Es gibt keine Kontrolle über die Größe von Segmenten und es gibt keine Schutzschalter für eines dieser Segmente. Code wird in ein Speichersegment geladen und ausgeführt. Es kann weit in andere Segmente springen, so dass jeder Code überall etwas ändern kann, einschließlich der Erzeugung eines TSR-Codes (terminate and stay resident), der einfach einen der IVT-Einträge (Interrupt-Vektortabelle) auf eine Adresse in seinem Raum verweist. vor dem Ausführen des Originals. Grundsätzlich gibt es keinen Schutz. Keiner. Nada.
Der Aufstieg des 32-Bit-geschützten Modus
Der geschützte Modus wird schnell kompliziert. Es besteht aus drei Teilen: Segmentierung, Paging und PAE. Für jede Tabelle ist eine Datentabelle erforderlich, die der CPU Informationen zu diesem Segment, dieser Seite oder zur Erweiterung des Adressraums (PAE) enthält. Dazu gehören die berühmten Ringflags (sie gelten für Segmente und Seiten), die die Prozessisolation implementieren. Mit Paging können Sie Daten aus dem RAM auf die Festplatte laden und ausgefallene Dinge wie virtuellen Speicher erstellen (siehe das Wort virtuell! Wir sind da!).
Langmodus
Der Long-Modus beseitigt die Segmentierung und schreibt einfach die PAE / Paging-Strukturen vor. Um die Implementierung eines Betriebssystems vollständig zu trivialisieren, wird Paging wiederum durch Strukturen im Speicher gesteuert, die dann über spezielle Anweisungen eingerichtet werden. Voila, man kann mit den richtigen Einstellungen eine Prozessisolation erreichen. Wieder trivialisiere ich leicht ...
Gib mir Virtualisierung!
Okay. Virtualisierung ist das gleiche allgemeine Konzept. Virtuelle Maschinen werden mithilfe von Steuerungsstrukturen für virtuelle Maschinen eingerichtet, die bestimmen, wie ihr Speicher wieder dem physischen Speicher zugeordnet wird, ähnlich wie Paging . Entscheidend ist, dass die virtuelle Maschine unter bestimmten Bedingungen das Host-Betriebssystem nach etwas fragen muss, ein bisschen wie Prozessisolation, ein bisschen wie ein Software-Interrupt . Diese werden als VM-Exits bezeichnet und liefern dem Host Informationen, z. B. den Status der Register beim Beenden. Ein bisschen wie ein Systemaufruf .
Kann eine Malware aus einer virtuellen Maschine ausbrechen?
Also, als In Bezug auf die VM verfügt das Host-Betriebssystem über einen eigenen Speicherplatz und kann nach Belieben infiziert / beschädigt / zerstört werden.
In Bezug auf die direkte Auswirkung auf den Hostspeicher kann die virtuelle Maschine dies nicht, da sie ihn nicht sehen kann. Der Host muss den erforderlichen Speicher dem Speicherplatz der virtuellen Maschine zuordnen. In diesem Speicherbereich muss außerdem alles vom BIOS an implementiert werden. Um mit bestimmten Hostgeräten für bestimmte Aufgaben zu kommunizieren, muss der Hostcomputer diese VM-Beendigungsbedingungen einrichten und die Ziel-VM muss sie auslösen. In diesem Fall wird die Kontrolle auf den Host übertragen.
Es gibt daher zwei mögliche Risikobereiche:
- Die Aktionen, die der Host als Reaktion auf eine VM ausführt Ausfahrt. Wenn diese Behandlung Fehler enthält, kann der Host möglicherweise dazu gebracht werden, etwas auszuführen, das er nicht ausführen sollte.
- Jeder Hostzugriff auf den Speicherplatz des Gastcomputers. Denken Sie daran, dass der Code des Host-Computers, der in Ring 0 ausgeführt wird, die Party überall dort zum Absturz bringen kann, wo es Ihnen gefällt. Es ist nur so, dass Sie den Speicher des Gastes (überraschenderweise) vom Gast aus festlegen können.
ol> Dies führt Sie zu Ihrem Exploit-Mechanismus. Sie benötigen einen Handhabungsfehler in der VM-Exit-Routine. Dann müssen Sie in der Lage sein, diesen Code zur Ausführung von Speicher zu überreden. Idealerweise Code, den Sie gerade in eine Seite der Gast-VM eingefügt haben. Wenn Sie fertig sind, verabschieden Sie sich von Kansas.
Wie Tom Leek sagt, sind VMs unglaublich effektiv bei der Verteidigung gegen Gabelbomben. Ähnlich wie das Betriebssystem die Speicherzuweisung eines Prozesses begrenzen kann, kann auch die Zuordnung des Arbeitsspeichers zur VM begrenzt werden. Auslaufen und das Gastbetriebssystem glaubt, dass der physische Speicher knapp ist. Der Host wird es nicht mehr zuweisen, es sei denn, Sie implementieren einen VM-Exit, um dies zu tun. Dies wäre ein bisschen gefährlich und ich glaube nicht, dass dies getan wird.
Wie wahrscheinlich ist das?
Nicht sehr. Dies hängt vollständig von diesen VM-Exit-Implementierungen ab oder vom Lesen des Speichers vom Gast auf dem Host mit einem netten Fehler in Ihrem Lesecode. Es erfordert auch, dass dieser Fehler es Ihnen ermöglicht, den Absturz so zu steuern, dass Sie die Ausführung an die Speicheradresse Ihres Hosts erzwingen können. Der VM-Exit muss auf diesen Speicher zugreifen können.
Was habe ich nicht behandelt?
- Angriffe auf vorhandene Software-Stacks wie TCPIP. Die Sicherheitslücken hier sind die gleichen, als ob Sie ohnehin zwei physische PCs hätten.
- Vollständig durch Software implementierte Virtualisierung.
- Virtualisierung auf jedem anderen Chip-Typ. Dies gilt für Intel VT-kompatible Setups.
ol> Schließlich habe ich zuvor argumentiert, dass Prozessisolation eine Form von Sandboxing ist. Wenn Sie diese und diese Antwort lesen, sollten Sie jetzt verstehen können, warum ich sie so definiere. Es gibt bemerkenswerte Ähnlichkeiten zwischen Prozessisolation und virtuellen Maschinen in x86.
Update
Also habe ich mich noch mehr damit beschäftigt, insbesondere mit dem blaue Pille Forschung. Was ich beschrieben habe, ist eine sehr vereinfachte Ansicht auf hoher Ebene. Ich habe mehr Details gefunden. Hier ist ein ganzes Papier von Invisible Things Lab. Es stellt sich heraus, dass ihre Abwehr das Konzept beinhaltete, den Ausführungszugriff auf Benutzermodus-Seiten ab Ring 0 zu verweigern, wodurch die direkte Ausführung von Daten verhindert wird, die die virtuelle Maschine in den Speicher gestellt hat. Es stellt sich heraus, dass dies in Intel-CPUs implementiert wird und derzeit Patches im Linux-Kernel vorhanden sind. Je nachdem, wie das geht, kann es durchaus vorkommen, dass Angriffe dieser Art viel schwieriger werden, selbst wenn Exploits existieren.