Windows Rootkits 2005, Teil 3

Seite 2: Patchfinder

Inhaltsverzeichnis

Als Alternative zur statischen Code- und Datenanalyse von VICE schlägt Joanna Rutkowska eine Methode vor, die sich auf die Analyse der Ausführungspfads zur Laufzeit konzentriert [4]. Die Konzeptstudie Patchfinder implementiert dieses Verfahren und steht auf ihrer Web-Site invisiblethings.org zum Download zur Verfügung. Patchfinder beruht auf der Beobachtung, dass ein Rootkit einem vorgegebenen Ausführungspfad Code hinzufügen muss, beispielsweise um die Ergebnisse eines umgeleiteten Funktionsaufrufs zu filtern. Die Zahl der ausgeführten Befehle für einen der typischerweise durch Rootkits umgeleiteten Funktionsaufruf, sollte auf einem infizierten System folglich größer sein, als auf einem sauberen. Rutkowska benutzt die Single-Step-Funktion des x86-Prozessors, um die Befehle zu zählen. Führt der Prozessor Code in diesem Single-Step-Modus aus, ruft er nach jedem Befehl eine spezielle Interrupt-Routine auf, die den Zähler aktualisiert. Leider gibt es in einem komplexen System wie Windows verschiedene Ausführungspfade, sodass mehrfache Aufrufe derselben Systemfunktion je nach Systemzustand unterschiedliche Werte ergeben können. Rutkowska geht dieses Problem in Patchfinder mit statistischen Methoden an und zeigt empirisch, dass der größte Peak eines Histogramms der gezählten Befehle unabhängig von der Systemlast immer an derselben Stelle auftritt. Die durch ein Rootkit eingefügten Befehle hingegen verschieben diesen Peak. Trotzdem verbleiben auch hier Fehlalarme und die Möglichkeit, dass ein Rootkit den Zählvorgang bemerkt.

Kreuzverhörtechniken sind bei der Rootkit-Erkennung noch recht neu und viel versprechend. Sie beruhen auf der Tatsache, dass es meist mehr als einen Weg gibt, die gleiche Frage zu stellen. Bei der Kreuzverhörmethode ruft der Scanner die gängigen API-Funktionen auf, um zentrale Systeminformationen abzufragen: Listen der Dateien, der Prozesse oder Registry Keys. Dieselben Informationen ermittelt er mit einem zweiten Algorithmus, der von den API-Funktionen unabhängig ist. Jeder Unterschied in den Ergebnissen zeigt etwas Verstecktes, das aus den Ergebnissen der API-Aufrufe ausgeblendet wurde. Diese Kreuzverhörtechniken verlassen sich darauf, dass Hooking- oder DKOM-Techniken zwar die Daten vergiften, die die Systemfunktionen liefern, dass aber die Low-Level-Funktionen für die Gegenprobe nicht ebenfalls durch Hooking oder Kernel-Manipulationen manipuliert werden.

Rootkit Revealer stammt wie viele andere kostenlose Utilities für Systemadministratoren und Entwickler von Sysinternals [5]. Er zielt auf die persistenten Rootkits, die auch einen Systemneustart überleben und geht davon aus, dass sie sich dazu im Dateisystem und in der Windows Registry verewigen müssen. Diese nimmt er ins Kreuzverhör und listet zunächst alle Dateien auf der Festplatte und alle Registry-Schlüssel über die High-Level-APIs auf. Anschließend liest der Rootkit Revealer die rohen Dateisystemdaten und alle Dateien, die die Registry Hives enthalten, und interpretiert diese selber, um die Ergebnisse zu vergleichen.

Wie fast alle Scanner kann ein Rootkit, das den Zugriff auf die Festplatten-Volumes beziehungsweise die Registry-Dateien blockiert oder fälscht, auch Rootkit Revealer austricksen. Auch er hat das Problem der Fehlalarme, insbesondere wenn Dateien oder Registry-Schlüssel zwischen den High-Level- und Low-Level-Abfragen geändert, erzeugt oder gelöscht werden. Das betrifft im Übrigen alle Kreuzverhörtechniken.

Klister ist eine weitere Konzeptstudie von Joanna Rutkowska [4]. Sie demonstriert eine Methode, um Rootkits aufzuspüren, die wie FU DKOM-Techniken einsetzen. FU versteckt Prozesse, indem er EPROCESS-Objekte aus der Liste von PsActiveProcessList aushängt (siehe Teil 1, [6]). Zunächst würde man vermuten, dass ein Prozess, den man aus der Prozessliste des Betriebssystems entfernt, auch nicht mehr läuft – ihm also der Scheduler des Betriebssystems keine CPU-Zeit mehr zuweist. Das ist jedoch nicht der Fall, denn der Dispatcher des Betriebssystems verwaltet eine eigene Warteschlange für die Prozessorzeit. Klister nutzt diese Redundanz der Datenstrukturen des Kernels, um versteckte Prozesse aufzuspüren. Taucht ein Eintrag in der Dispatch Queue auf, nicht aber in der Liste aktiver Prozesse, nimmt es an, dass es sich dabei um einen versteckten Rootkit-Prozess handelt. Auch wenn Rutkowska diese Technik nur für das Aufspüren von Prozessen anwendet, kann der Vergleich redundanter Kernel-Datenstrukturen auch andere DKOM-Attacken aufdecken.

Blacklight von F-Secure ist eines der ersten kommerziellen Produkte, das speziell Rootkits aufspürt [7]. Obwohl die Blacklight-Techniken bereits in andere F-Secure-Produkte integriert werden, kann man das Programm derzeit noch kostenlos beziehen. Blacklight sucht Prozessen und Dateien, die ein Rootkit versteckt. Dazu setzt es ebenfalls die Kreuzverhörtechnik ein und vergleicht Informationen von High-Level-APIs mit denen, die es über Low-Level-Methoden ermittelt.

Allein im letzten Jahr hat F-Secure den Algorithmus, den Blacklight für die Low-Level-Abfragen verwendet, mehrfach geändert. Blacklight versucht, kritische Daten zu identifizieren, die ein Rootkit nicht ändern kann, ohne Fehler zu erzeugen. Dabei haben Blacklight und auch die anderen Scanner mit Kreuzverhörtechniken nur begrenzt Erfolg. Denn wenn der Rootkit-Autor den verwendeten Algorithmus einmal kennt, kann er meist mit etwas Vorsicht auch solche Daten ohne negative Auswirkungen ändern.

Auch Microsofts Strider GhostBuster verfolgt einen Kreuzverhöransatz, um versteckte Dateien, Registry-Einträge, Prozesse und geladene Module aufzuspüren [8]. Er vergleicht also High-Level-API-Aufrufe mit Low-Level-Daten, die von Hand aus den Abfragen der grundlegenden Datenstrukturen des Datei- und Betriebssystem ermittelt werden (unter anderen die NTFS Master File Table und die Windows Registry Hives). Unterschiede interpretiert das Programm als Hinweise auf "Ghostware". Das ist ein spezieller, von Microsoft geprägter Ausdruck, der Schadsoftware wie Rootkits, Trojaner, Keylogger und kommerzielle Ad-/Spyware umfassen soll, die ein Interesse hat, ihre Anwesenheit auf dem System zu verbergen.

GhostBuster kann sowohl interne als auch externe System-Scans durchführen. Die internen Scans werden auf einem laufenden System ausgeführt und führen ähnlich wie Rootkit Revealer zusätzlichen Tests auf versteckte Prozesse durch. Anschließend wird das System mit einem sauberen Betriebssystem gebootet, um einen Low-Level-Scan durchzuführen. Dazu kommt WinPE zum Einsatz. Dieser Offline-Ansatz reduziert die Gefahr, dass ein Rootkit bei dem Test dazwischen funkt. Der Nachteil ist jedoch, dass es offensichtlich ziemlich unpraktisch ist, einen Server für einen routinemäßigen Scan jedes Mal neu zu booten. Ohne Zweifel kann dies jedoch sehr nützlich sein, um bei einem wahrscheinlich oder tatsächlich kompromittierten System forensische Beweise sicher zu stellen.

Obwohl der Kreuzverhöransatz derzeit den Stand der Technik bei der Rootkit-Suche darstellt, ist sie nicht gegen alle existierenden Rootkit-Angriffe gefeit. Tatsächlich hängt sein Erfolg zum Großteil von der Implementierung insbesondere der Low-Level-Abfragen ab. Um beispielsweise das NTFS-Platten-Layout zu ermitteln, muss sich der Scanner zunächst ein Handle für das Volume besorgen und anschließend die Sektoren der Platte auslesen. Wenn er sich dabei auf die API-Funktionen des Betriebssystems verlässt, sollte der Entwickler am besten gleich das Design nochmals überdenken. Anders gesagt: Der Scanner muss davon ausgehen, dass das API kompromittiert ist, denn API-Hooking ist eine bewährte und real eingesetzte Rootkit-Technik, um Entdeckung zu entgehen. Deshalb sollte sich eine starke Implementierung der Kreuzverhörmethode nur auf die direkte Kommunikation mit dem Festplatten-Controller verlassen [9].