Accurate Record & Replay of x86 MMU Behavior for SimuBoost
- Typ:Masterarbeit
- Datum:13.09.2018
- Betreuung:
Prof. Dr. Frank Bellosa
Marc Rittinghaus - Bearbeitung:Benedikt Morbach
- Links:PDF
-
Systeme zur Ausführungswiederholung (engl. record and replay) haben das Potential ein wichtiges Werkzeug zur Fehlersuche in komplexen Softwaresystemen zu werden. Anstatt ein Programm mehrmals ausführen zu müssen um einen Fehler zu reproduzieren und schrittweise ein Areal im Programmcode einzugrenzen das als Fehlerursache vermutet wird reicht es, eine einzige Ausführung des Programms aufzuzeichnen. Anschließend kann diese beliebig oft wiedergegeben und sogar zurückgespult werden um so von den Symptomen des Fehlers zu dessen Ursache zu finden.
Aufgrund der zunehmenden Verbreitung von virtuellen Maschinen in vielen Anwendungsgebieten, allen voran im Serverbereich, wurden diverse Systeme vorgeschlagen die dieses Prinzip der Ausführungswiederholung auf die Maschinenbefehlsebene übertragen und somit das Aufzeichnen undWiedergeben eines gesamten virtualisierten Systems ermöglichen. Dies ist nicht nur ein hilfreich im Bereich der Fehlersuche, sondern erlaubt auch die forensische Analyse von Schadsoftware nachdem ein solcher Befall entdeckt wurde da das System zur Ausführungswiederholung nicht von der kompromittierten virtuellen Maschine beeinflusst werden kann.
Um Systemressourcen zu schonen vermeiden Systeme zur Ausführungswiederholung es nach der Ausführung jedes Befehls eine vollständige Kopie der virtuellen Maschine zu erstellen. Stattdessen machen sie sich die Tatsache zu Nutze, dass die Ergebnisse der meisten Maschinenbefehle in deterministischer Weise von ihren Eingaben abhängen. Nur der initiale Zustand und solche Ereignisse die inhärent nichtdeterministisch im Zeitpunkt ihres Eintretens oder ihrem Inhalt sind, wie z.B. Unterbrechungen, müssen aufgezeichnet werden. Die restlichen Stadien des aufgezeichneten Systems zwischen diesen Ereignissen können jedoch wiederhergestellt werden indem die deterministischen Befehle auf den vorliegenden Eingabedaten berechnet werden.
Um die Leistungseinbußen durch die Ausführungsaufzeichnung der virtuellen Maschine in einem akzeptablen Rahmen zu halten verwenden Systeme wie SimuBoost [1] die Hardwareerweiterungen zur hardwareunterstützten Virtualisierung die in die von den meisten aktuellen Systemen unterstützt werden und führt einen Großteil der Befehle des aufzuzeichnenden Systems direkt auf dem Gastgebersystem aus. Dies führt jedoch zu einer neuen Klasse von Problemen. So verwendet die x86 Architektur die von den meisten PCs und Servern verwendet wird verwendet eine Speicherverwaltungseinheit welche die linearen Adressen, die von Software verwendet und referenziert werden, in physische Speicherblöcke im Direktzugriffsspeicher übersetzt. Während dieses Vorgangs aktualisiert die Speicherverwaltungseinheit einige Statusinformationen zu der jeweiligen linearen Adresse in den Seitentabellen, die sie für diese Übersetzung verwendet. Da dieser Übersetzungsvorgang relativ zeitaufwändig ist werden diese Übersetzungen im Übersetzungspuffer zwischengespeichert um Zugriffe auf den Direktzugriffsspeicher zu beschleunigen.
Allerdings ist das Verhalten dieses Übersetzungspuffers bewusst nicht spezifiziert und die Dokumentation verweist explizit darauf, dass er seinen Inhalt jederzeit unaufgefordert leeren kann. Dies hat zur Folge, dass die Übersetzung einer linearen Adresse durch die Speicherverwaltungseinheit entweder die Statusinformationen in den Seitentabellen aktualisiert oder nicht, abhängig davon ob die entsprechende Übersetzung im Übersetzungspuffers zwischengespeichert ist. Wenn dieser Fall während der Aufzeichnung einer virtuellen Maschine auftritt kann dies dazu führen, dass der Ausführungspfad während der Ausführungswiedergabe von dem der ursprünglich aufgezeichneten Ausführung divergiert, wenn das Gastbetriebssystem den nichtdeterministischen Inhalt der Seitentabellen liest und abhängig davon einen Ausführungspfad wählt. Dies führt dazu, dass die Ausführungswiederholung letztendlich fehlschlägt, da die aufgezeichneten nichtdeterministischen Ereignisse nicht mehr zum korrekten Zeitpunkt wiedergegeben werden können, da dieser nur auf dem ursprünglichen Ausführungspfad definiert war, was zur Folge hat, dass auch der deterministische Zustand zwischen diesen Ereignissen nicht korrekt wiederhergestellt werden kann.
Das Ziel dieser Arbeit ist es ein System zu entwickeln, welches eine Ausführungswiederholung inklusive des im vorherigen Absatz beschriebenen Nichtdeterminismus erlaubt ohne vollständig auf die Leistungssteigerung durch die Verwendung von hardwareunterstützter Virtualisierung während der Aufzeichnung verzichten zu müssen und die Leistung dieses Systems sowohl während der Ausführungsaufzeichnung als auch der Ausführungswiederholung zu evaluieren.
Um dieses Ziel zu erreichen werden wir die Ausführungskomponente des SimuBoost Systems, die als Teil des KVM Moduls im Linux Betriebssystemkern implementiert ist, erweitern um jegliche Änderung an den Seitentabellen des Gastsystems innerhalb der virtuellen Maschine zu überwachen, gleichwohl ob diese durch das Gastbetriebssystem oder die Speicherverwaltungseinheit vorgenommen werden. Wir erreichen dies indem wir die Hardwarevirtualisierungstechnologie der geschachtelten Seitentabelle verwenden, die als EPT (engl. Extended Page Table) in aktuellen Intel x86_64 Prozessoren implementiert ist, um die Speicherbereiche die die Seitentabellen des Gastsystems enthalten als nur-lesbar markieren und jeder Befehl, der auf diese Speicherbereiche schreibend zugreift mithilfe der Emulationssoftware für x86 Befehle, die Teil des KVM Moduls ist, emulieren. Des Weiteren modifizieren wir QSIMU, eine Abspaltung des QEMU Emulators die SimuBoost zur Ausführung der Ausführungswiederholung verwendet, um diese zusätzlichen Informationen die während der Ausführungsaufzeichnung gesammelt wurden zu verwerten und die gleichen Änderungen an den Seitentabellen auch während der Ausführungswiederholung vorzunehmen.
Unsere Resultate zeigen, dass dieser Ansatz eine vielversprechende Lösung des beschriebenen Problems bietet. Die nötigen Modifikationen am bestehenden Programmcode waren von relativ geringem Umfang und unser modifiziertes System ist in der Lage auch solche Ausführungen zu wiederholen für die dies zuvor unmöglich war. Während wir keinen messbaren Einfluss auf die Laufzeit der Ausführungswiederholung feststellen konnten, variiert der Einfluss auf die Laufzeit der Ausführungsaufzeichnung stark in Abhängigkeit von der Zusammensetzung der Last der aufgezeichneten Ausführung. Berechnungsintensive Ausführungen verlaufen mit der selben Geschwindigkeit wie bei einer Aufzeichnung ohne Unterstützung für nichtdeterministische Speicherverwaltungsereignisse. In einem konstruierten Minimalbeispiel für einen schlechtestmöglichen Fall konnten wir jedoch eine Verlangsamung um 350% feststellen. Für reale Anwendungsbeispiele liegt der Leistungsabfall zwischen diesen Extremen, tendiert jedoch zum besseren Ergebnis.BibTex:
@masterthesis{morbach18SimuBoost,
author = {Benedikt Morbach},
title = {Accurate Record and Replay of x86 MMU Behavior for SimuBoost},
type = {Master Thesis},
year = 2018,
month = sept # "13",
school = {Operating Systems Group, Karlsruhe Institute of Technology (KIT), Germany}
}