SubVirt
Transcrição
SubVirt
SubVirt Stefan Kempf 11. Oktober 2007 Kurzzusammenfassung SubVirt bezeichnet zwei Referenzimplementierungen eines Virtual-Machine Based Rootkits (VMBR) von Forschern der Uni Michigan und Microsoft-Research. Ihrer Meinung nach könnten VMBRs bald genutzt werden, die Kontrolle über einen Rechner zu übernehmen und dabei unerkannt zu bleiben. Diese Ausarbeitung betrachtet Implementierung und Betrieb der SubVirt-Rootkits, sowie Erkennungsmöglichkeiten. 1 1.1 Einführung und Motivation Beispielszenario Gehen wir von der Situation aus, dass ein Angreifer in ein System einbricht. Er wird sehr wahrscheinlich versuchen, seine Aktivitäten vor dem Systemadministrator zu verbergen, um den Zugang zum System möglichst lange zu behalten. Als erste Maßnahme werden dazu Programme, die die Anwesenheit (who(1)) oder Aktivitäten (ps(1)) des Angreifers verraten können, manipuliert bzw. ausgetauscht, so dass sie falsche Informationen anzeigen. Der Administrator kann versuchen, sich gegen ein solches Vorgehen mit Hilfe eines Intrusion-Detection-Systems zu schützen. Dieses wird so konfiguriert, dass Veränderungen an Systemdateien oder -programmen protokolliert und gemeldet werden. Nun kann es der Angreifer anstreben, auch das IDS zu umgehen. Dazu installiert er ein Rootkit, das sich aufgrund von Schwachstellen im Kern des Betriebssystems in diesen einnistet. Mit der Kontrolle über den Kernel wird es möglich, allen Prozessen im Benutzermodus falsche Informationen über das System zu liefern oder komplett vorzuenthalten. Das Rootkit verhindert, dass Prozesse des Angreifers von ps(1) angezeigt werden können, wobei für diese unter Linux z.B. kein Eintrag im /proc Dateisystem angelegt wird. Außerdem werden dem IDS Falschangaben über Dateien geliefert, damit es Manipulationen daran nicht feststellen kann. Administrator und Angreifer versuchen sich also gegenseitig in Schach zu halten, indem jeder von ihnen die Kontrolle über eine möglichst tief liegende Ebene des Systems anstrebt, da dies die Kontrolle über das Gesamtsystem bedeutet. 1.2 Idee eines VMBR Rootkits laufen im Kernel und haben Einfluss auf den Benutzermodus. Der nächste Schritt ist ein Virtual-Machine Based Rootkit, das direkt auf der Hardware läuft und das Betriebssystem kontrolliert, indem es dieses in einer virtuellen Maschine ausführt. Parallel dazu, und damit vom eigentlichen Betriebssystem isoliert, läuft ein Angriffssystem. Dort lassen sich alle Aktivitäten ausführen, die unentdeckt bleiben sollen. Folgendes Schaubild soll dies darstellen. 1 Anwendung Malware Malware Anwendung Gastsystem Angriffssystem VMM Hardware Das Angriffssystem kann dabei ein beliebiges Betriebssystem wie z.B. Linux sein. Ist die Virtualisierung perfekt, so wird das Betriebssystem die Existenz der virtuellen Maschine, des Angriffssystems und die darin ablaufenden Aktivitäten nicht feststellen können. Zu klären ist hierbei noch, wie ein VMBR installiert wird und wie das Betriebssystem in die virtuelle Maschine befördert wird. 1.3 SubVirt Forscher der Universität Michigan und Microsoft-Research haben sich mit dem Thema VMBR befasst, da nach ihrer Auffassung diese Art von Rootkit in Zukunft eine neue Bedrohung für die Sicherheit und Integrität eines Systems darstellen wird. Um frühzeitig Verteidigungsstrategien gegen VMBRs entwickeln zu können, haben sie mit SubVirt zwei Referenzimplementierungen eben solcher Rootkits geschaffen. Die erste Variante basiert auf VMWare als virtueller Maschine und einem modifizierten Linux-Kernel als Angriffssystem. Die zweite Variante verwendet angepasste Versionen von Virtual PC und Windows XP. Linuxrechner wurden mit dem ersten Rootkit infiziert, auf Computern mit Windows als Betriebssystem wurde das zweite VMBR verwendet. Das Angriffssystem stimmt also in beiden Varianten mit dem Zielbetriebssystem überein, was aber keine zwingende Voraussetzung ist. 2 Installation eines VMBR Um ihr VMBR auf dem Zielrechner zu installieren, gingen die Autoren von SubVirt folgendermaßen vor: Zuerst muss der Angreifer einen Weg finden, wie er sich Zugriff auf das System verschaffen kann um Administratorrechte zu erlangen. (Ausnutzen von Sicherheitslücken, Social Engineering, etc). Dann wird das Rootkit installiert. Nach der Installation muss der Rechner heruntergefahren werden. Kurz vor dem Shutdown wird die Bootsequenz jedoch manipuliert, so dass beim nächsten Neustart das VMBR statt des eigentlichen Betriebssystems geladen wird. Das Rootkit startet dann das Betriebssystem in einer virtuellen Maschine. Das Betriebssystem ist jetzt zum Gastsystem im VMBR geworden und greift nur noch auf virtuelle Hardware zu. Auf Linuxsystemen wird SubVirt in der Swappartition installiert, weswegen Swapping im Zielsystem vor der Installation deaktiviert werden muss. In der Windows-Variante wird das Rootkit am Anfang des Dateisystems platziert. Dort eventuell vorhandene Dateiblöcke müssen vorher in freie Bereiche der Platte umkopiert werden, was auch eine Aktualisierung der Verwaltungsstrukturen des Dateisystems erfordert. Die Manipulation des Bootvorgangs wird bei Linux über eine Änderung der Shutdownskripte bewirkt. Nachdem init(8) alle Prozesse beendet hat, wird der neue Bootcode installiert. 2 Unter Windows wird im Zielsystem ein Kernelmodul verwendet. Der Bootcode, der beim nächsten Start das VMBR lädt, wird von diesem Modul kurz bevor der Rechner heruntergefahren wurde installiert. Zu diesem Zeitpunkt laufen fast keine Prozesse mehr im System. Weiterhin wird der Code nicht über das Dateisystem geschrieben, sondern direkt über den Festplattentreiber. Programme, die die Integrität des Dateisystems überwachen (falls diese kurz vor dem Shutdown überhaupt noch laufen) , werden die Installation des Bootcodes nicht bemerken, da dieser im Dateisystem selbst keine Veränderung hervorruft. 3 Anwendungen Die Autoren teilen die Anwendungen, die sich mit einem VMBR realisieren lassen, in drei Kategorien ein: • Interaktionslos • Observierend • Manipulierend Interaktionslose Malware ist an Geschehnissen oder Informationen im Gastsystem nicht interessiert. Beispiele dafür sind Phishing-Webserver, Spam-Relays und Bots für DDoS-Attacken. Zu observierenden Programmen zählen Keylogger oder Paketsniffer, die im Gastsystem verarbeitete Informationen zwar auslesen, aber nicht verändern. Werden die Informationen von der eingesetzten Software im Angriffssystem jedoch geändert, gelöscht oder wird der Programmablauf von Anwendungen im Gastsystem beeinflusst, so spricht man von manipulierender Malware. 3.1 Phishing-Webserver Phishing-Webseiten ahmen die Internetauftritte von Banken oder Webshops nach und fordern arglose Benutzer auf, ihre Kontodaten preiszugeben. Um Phishing mittels eines VMBR zu betreiben, wird im Angriffssystem der Webserver thttpd installiert, der dort auf Port 8080 auf ankommende Verbindungen wartet. Das VMBR leitet fast den gesamten ankommenden Netzwerkverkehr in das Gastsystem weiter. TCP-Pakete, die allerdings für Port 8080 bestimmt sind, werden an das Angriffssystem geschickt und damit von thttpd empfangen, der dann mit dem Client kommuniziert. Es muss also kein eigener Code geschrieben werden, sondern man kann auf bereits vorhandene Software zurückgreifen. Lediglich das virtuelle Netzwerk muss richtig konfiguriert werden. Diese Anwendung wurde mit dem Linux-VMBR realisiert. 3.2 Keylogger Für den Keylogger, der im auf Windows basierenden Rootkit implementiert wurde, waren jedoch geringfügige Änderungen notwendig. Die Emulation des Tastaturcontrollers in Virtual PC wurde so angepasst, dass alle Tastendrücke zuerst an das Angriffssystem, dann ans Gastsystem geliefert werden. Eine Anwendung im Angriffssystem wertet die Tastendrücke aus und versucht, eingegebene zu Passwörter zu extrahieren. Die Modifikation von Virtual PC beträgt dabei 60 Zeilen, der Keylogger selbst besteht aus 254 Zeilen. 3 3.3 Virtual-Machine Introspection Um manipulierende Malware realisieren zu können, sind Techniken notwendig, die unter dem Begriff Virtual-Machine Introspection (VMI) zusammengefasst werden. Darunter fallen bereits relativ einfache Dinge, wie das Auslesen oder Setzen von Registerwerten eines Prozesses, wie es auch bei Debuggern genutzt wird. Darüber hinaus können die Symboltabelle bzw. Debuginformationen einer Anwendung analysiert werden, um zu manipulierende Anweisungen im Programm zu finden. Diese können dann verändert werden bzw. man kann einen Breakpoint an jene Stellen setzen und darauf warten, dass der Code ausgeführt wird. Ist das dann der Fall, so lassen sich z.B. die Daten, auf denen der Code arbeitet, auslesen oder verändern. Ebenso kann im Gastsystem vorhandener Code als Bibliothek“ für das VMBR ” dienen. Möchte das Angriffssystem Zugriff auf Dateien im Gastsystem haben, so muss der Dateisystemtreiber im Angriffssystem nicht neu implementiert werden. Man muss nur die relevanten Codestellen im Gastsystem anspringen. Dies ist für das Rootkit von Vorteil, da sich damit seine Codegröße reduzieren lässt und somit schwerer aufzuspüren wird. Will man diese Techniken einsetzen, muss der Angreifer aber genaue Kenntnisse über den Aufbau der zu beeinflussenden Anwendungen haben. Möchte er z.B. verschlüsselte Kommunikation abhören, so muss bekannt sein, an welchen Stellen in der Anwendung die Daten ver- oder entschlüsselt werden, um sie vorher im Klartext abfangen zu können. 3.4 Stehlen sensitiver Dateien Mit Hilfe von VMI wurde im Angriffssystem des Linux-VMBR ein Perlskript von 24 Zeilen geschrieben. Es läuft im Angriffssystem und durchsucht das Dateisystem des Gastsystems. Dabei kopiert es /etc/shadow, die Passwortdatei eines Linuxsystems sowie private SSH-Schlüssel der Benutzer, soweit vorhanden. 3.5 Programmausführung manipulieren Wie bereits angesprochen, kann die Ausführung eines Programms mit VMI manipuliert werden. Dies kann nötig sein, um das VMBR vor Entdeckung zu schützen. Bekanntlich ist die i386-Architektur nicht voll virtualisierbar und es gibt Programme, die erkennen, ob sie in einer virtuellen Maschine laufen oder nicht. Dazu zählt auch redpill [3]. Dieses Programm führt die Instruktion sidt aus, welche die Adresse der Interruptdeskriptortabelle im Speicher liefert. Läuft das Betriebssystem in einer virtuellen Maschine, so erhält man stattdessen die Adresse der Interrupttabelle des VMBR. Da diese Instruktion im Usermode keinen Trap auslöst, muss sie vom Rootkit emuliert werden, um nicht entdeckt zu werden. Dazu kann per VMI ein Breakpoint an eine passende Stelle im exec-Systemaufruf des Kernels gesetzt werden. Wird der Breakpoint erreicht prüft das VMBR ob redpill ausgeführt werden soll. Dies kann z.B. geschehen, indem man im Textsegment nach der Instruktion sidt sucht. Wird sie gefunden, überschreibt der VMBR die Instruktion mit einem Breakpoint und emuliert die Instruktion sobald dieser erreicht wird. Für den Schutzmechanismus gegen redpill waren 104 zusätzliche Zeilen Code in Virtual PC nötig. Die Gegenmaßnahme des Rootkits hat jedoch ihre Grenzen bei sich selbst modifizierenden Programmen, die die sidt-Instruktion erst zur Laufzeit erzeugen und dann ausführen. 4 Kontrolle behalten Die Gefahr entdeckt zu werden, ist für das Rootkit am größten, wenn es nicht läuft, da es dann keinerlei Kontrolle über das System besitzt. Startet man den Rechner von einem alternativen 4 Bootmedium, z.B. einer Live-CD, so kann mit der darauf befindlichen Software gezielt nach dem Rootkit auf der Festplatte gesucht werden. Damit das VMBR möglichst lange ohne Unterbrechung läuft, ist die Anzahl an Rechnerneustarts zu minimieren. Startet der Benutzer das Betriebssystem neu, so führt das Rootkit einfach nur einen Reset der virtuellen Hardware durch und simuliert einen Neustart. Soll der Rechner aber heruntergefahren werden, dann versetzt das VMBR das System in den Energiesparmodus. Dadurch schalten Lüfter, Monitor sowie die Festplatten ab und für den unaufmerksamen Nutzer sieht es so aus, als ob das System tatsächlich nicht mehr läuft. Dies setzt allerdings voraus, dass der Computer mit ACPI ausgestattet ist. 5 Ressourcenverbrauch Der Ressourcenverbrauch wurde mit zwei verschiedenen Systemen ermittelt. Linux-SubVirt wurde auf einen 2.8 GHz Pentium 4 mit 1 GB RAM und RedHat Enterprise Linux 4 getestet. Das Rootkit benötigt komprimiert 95 MB auf der Festplatte, unkomprimiert 228 MB. Mit speziell angepassten Linuxdistributionen wären aber noch kleinere Plattenimages möglich. SubVirt für Windows kam auf einem 1 GHz Pentium 4 mit 256 MB RAM und Windows XP zum Einsatz. Hier sind 106 MB komprimierter bzw. 251 MB unkomprimierter Plattenplatz nötig. Beide Rootkits beanspruchen in etwa 3% des Arbeitsspeichers. Sowohl der Start als auch der Betrieb der VMM und der Malware verbrauchen zusätzliche CPU-Zeit. Die Zeiten werden in folgender Tabelle illustriert. Die angegebenen Werte sind der Durchschnitt von jeweils drei Läufen. Installation Hochfahren ohne VMBR Neustart im VMBR Hochfahren im VMBR Start des Hosts Start von Host und Gast VMWare VMBR 24s 53s 74s 96s 52s 145s Virtual PC VMBR 262s 23s 54s nicht implementiert 45s 101s Wie sind die Zeiten zu interpretieren? Zunächst lässt sich feststellen, dass die Installation des Virtual PC VMBR sehr viel länger dauert als die der VMWare-Version. Der Grund ist die langsamere Hardware und die geringere Speicherausstattung des Windows-PCs. Zusätzlich wird das VMBR an den Anfang der Windows-Partition installiert, so dass dort vorhandene Dateiblöcke zuerst umkopiert werden müssen. In der Linux-Variante wird das Rootkit einfach in die Swappartition geschrieben. Die nächste Zeile gibt an, wie lange es vom Zeitpunkt des Einschaltens dauert, bis man sich auf dem System einloggen kann, wenn der Rechner noch nicht mit dem VMBR infiziert ist. Neustart im VMBR“ und Hochfahren im VMBR“ gibt ” ” die Dauer des simulierten Neustarts bzw. des kompletten Hochfahrens an. Letzteres wurde nur in der Linux-Version von SubVirt implementiert. Die längere Zeitdauer für das simulierte Hochfahren gegenüber des Neustarts lässt sich dadurch erklären, dass die Hardware nach dem Verlassen des Energiesparmodus neu initialisiert werden muss. Sollte der Rechner komplett abgeschaltet werden, so dass ein simuliertes Hochfahren nicht möglich ist, dann dauert es in der Linux-Variante 52 Sekunden, das VMBR zu starten und weitere 93 Sekunden und damit insgesamt 145 Sekunden das Betriebssystem zu starten. Dass der Start von Host und Gast in der Windows-Version dagegen nur 101 Sekunden beansprucht, führen die Autoren darauf zurück, dass gewisse Performanceoptimierungen in VMWare erst nach einiger Zeit zu wirken 5 beginnen. 6 VMBRs erkennen Es gibt zwei grundsätzliche Möglichkeiten, ein VMBR zu erkennen. Man kann versuchen, Kontrolle über eine Schicht des Systems zu erlangen, die unterhalb der vom Rootkits gesteuerten Ebene liegt. Damit liegt die Kontrolle über das Gesamtsystem nicht mehr beim Rootkit. Aber auch eine Erkennung vom Gast heraus ist durchaus realisierbar. 6.1 Erkennung durch Software unterhalb des VMBR Wie bereits angesprochen, lässt sich der Start des VMBR durch Booten von einem alternativen Medium verhindern und dann das Rootkit auf der Platte suchen. Allerdings sollte vor dem Hochfahren der Netzstecker gezogen werden, um sicherzustellen, dass sich der Rechner nicht im Energiesparmodus befunden hat und der Bootvorgang vom VMBR nur simuliert wird. Zusätzlich setzt diese Vorgehensweise einen sicheren Bootvorgang voraus, das BIOS darf also nicht vom VMBR manipuliert worden sein. Eine weitere denkbare Alternative ist, das Betriebssystem bereits in einer virtuellen Maschine laufen zu lassen. Will sich dann ein Rootkit unterhalb des Betriebssystems einnisten, so wird dies die virtuelle Maschine spätestens dann feststellen, wenn der auf der virtuellen Festplatte befindliche Bootcode verändert wird. Allerdings werden dann alle Erkennungsstrategien, die feststellen, ob ein Betriebssystem in einer virtuellen Maschine läuft, hinfällig. 6.2 Erkennung durch Software oberhalb des VMBR Viele Ansätze, mit denen sich ein VMBR vom laufenden Betriebssystem heraus erkennen lässt, basieren auf der Beobachtung, dass das Rootkit selbst Ressourcen verbraucht. Dazu zählen CPU-Zeit, Arbeitsspeicher und Festplattenplatz. Eine einfache Erkennungsmethode besteht darin, ein Programm zu schreiben, das z.B. die sidt-Instruktion sehr oft aufruft. Dann startet man das Programm auf dem Rechner, auf dem man das VMBR vermutet und auf einem identischen aber garantiert uninfizierten System. Weil das VMBR die sidt-Instruktion emulieren muss, um nicht entdeckt zu werden, wird man einen Unterschied in den Laufzeiten der Programme feststellen. Da das VMBR die Systemuhr zur Tarnung langsamer laufen lassen könnte, ist es empfehlenswert, die Laufzeiten mit einer Stoppuhr zu messen. Es ist ebenfalls vorstellbar, ein Programm den auf dem uninfizierten Rechner kompletten zur Verfügung stehenden Arbeitsspeicher reservieren zu lassen. Bei gleichen Anfangsbedingungen wird die Speicheranforderung auf dem System mit Rootkit fehlschlagen, da dieses natürlich auch RAM benötigt. Allerdings kann das VMBR hier Gegenmaßnahmen treffen, indem es den Mangel an RAM durch Paging auszugleichen versucht. Natürlich wird sich dies negativ auf die Laufzeit derjenigen Programme auswirken, deren Daten erst von der Platte gelesen werden müssen. Jedoch belegt SubVirt nur etwa 3% des Arbeitsspeichers, so dass Paging relativ selten stattfinden wird. Damit werden Laufzeitunterschiede kaum messbar sein, vor allem, wenn diese mit der Stoppuhr ermittelt werden sollen. Nun ließe sich das Paging bzw. das installierte Rootkit selbst analog zur Methode der dynamischen Speicherallokation entdecken, indem man die Festplatte mit Daten voll schreibt und so testet, wie viel Platz auf der Platte frei war. Es wird sich wieder herausstellen, dass sich auf das uninfizierte System mehr Daten schreiben lassen. Um auch hier das Entdeckungsrisiko zu minimieren, komprimiert die Windows-Version von SubVirt Plattenblöcke, um mehr 6 Speicher vorzutäuschen als eigentlich vorhanden ist. Weiterhin kann das Rootkit Teile der virtuellen Festplatte für das Gastsystem als beschädigt markieren, womit sich für den Benutzer der fehlende Plattenplatz erklärt. Hierzu werden Schreibvorgänge an bestimmte Blöcke der (virtuellen) Festplatte einfach verworfen, Leseanforderungen liefern zufällige Daten zurück. Ferner kann auch der nur schwer zu virtualisierende I/O dazu dienen, ein VMBR aufzudecken. SubVirt lässt das Gastsystem aus Effizienzgründen auf virtueller Hardware mit speziellen Treibern laufen und emuliert nicht die richtige im Rechner vorhandene Peripherie. Man würde das Rootkit also schon entdecken, wenn man sich die installierten Geräte anzeigen lässt, die dann nicht mit der Ausstattung des Rechners übereinstimmen. Zusätzlich werden 3D-Spiele langsamer als vorher laufen, wenn sie nur Zugriff auf eine virtuelle Grafikkarte haben. Um nicht aufzufallen, muss also die vorhandene Hardware perfekt und mit so wenig Leistungsverlusten wie möglich virtualisiert werden. Dies ist praktisch unmöglich zu realisieren, da dies für sämtliche Geräte geschehen müsste. Dazu sollten auch Bugs in der Hardware oder von der Spezifikation abweichendes Verhalten exakt nachgebildet werden, da man ansonsten anhand dieser Fehler überprüfen könnte, ob das Betriebssystem in einer virtuellen Maschine läuft oder nicht. Deshalb schlagen die Autoren von SubVirt vor, nur Hardware zu virtualisieren, die zur Informationsgewinnung gebraucht wird (z.B. die Tastatur, wenn ein Keylogger zum Einsatz kommen soll) und ansonsten dem Gast direkten Zugriff auf die restlichen Geräte zu erlauben, solange diese nicht DMA-fähig sind. Denn dann ließen sich wiederum beliebige Speicherbereiche auslesen und damit das Rootkit ausfindig machen. Davor kann sich das VMBR erst schützen, wenn eine IOMMU zur Verfügung steht, um Geräten den Zugriff auf die physikalischen Seiten, in denen das Rootkit liegt, zu verweigern, bzw. bei einem Zugriffsfehler falsche oder zufällige Daten zurückliefern zu können. 7 Zusammenfassung Mit SubVirt wurden zwei VMBRs entwickelt, die die Gefahren zukünftiger Rootkits aufzeigen sollen, und um rechtzeitig Verteidigungsstrategien zu ergründen. Diese sind vielfältig, können aber mit genügend hohen Aufwand wiederum umgangen werden. Tatsächlich arbeitete einer der Autoren versehentlich an einer der infizierten Testmaschinen ohne Notiz vom VMBR zu nehmen. Es ist zu erwarten, dass mit der zunehmenden Effizienzsteigerung virtueller Maschinen VMBRs immer unauffälliger werden. Literatur [1] Tal Garfinkel and Mendel Rosenblum. A Virtual Machine Introspection Based Architecture for Intrusion Dectection. 10th ISOC Symposium on Network and Distributed Systems Security (SNDSS), Februar 2003. [2] Samuel T. King, Peter M. Chen, Yi-Min Wang, Chad Varbowski, Helen J. Wang, and Jacob R. Lorch. SubVirt: Implementing malware with virtual machines. 2006. [3] Joanna Rutkowska. Red Pill... or how to detect VMM using (almost) one CPU instruction. http://invisiblethings.org/papers/redpill.html, 2004. 7