Wie entdeckt man Rootkits?

23.08.2005
Mit den Schäden, die so genannte Rootkits verursachen können und dem Kampf gegen diese Bedrohung befasst sich der folgende Beitrag.

Mit den Schäden, die so genannten Rootkits verursachen können, und dem Kampf gegen diese Bedrohung befasst sich der Artikel der Kaspersky Lab-Experten Alexey Monastyrsky, Konstantin Sapronov und Yury Mashevsky.

Wie versteck' ich mein Virus?

Eines der größten Probleme für die Malware-Autoren war schon immer ihr Unvermögen, die Anwesenheit eines Fremdcodes im System für den Anwender auf Dauer unsichtbar zu machen, im Idealfall sogar für das Antivirus-Programm.

In der letzten Zeit, da sich das Schreiben eines Schadprogramms immer mehr von einer Beschäftigung aus jugendlichem Leichtsinn in ein Profitgeschäft mit kriminellem Hintergrund umwandelt, stehen besonders die Leute, die Hackem als Geschäft betreiben, vor der aktuellen Herausforderung, die "Spuren zu verwischen". Auf welche Weise kann man ein Programm zum Diebstahl von Bankdaten oder einen illegalen Proxy-Server für den Spam-Versand vor dem Eigentümer des Computers verbergen?

Die modernen Cyberkriminellen lösen dieses Problem genauso, wie es die "Cyber-Hooligans" vor zehn bis 15 Jahren lösten: Einer der ersten Viren für den PC war "Virus.Boot.Brain.a", ein bootfähiges Schadprogramm, das Systemfunktionen für den Zugang zur Festplatte abfing und beim Lesen des Bootsektors, beispielsweise durch ein Antivirus-Programm, anstelle der infizierten die Originaldaten einsetzte. Mit der Zeit wurden dieselben "stealth"-Mechanismen (Abfangen von Systemfunktionen und Unterschiebung von Daten) in Windows-Viren der Familie "Virus.Win32.Cabanas" verwendet.

Ursprung in Unix

Schadprogramme für Unix sind noch nicht so weit verbreitet, wie für DOS und Windows, jedoch gerade von dort kam der Terminus Rootkit, der jetzt sehr häufig zum Unsichtbarmachen von Schadprogrammen verwendet und von Autoren der Trojanerprogramme für Windows eingesetzt wird.

Ursprünglich stand der Terminus Rootkit für einen Programm-Bausatz, der es dem Hacker ermöglicht, sich auf der gehackten Maschine festzusetzen, und der ein Entdecken verhindert. Hierfür werden System-Ausführungsdateien wie login, ps, ls und netstat oder System-Bibliotheken (libproc.a) ausgetauscht, sogar ein Kernel-Modul wird installiert. Ziel ist es, Versuche des Anwenders abzufangen, Information darüber zu erhalten, was auf tatsächlich auf seinem Computer abgeht.

In der letzten Zeit erhält die Verwendung von Rootkit-Technologien zur Verbergung der Schadprogramme im System immer größere Verbreitung. Dies ist in der Abbildung 1 ersichtlich.

Rootkits-Quelltexte im Web

Der zunehmende Bekanntheitsgrad von Rootkits steht mit der öffentlichen Verbreitung der Quelltexte vieler Rootkits im Internet im Zusammenhang. Das Einfügen von Änderungen ist für die Autoren der Schadprogramme ein leichtes Spiel. Ein weiterer Aspekt, der die Popularität der Rootkits fördert, ist die Tatsache, dass die Mehrheit der Windows-Anwender mit Admin-Rechten arbeitet, was den Rootkits ihre erfolgreiche Installation auf dem PC bedeutend erleichtert.

Mit der Tatsache, das Rootkits für Anwender unsichtbar bleiben und von Antivirus-Programme nicht entdeckt werden, machen kriminelle Virenschreiber und Entwickler von so genannten "legalen" Spionageprogramme gut und gern öffentlich Reklame.

Rootkit-Technologien für Windows

Gegenwärtig kann man die existierenden Methoden der Rootkits, um im System unerkannt zu bleiben,i n zwei Gruppen einteilen:

1. Modifikation der Abarbeitungswege durch die Anwendungen
2. Modifikation der System-Strukturen

Beide Methoden werden zum Verbergen von ungewöhnlichen Netz-Aktivitäten, Registry Änderungen und von auffälligen Prozessen verwendet. Das Ziel lautet dabei, das Erkennen der Schadprogramme durch den Anwender oder das Antiviren-Programm zu verhindern.

Die erste Methode zum Verbergen von Informationen kann sowohl im Anwender- und im Kernel-Modus realisiert werden. Im ersten Fall ist die praktische Umsetzung sehr einfach. Häufiger, als eigentlich sonst durch Applikationen üblich, wird hier eine Methode eingesetzt, die auf dem Abfangen der Aufrufe der API-Funktionen beruht (siehe Abbildung 2).

Typischerweise erfolgen Aufrufe der System-API-Funktionen durch Dienstprogramme entweder über spezielle Datenbereiche (Import/Export-Tabellen), oder mit Hilfe der API-Funktion "GetProcAddress". Da der Programm-Code in DLL-Modulen realisiert ist, kann das Rootkit die Anfragen der Anwendung abfangen und sich so in den Prozess einschleusen.

Somit erhält der Übeltäter die Möglichkeit, alle Anwendungen des Benutzers zu kontrollieren. Die dargestellte Manipulation des Abarbeitungsweges ist gut dokumentiert und einfach in der Realisierung, was ihre Verwendung durch die Rootkits erleichtert.

Neben diesem "Vorteil" der leichten Umsetzung gibt es bei der Realisierung von Rootkits im Anwender-Modus einen wesentlichen "Nachteil" - das schwierigere Verbergen der Manipulation. Denn das Vorhandensein von Rootkits im Anwender-Modus des Systems lässt sich ohne große Anstrengung über spezielle Hilfsprogramme feststellen. Und genau dies ist der Grund für das in der letzten Zeit gestiegene Interesse der Hcker für Rootkit-Technologien im Kernel-Modus - ungeachtet des höheren Schwierigkeitsgrades bei der Entwicklung derartiger Rootkits.

Rootkits im Kernel-Modul sind schwerer zu entdecken

Rootkits Kernel-Modus können noch besser ihre Manipulation tarnen als auf Anwenderebene. Die überwiegende Mehrheit dieser Rootkits verwendt nicht dokumentierte Strukturen des Betriebssystems. So fangen sie beispielsweise häufig Anwendungen aus der Tabelle "KeServiceDescriptorTable" ab. Dort variiert allerdings Zahl der Services stark abhängig vom Betriebssystem. Dies zwingt die Rootkits-Entwickler zu tiefer gehenden Analysen des System-Codes, um Hinweise auf Anwendungen in der oben erwähnter Tabelle festzustellen. Diese Vorgehensweise erinnert sehr an das Abfangen der API-Funktionen.

Beispiel für eine Modifikation der Systemstrukturen ist die Veränderung der System-Liste "PsActiveProcessList". Diese Vorgehensweise wird von Rootkit "FU" verwendet: Ein beliebiger Prozess bleibt dabei vor den meisten System Utilities verborgen (siehe auch Abbildungen 3 und 4).


Aus Abbildung 3 ist ersichtlich, dass der gestartete Text-Editor Notepad in der Liste der aktiven Prozesse unter dem Namen notepad.exe sichtbar ist (mit fetter, roter Linie umkreist). Abbildung 4 zeigt den Bildschirm nach dem Start des Rootkits "FU" mit dem Befehl, den Prozess zu verbergen. Aus dieser Abbildung ist ersichtlich, dass bei aktivem Editor sein Name aus der Liste der aktiven Prozesse verschwunden ist (fetter, roter Pfeil).

Das Erkennen von Rootkits

Im Wettlauf mit Antiviren-Programmen werden Rootkits immer eine Nasenlänge voraus liegen. Ein Grund dafür sind die permanent erscheinende neue Rootkit-Technologien. Zum anderen benötigen Entwickler der Antiviren-Programme eine gewisse Zeit für die Analyse der Schadprogramme und für die Bereitstellung der entsprechenden Patches.

Ungeachtet der scheinbar schwierigen Erkennung der Rootkits, gibt es bereits effektive Methoden, diese Schadprogramme zu bekämpfen.

Praktisches Beispiel für ein Anti-Rootkit-Programm:

Als Ergebnis des FU-Rootkits verschwand der Prozess "notepad.exe" aus System, ohne seine Tätigkeit tatsächlich einzustellen. Antirootkit-Funktionen erkennen dieses Verbergen jedoch und das Antiviren-Programm gibt an Anwender eine entsprechende Warnung aus (Abbildung 5).

Das entwickelte Subsystem entdeckt nicht nur bereits in die Antivirus-Dateien aufgenommene Rootkits auf dem Anwendercomputer, sondern auch unbekannte Schadprogramme.

Ein ähnliches Subsystem gibt es auch zum Erkennen von Rootkits im Anwender-Modus. Diese schalten sich wie oben dargestellt in den Kommunikationsprozess mit den DLLs ein und manipulieren diesen. Das neue Subsystem informiert in diesem Fall den darüber, dass ein konkreter Prozess versucht, Code in einen fremden Adress-Bereich einzuschleusen (Abbildung 6).

Rootkit-Technologien für Unix

Die Situation unter erinnert sehr an die unter Windows. Der Angreifer installiert das Rootkit auf dem Computer nachdem er einen privilegierten Zugang via "root" erhalten hat. Root-Rechte, erforderlich für die Installation der überwiegenden Mehrheit der Rootkits, erhält der Übeltäter über die Ausnutzung bekannter Sicherheitslücken, wenn er Zugang zum System mit gewöhnlichen Anwenderrechten hat.

In diesem Fall kann er das System lokal angreifen oder Hilfsprogramme zum Hacken der Datenbanken mit den Passwörtern verwenden. Wenn der Übeltäter die entsprechenden Rechte nicht besitzt, kann er, um in das System einzudringen, von der Ferne angreifen oder beispielsweise Sniffer zum Abfangen der Passwörter einsetzen. Ein derartiges Abfangen von Passwörtern ist bei Diensten wie ftp, telnet oder rlogin möglich, da diese die Übergabe der Passwörter im Netz in offener Form abwickeln.

Abhängig von den bereitgestellten Möglichkeiten kann das Rootkit verschiedene Schadprogramme (Trojan-DDoS, Backdoor und sonstige) enthalten, welche auf dem kompromittierten Computer installiert werden und vom Angreifer die Befehle zur Ausführung abwarten. Besonders perfid: Rootkits können sogar Patches enthalten, die Sicherheitslücken im Systemschutz schließen, mit dem Ziel, ein wiederholtes Eindringen seitens eines anderen Angreifers zu vermeiden.

Genauso, wie unter Windows, gibt es in Unix-System-Rootkits im Anwendungs- und im Kernel-Modus.

In der Regel bestehen die Rootkits im Anwendungs-Modus aus Trojaner-Versionen gewöhnlicher Programme, welche die Anwesenheit ihrer Komponenten im System verbergen und aus einer Backdoor, die einen verdeckten Zugang ins System gewährt. Beispiele für Rootkits im Anwendungs-Modus sind lkr, trOn, ark und andere.

Das Rootkit trOn

Um sein Vorhandenseins im System zu verbergen, führt das Rootkit trOn eine Reihe von Aktionen durch. Während der Installation stellt es den syslogd-Deamon ab, anschließend tauscht es folgende System-Utilities gegen seine eigene Trojaner-Versionen aus: du, find, ifconfig, login, ls, netstat, ps, top und sz. Darüber hinaus fügt trOn dem System die Trojaner-Version des sshd-Deamon. Zum Schluss startet es im Hintergrund sniffer, in inetd.conf wird das Wiederanfahren von telnetd, rsh und finger veranlasst. Zum Schluss werden inetd und syslogd erneut gestartet. Normal befindet sich trOn in /usr/src/.puta, ist dank seiner bereits installierten "modifizierten" Komponente ls ist dieses Verzeichnis unsichtbar.

Rootkits im Kernel-Modus

Rootkitss dieses Typs bieten alle Fähigkeiten des voran gegegangenen Typs - jedoch mit stärkerer Wirkung: Rootkits im Anwender-Modus können nur einzelne binäre Dateien modifizieren, im Kernel-Modus genügt es, den Kernel selbst zu verändern, was das Verbergen von Information bedeutend erleichtert.

Es existieren einige Methoden für das Eindringen der Rootkits in den Kernel des Systems:

1. Verwendung von LKM

Das Linux Kernel lässt es zu, wie viele andere Betriebssysteme auch, Module (oder Treiber) im laufenden Betrieb (on-the-fly) zu laden, was es dem Übeltäter erlaubt, die System-Aufrufe des Kernel zu verändern damit dieser falsche Information herausgibt, etwa eine nachgebesserte Dateiliste.

Eine solchen Herangehensweise lässt sich abblocken, wenn man den monoliten Kernel ohne LKM-Unterstützung kompiliert. Eine derartig Entscheidung bringt jedoch einen wesentlichen Mangel mit sich - man muss in den Kernel alle erforderlichen Treiber manuell einschließen;

2. Einträge in /dev/kmem

Dort ist der Zugang in Speicherbereiche gergelt, die normalerweise vom Kernel belegt sind. Einträge in /dev/kmem überschreiben den Kernel ebenfalls im laufenden Betrieb. Der Angreifer muss für die Veränderung des Kernels lediglich einen geeigneten Speicher-Platz finden.

Doch diese Gefahr ist leicht zu bannen. Es existiert eine Patch, der einen direkten Eintrag in /dev/kmem unterbindet. Genauso kann man das den Zugang über mmap schützen.

3. Infizierung vorhandener Module

Diese Methode unterscheidet sich von der ersten dadurch, dass das Rootkit keine eigenen Module enthält, sondern selbst Routinen befällt. Das Anwenden dieser Vorgehensweise macht Rootkits resistent bei einem Neustart, indem einige Module infiziert werden, welche auf jeden Fall geladen werden (z.B. den Treiber des Dateisystems).

Erkennen der Rootkits

Zum Erkennen von Rootkits kann man leider keine universellen Ratschläge geben, doch mit den folgenden Tipps lassen sich die meisten de aktuellen Rootkits nachweisen:

1. Beobachtung von anomalem Verhaltens von Programmen, von ungewöhnlicher Nutzung des Netzkapazitäten, von zusätzlich auszuführende Aufgaben beim Systemstart und der registrierten Einträge der Anwender

2. Folgenden Anwendungen helfen Rootkits zu erkennen: Saint Jude, Chrootkit, RkScan, Carbonite, Kstat, Rootkithunter, Tripware, Samhain und andere.

Resümee

Alle für Windows betrachteten Methoden zum Entdecken der aktiven Rootkits setzen bei deren Eindringen in das System und bei Störungen während des laufenden Betriebs. Genau diese Auswirkungen werden von Kaspersky-Produkten genutzt und ermöglichen es so, auch unbekannte Rootkits zu erkennen. In den jüngsten Windows-Versionen wird den Rootkit-Entwicklern das Leben noch schwerer gemacht, da Veränderungen im System-Code und in den sonstigen Infrastruktur-Ressourcen nicht zulässig sind. Damit wird sich die Ausbreitung von Rootkits zumindest für bestimmte Zeit auf die aktuellen Windows-Versionen beschränken.

Der Überhang an Schadcodes für Windows im Vergleich zu Unix ist in der gegenwärtig größeren Verbreitung des Microsoft-Betriebssystems begründet. Im Falle eines Ansteigens der Popularität von Unix oder Linux dürfte sich die Situation allmählich ändern - es werden neue Rootkits für Unix/Linux erscheinen und genauso die Methoden zu deren Erkennung und Beseitigung.

Der effektivste Schutz im Kampf gegen Rootkits bleibt nach wie vor die Prävention (rw)

Quelle: Kaspersky Lab