Ausarbeitung

Transcrição

Ausarbeitung
Betriebssysteme I: Klassische UNIX Exploits
Markus Sieber
Proseminar Secure Computing
Wintersemester 2006/2007
Technische Universität München
6. Dezember 2006
Inhaltsverzeichnis
1 Sicherheitskonzepte und ihre Lücken
1.1 Umgesetzte Sicherheitskonzepte in Unix Kerneln . . . . . .
1.1.1 Usermode/Kernelmode . . . . . . . . . . . . . . . .
1.1.2 Mehrbenutzersystem . . . . . . . . . . . . . . . . .
1.1.3 Prozesszugriffskontrolle . . . . . . . . . . . . . . . .
1.1.4 Dateisystem Zugriffskontrolle . . . . . . . . . . . .
1.2 Entstehen von Lücken . . . . . . . . . . . . . . . . . . . .
1.2.1 Buffer Overflows . . . . . . . . . . . . . . . . . . .
1.2.2 Fehlende Überprüfung in priviligierten Programmen
2 Root Exploits
2.1 Exploits gegen höher priviligierte Anwendungen
2.1.1 Beispiel: vixie crontab exploit . . . . . .
2.2 Exploits gegen den Kernel . . . . . . . . . . . .
2.2.1 Vorraussetzungen . . . . . . . . . . . . .
2.2.2 Beispiel: Linux ptrace Exploit . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Rootkits
3.1 Userland Rootkits . . . . . . . . . . . . . . . . . . . .
3.1.1 Funktionsweise . . . . . . . . . . . . . . . . .
3.1.2 Gestelltes Beispiel . . . . . . . . . . . . . . . .
3.2 Kernel Rootkits . . . . . . . . . . . . . . . . . . . . .
3.2.1 Funktionsweise . . . . . . . . . . . . . . . . .
3.2.2 Beispiel: adore-NG . . . . . . . . . . . . . . .
3.3 Erkennmöglichkeiten . . . . . . . . . . . . . . . . . .
3.3.1 Grundsätzliches zum Erkennen von Rootkits .
3.3.2 Möglichkeiten im laufenden Betrieb (unsicher)
3.3.3 System mit Resucue System untersuchen . . .
4 Ausblick
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
3
3
3
4
6
6
6
.
.
.
.
.
7
7
7
7
8
8
.
.
.
.
.
.
.
.
.
.
9
9
9
9
9
9
10
10
10
11
11
13
3
1
1.1
Sicherheitskonzepte und ihre Lücken
Umgesetzte Sicherheitskonzepte in Unix Kerneln
Unix Kernel, zu denen auch Linux zählt, wurden von Anfang an mit gewissen Sicherheitsfeatures konzipiert.´ Auf die nun etwas genauer eingegangen werden soll.
1.1.1
Usermode/Kernelmode
Prozessoren unterstützen mindestens zwei Betriebsmodi. Im sogenannten kernel mode
wird ein unbegrenzter Zugriff auf die Systemressourcen gewährt, das heißt jeder implementierte Befehl wird von der CPU verarbeitet, Speicherzugriff wird nicht limitiert und
auch I/O Operationen dürfen uneingeschränkt ausgeführt werden. Im Gegensatz dazu sind
Prozesse, die im user mode auf der CPU ausgeführt werden stark limitiert. Diese Prozesse
müssen, um I/O Operationen ausführen zu dürfen, eine Schnittstelle zum Kernel benutzen, der dann die gewünschte Operation im kernel mode ausführt. Eine I/O Operation
auf eine Festplatte kann folglich nur vom Kernel getätigt werden. Wenn ein Prozess eine
Datei lesen will, muss er die entsprechenden Funktionen des Kernels benutzen. [1]
1.1.2
Mehrbenutzersystem
Unix wurde als Multiuser-Betriebssytem entworfen. Jedem Benutzer wird mit seinem Namen eine eigene, einzigartige BenutzerID zugeordnet, die sogenannte UID. Ein Benutzer
kann nur auf seine eigenen Prozesse zugreifen, bzw denen Signale schicken. Ein besonderer
User ist root, der die UID 0 besitzt. Dieser User wird vom Kernel besonders behandelt:
Er hat Zugriff auf alles. Aus diesem Grund ist es ein Ziel von Linuxdistributionen, so
wenig Code wie möglich unter root Rechten auszuführen. [1]
1.1.3
Prozesszugriffskontrolle
Da Linux wie erwähnt ein Multiuserbetriebssystem ist, wird zu jedem Prozess gespeichert
welchem User dieser Prozess zugeordnet ist. Die Zugriffsrechte des Prozesses werden anhand dieser Information festgelegt. Wenn ein Benutzer nun einen neuen Prozess startet,
werden seine UID, EUID und SUID auf die BenutzerID des Anwenders gesetzt. Wenn der
Prozess nun über einen Syscall - eine Funktion im Kernel - eine Operation durchführen
will, überprüft der Kernel mit der effectiven UID“, ob der Prozess das Recht hat die
”
gewünschte Operation durchzuführen.
Es kommt allerdings auch vor, dass die Anwendung mehr Rechte benötigt, als dem
Benutzer gegeben sind. Aus diesem Grund wurde das System mit EUID (=effektive UID),
reale“ UID und SUID (=saved UID) entworfen [5].
”
4
Als Beispiel sei die Anwendung passwd erwähnt, mit welcher das Passwort eines Benutzers geändert werden kann. Diese braucht natürlich Schreibzugriff auf die entsprechende
Datei, die der Anwender selbst aber nicht einmal lesen darf, da dort die Passwörter gespeichert werden. Für die Anwendung passwd ist deshalb das suid-Bit gesetzt, welches
dafür sorgt, dass beim Start dieser Anwendung die EUID und SUID des neuen Prozesses
nicht auf die Benutzerid des Starters gesetzt werden, sondern auf die, die der Besitzer
der Datei hat, in unserem Fall root. Die Anwendung wird also mit EUID=0, SUID=0,
UID=BenutzerID gestartet. Wenn nun ein Zugriff auf die Systemdatenbank mit den Passwörtern erfolgt, wird die EUID für diesen Zweck überprüft, welche ja 0 ist. Es wird also
Zugriff auf diese Datenbank gegeben.
Abbildung 1: Bei dem Programm passwd ist das SUID Bit gesetzt
Da es höchst sicherheitskritisch ist, eine Anwendung mit root Rechten auszuführen,
kann die Anwendung sich selbst die benötigten Rechte nur an der Stelle geben, an der
sie auch tatsächlich notwenig ist. Der Prozess kann über einen Syscall also seine EUID
auf die UID setzen und hat damit wieder nur die Rechte des Anwenders. Sobald er die
nötigen zusätzlichen Rechte braucht, kann er sich wiederum eines Syscalls bedienen, der
seine EUID wieder auf das Alte setzt, was in der saved user ID“ kurz SUID gespeichert
”
ist.
Da Unix Kernel und damit natürlich auch Linux Gruppenunterstützung mitliefern,
existieren noch drei weitere solche IDs zu jedem Prozess: GID, EGID und SGID, die
genauso wie auch die BenutzerIDs funktionieren.
Bei einer Rechteüberprüfung wird also zuerst getestet ob der Prozess mit seiner EUID
Zugriff auf das entsprechende Betriebsmittel hat und falls dies nicht der Fall ist, wird
seine EGID getestet. [2]
1.1.4
Dateisystem Zugriffskontrolle
Die in Linuxumgebungen benutzten Filesysteme, speichern zu jeder Datei neben Inhalt
und Dateiname auch noch Informationen, wer die Datei lesen/schreiben oder ausführen
darf. Dazu besitzt eine Datei folgende zusätzliche Attribute:
1. Dateibesitzer
5
2. Gruppe des Dateibesitzers
3. Zugriffsrechte für den Dateibesitzer: lesen, schreiben und/oder ausführen
4. Zugriffsrechte für die Benutzer, die derselben Gruppe angehören: lesen, schreiben
und/oder ausführen
5. Zugriffsrechte für alle Anderen: lesen, schreiben und/oder ausführen
6. suid-Bit, siehe auch 1.1.3
7. sgid-Bit, welches analog wie das suid-Bit funktioniert, eben nur mit den Gruppenrechten
Für Verzeichnis existieren genau dieselben Rechtebits (Lesen, Schreiben und Ausführen), wobei Ausführen mit Betreten gleichzusetzen ist. Der Inhalt eines Verzeichnisses ist
also nur lesbar, wenn das Verzeichnis auch das Auführrecht besitzt.
Damit Prozesse für den Zugriff auf das Filesystem andere Rechte benutzen können,
wie für die restlichen Betriebsmittel, besitzt jeder Prozess neben den in 1.1.3 erwähnten
IDs auch noch eine FSUID und eine FSGID, die im Normalfall der EUID bzw EGID
entsprechen.
Der Kernel überprüft bei einem Zugriff auf das Filesystem die über die Dateiattribute
vergebenen Rechte mit der FSUID und der FSGID des Prozesses. Das heißt wenn die
FSUID des Prozesses dem Eigentümer der Datei entspricht, werden die Zugriffsrechte des
Dateibenutzers verwendet. Falls die FSGID des Prozesses der Gruppe der Datei entspricht
werden entsprechend die Zugriffsrechte für die Gruppe verwendet. Der Benutzer root hat
alle Rechte auf die Datei, ganz egal welche Attribute vergeben sind.
Um die Zugriffsrechte einer Datei zu verändert, existiert ein syscall. Dieser erlaubt es
jedoch nur dem Besitzer der Datei diese Attribute zu verändern (oder eben dem Benutzer
root)
Abbildung 2: Dateiauflistung und Anzeige der Zugriffsrechte
6
Die Zugriffsrechte sind wie folgt zu verstehen: Falls das erste Zeichen ein d“ ist, so
”
handelt es sich um ein Verzeichnis, bei normalen Dateien steht dort ein -“1 . Es folgen drei
”
Reihen mit je drei Zeichen. Zuerst die Rechte für den Benutzer selbst, dann für die Gruppe
und schließlich für den Rest. r steht für Lesen, wenn das Lesenrecht nicht gesetzt ist, so
steht dort nur ein -. Genau wie für das Lesenrecht folgen dann noch w für Schreibrecht
und x für das Ausführrecht. Falls das SUID Bit gesetzt ist, wird x durch ein S ersetzt.
Modere Filesysteme bieten inzwischen auch ein sogenanntes ACL System an, wodurch
der Besitzer neben den oben kennengelernten Zugriffsrechten noch weiter vergeben kann.
Er kann also zusätzlich explizit festlegen, dass der Benutzer Tom die Datei auch lesen
darf, obwohl er es über die normalen Zugriffsrechte nicht hätte.
Es sei an dieser Stelle auch noch angemerkt, dass es noch ein Sonderrecht für Verzeichnisse gibt, das sogenannte sticky Bit[11].
1.2
1.2.1
Entstehen von Lücken
Buffer Overflows
Sehr häufige Fehler in Computerprogrammen sind die Buffer Overflows. Über das Ausnutzen dieser Programmierfehler haben wir bereits einiges gehört, deshalb wird hier nicht
genauer darauf eingegangen.
1.2.2
Fehlende Überprüfung in priviligierten Programmen
Viele Programme haben auch ganze einfach ungenügend Überprüfungen eingebaut. In
Webanwendungen kommen diese Art der Fehler sehr häufig vor, wodurch es dem Angreifer
oft möglich wird Benutzerrechte auf dem angegriffenen System zu bekommen.
1
Es gibt noch andere Arten von Dateien“ wie FIFOs, Links und andere spezielle Dateien.
”
7
2
Root Exploits
Eine Schwachstelle in einem Softwareprogramm kann also dazu genutzt werden seine Rechte zu erweitern. Genau dies tun Exploits. Root Exploits sind Programme, die Schwachstellen in Software nutzen, um die Privilegien eines Benutzers auf Root Rechte auszuweiten.
Derartige Schwachstellen, die durch Programmierfehler entstehen, kommen in allen größeren Projekten vor. Die Hersteller von Software veröffentlichen gewöhnlich regelmäßig
Updates, die auch in der Regel die bekannt gewordenen Sicherheitslücken schließen.
2.1
Exploits gegen höher priviligierte Anwendungen
Auf einem Unixsystem sind die Zugriffsrechte für die Anwender sehr stark eingeschränkt.
Es gibt darum Programme die mit höheren Benutzerrechten laufen, wie zum Beispiel
- bereits erwähnt - das passwd Programm. Wenn in dieser Software Fehler gemacht
worden sind, können diese genutzt werden, um die Rechte dieses Programms dafür zu
nutzen andere Anweisungen auszuführen, die vom Programmierer nicht angedacht waren.
Wenn das neue Passwort, welches der Anwender eingibt zum Beispiel in ein Array von
30 Zeichen gespeichert wird, der Nutzer aber mehr als 30 Zeichen eingibt, so kommt es
zu einem Buffer Overflow, der ausgenutzt werden kann, um bösartigen Programmcode in
den Speicher zu schreiben.
2.1.1
Beispiel: vixie crontab exploit
Cron ist ein Anwendung, die dafür sorgt, dass bestimme Programme zu bestimmten
Zeiten ausgeführt werden. Der Crondämon läuft auf einem Unix System üblicherweise
mit root Rechten, da er sein EUID ändern muss, wenn die Anwendungen der Benutzer
ausgeführt werden. Die Anwender können ihre eigenen Cron Dateien erstellen, die dem
Crondämon sagen, wann er welches Programm ausführen soll, natürlich mit den Rechten
des jeweiligen Benutzers.
Da der Vixie Cronserver, der standardmäßig von Redhat benutzt wird, ungenügend
Kontrolle gegen die Daten in der Crontab Datei durchgeführt hat, war es möglich über
den allokierten Speicherbereich hinaus zu schreiben. Es konnte dadurch bösartiger Code
in den Speicher geschrieben werden, der das Vixie Cron Programm überschrieb. Dieser
Code wurde dann als root ausgeführt. [8]
2.2
Exploits gegen den Kernel
Aber nicht nur Software die im Usermode läuft ist anfällig gegen solche Arten von Angriffen. Auch der Kernel selbst kann Fehler enthalten, die ein bösartiger Nutzer ausnutzen
kann, um seine Rechte zu erweitern.
8
2.2.1
Vorraussetzungen
Um Fehler in der Kernelimplementierung ausnutzen zu können, muss der Angreifer meist
die Möglichkeit haben Code auf dem System auszuführen. Um dies zu erreichen muss er
unter Umständen erst eine andere Anwendung exploiten, die mit den Rechten eines normalen Systembenutzers läuft. Falls der Kernel jedoch einen Fehler in der Umsetzung der
Netzwerkprotokolle hat, so kann der Anwender diesen Fehler auch von einem entfernten
Rechner ausnutzen. Diese Fehler sind jedoch unwahrscheinlich.
Da der Systemadministrator seinen Linux-Kern selbst übersetzen kann und gewisse,
für ihn nicht benötigte, Funktionalität einfach weglassen kann, funktioniert nicht jeder
Linux Kernel Exploit auf jedem Linux Rechner, auch wenn die Kernelversion dieselbe ist.
2.2.2
Beispiel: Linux ptrace Exploit
Im März 2003 wurde ein Fehler im Linux Kernel bekannt, durch den ein Anwender root
Rechte erhalten konnte. Dieser Fehler benutzt eine Fehlimplementierung des Linux-Kerns.
Alle Linux Kernel der Serie 2.4 bis 2.4.20 und auch die der Serie 2.2 bis 2.23 sind davon
betroffen. Ptrace ist eine Kernelfunktion, die dazu gedacht ist, eine Debugmöglichkeit für
Entwickler bereit zu stellen. Prozesse lassen sie mit ptrace sehr gut überwachen. Immer
wenn ein Prozess auf eine Funktion zugreift, die in einem Kernelmodul implementiert
ist, wird eine neuer Childprozess gestartet, bei dem die EUID auf 0 gesetzt wird. Der
Vaterprozess - der Exploit - kann sich mit ptrace an diesen anderen Prozess anhängen,
während die EUID noch nicht auf 0 gesetzt ist. Über die ptrace Funktionen ist es dann
möglich den Programmcode des Childprozesses zu überschreiben. Da der Childprozess
dann seine EUID auf 0 ändert also mit root-Rechten läuft, kann der Exploit so jeden
beliebigen Code ausführen.
Der ptrace Exploit setzt voraus, dass im Kernel Moduluntersützung vorhanden ist
und ptrace Calls erlaubt sind. Dies ist aber in so gut wie jedem Linux System der Fall.
[6]
9
3
Rootkits
Damit ein Angreifer auch noch vollständige Rechte auf einem kompromittierten System
behält, selbst wenn die eignetliche Lücke geschlosse ist, kann er ein Rootkit installieren.
Rootkits sind Programme, die ein Benutzer, der in ein Computersystem eingebrochen
ist, installieren kann, um jederzeit wieder Zugriff auf das System zu erhalten. Für diesen
Zweck haben sie eine eingebaute Backdoor, über die der Angreifer jederzeit wieder Administratorrechte erhalten kann, auch wenn der eigentliche Fehler, über den er eingebrochen
ist wieder behoben wurde. Rootkits tarnen sich dabei selbst, so dass der Systemadministrator es schwer hat zu erkennen, dass ein solches Programm auf seinem Computer
installiert ist.
3.1
3.1.1
Userland Rootkits
Funktionsweise
Userland Rootkits sind Programme die auf der Benutzerebene installiert sind. Der Kernel
wird dabei unangetastet gelassen. Über bestimmte Befehlscodes, die nur der Angreifer
kennt, kann er das Rootkit jederzeit dazu bringen, seine Befehle auszuführen. Da das
Rootkit meist als Benutzer root läuft, hat der Angreifer die vollständige Kontrolle über
das System.
3.1.2
Gestelltes Beispiel
Ein einfaches Userland Rootkit würde einen root-Prozess starten, der einen Netzwerk
Port öffnet. Befehle die über diesen Port geschickt werden, führt das Programm mit root
Privilegien auf dem System durch. Zur Tarnung kann das Rootkit auch noch die Binaries
ls ps und netstat so abändern, dass das Rootkitprogramm nicht auftaucht. Auf diese
Weise kann der Administrator es nicht mit Standarttechniken entdecken.
3.2
3.2.1
Kernel Rootkits
Funktionsweise
Kernel Rootkits installieren sich in den meisten Fällen als Kernelmodul, welches die Kernel
Schnittstellen - die Systemaufrufe - so verändert, dass es selbst nicht mehr angezeigt wird.
Da zum Auflisten des Verzeichnisinhaltes syscalls benutzt werden, ist das Rootkit so in der
Lage sämtliche seiner Dateien (und die, die der Angreifer verstecken will) zu tarnen und
einfach nicht mit auszugeben. Dasselbe kann das Rootkit für Prozesse machen oder auch
für Netzwerk-Sockets um entfernten Zugriff auf den geknackten Rechner zu bekommen.
10
Kernelmodule sind geradezu prädestiniert, um Rootkits eine gute Basis zu bilden. Denn
alle syscalls lassen sich in den neuen Kernelmodulen überschreiben. Die neue Version des
syscalls kann weiterhin die Alte benutzen und dann eine gefilterte Ausgabe zurückliefern.
Kernelmodule können so auch wichtige Systemdateien modifizieren, zum Beispiel die Datei, die festlegt, welche Module geladen werden. Eine Anzeige der Datei kann aber diesen
Eintrag herausfiltern.
3.2.2
Beispiel: adore-NG
Ein sehr bekanntes Kernel Rootkit ist Adore NG. Adore NG besitzt folgende Funktionalitäten:
1. Dateien und Verzeichnisse können versteckt werden
2. Prozesse und Sockets lassen sich ebenfalls verstecken
3. Logs werden automatisch gefiltert. Versteckte Prozesse erzeugen keine Logeinträge
Adore NG lässt sich sehr einfach auf einem System installieren. Um Dateien zu verstecken, benutzt Adore NG die die Benutzer- und GruppenID der Datei. Im Programmcode
wird eine sogenannte ELITE UID und eine ELITE GID festgelegt. Wenn eine Datei diese Benutzer- und GruppenID besitzt, wird sie von den modifizierten Syscalls nicht mehr
angezeigt.
Benutzen lässt sich das Rootkit dann mit dem Programm ava. Dazu muss der Anwender sich über den ADORE KEY ausweisen. Da einige Schnittstellen zwischen dem ava
Client und dem Rootkit über das Filesystem ablaufen, lässt sich das Rootkit auch mit
Standartbefehlen über das proc Filesystem eingeschränkt bedienen. Die Authentifizierung
läuft wieder mit dem ADORE KEY ab. [9]
3.3
3.3.1
Erkennmöglichkeiten
Grundsätzliches zum Erkennen von Rootkits
Während Userland Rootkits sehr leicht über einen Fileintegrity Scanner erkannt werden
können, ist es mit Kernel Rootkits deutlich schwerer. Da ein Kernel Rootkit alle Funktionen, die die Existenz des Rootkits preisgeben, modifizieren kann, ist es theoretisch
möglich, dass ein Kernel Rootkit im Betrieb perfekt getarnt ist. Wenn man die Daten
des Systems allerdings auf einem anderen Computer mit dem Backup vergleicht, wird das
Rootkit sehr schnell auffallen, jedoch wird diese Praktik ja nur verwendet, wenn festgestellt werden konnte, dass ein Angreifer auf dem System war. Diese Spuren lassen sich
jedoch auch gut verwischen.
11
3.3.2
Möglichkeiten im laufenden Betrieb (unsicher)
Im laufenden Betrieb können Userland Rootkits erkannt werden, indem man statisch komplierte Programme benutzt, die mit Sicherheit nicht verändert wurden. Kernel Rootkits
können aufgedeckt werden, da kein perfektes Rootkit bekannt ist und über bestimmte
Techniken kann nachgewiesen werden, dass der Kernel nicht so operiert wie er sollte.
Wenn man zum Beispiel über den syscall signal allen PIDs von 1-999999 ein Signal
schickt, so kann man über den Rückgabewert erfahren, ob dieser Prozess existiert. Da
jedoch kaum ein Rootkit den signal syscall umprogrammiert, erfährt man somit alle PIDs
von existierenden Prozessen, auch die von den vom Rootkit versteckten. Man kann diese
Information nun mit der aus /proc vergleichen (oder der Ausgabe vom ps). Dort werden
die versteckten Prozesse nicht angezeigt. Man sollte jedoch immer im Hinterkopf behalten,
dass Rootkits auch diese Schwachstelle beheben können, indem sie den syscall signal
umschreiben.
Eine weitere Möglichkeit, um öffentlich verfügbare Kernel Rootkits aufzuspüren, ist
den Kernelspeicher nach bekannten Signaturen dieser Rootkits zu durchsuchen. Die meisten Cracker sind nicht in der Lage ihre Rootkits enstsprechend umzuprogrammieren, so
dass sich die Signatur angemessen ändert. Doch auch hier gibt es Ausnahmen, dadurch
gibt auch diese Technik keine 100 prozentige Sicherheit.
Um versteckte Dateien aufzuspüren, kann man eine Userspace Implementierung des
benutzten Filesystems benutzen und die Partition so mit der im Dateisystem eingebundenen vergleichen. Natürlich ist es theoretisch über ein Kernel Rootkit auch möglich diese
Ausgabe abzufälschen, aber in der Praxis viel zu aufwändig.
Es gibt ein Opensource Programm Namens chkrootkit [10], in welchem viele solche
Erkennungstechniken eingebaut sind. Es bietet außerdem auch einige Anwendungen zum
Untersuchen der Netzwerkinterfaces und offenen Ports, denn die Standartsoftware unter
Linux könnte ja durch das Userland Rootkit verändert worden sein.
Eine weitere Möglichkeit um Rootkits aufzuspüren, die sich an einen Netzwerkport
hängen, ist es von einem anderen Rechner aus einen Portscan durchzuführen. Wenn das
Rootkit einen Netzwerkport geöffnet hat, so reagiert der Kernel anderst auf Packete an
diesen Port, als wenn der Port geschlossen ist. Ein Kernel Rootkit kann natürlich auch diesen Mechanismus im Kernel abändern, aber da die Netzwerkfunktionalität sehr komplex
ist verzichten die meisten Rootkits auf diese Technik.
3.3.3
System mit Resucue System untersuchen
Wenn man das System mit Hilfe eines Rescue Systems bootet, kann man von diesem
System aus die Daten des Systems untersuchen. Man kann die Checksumme - üblicherweise
einen MD5-Hash - des Kernels mit einem Backup vergleichen und auch die Module und
12
Anwendungen die gestartet werden überprüfen. Dadurch kann man mit großer Sicherheit
ein Rootkit erkennen. Für diesen Zweck ist ein Backup des Systems sehr von Vorteil.
13
4
Ausblick
Einen absoluten Schutz vor Exploits und Rootkits gibt es nicht und wird es nie geben. Es
gibt nur relative Sicherheit. Um diese relative Sicherheit zu steigern gibt es moderne Entwicklungen, die darum bemüht sind, dass Buffer Overflows nicht mehr so gut ausnutzbar
sind. PAX und Intels XD sind ein paar dieser Entwicklungen. Es gibt auch andere Ansätze
um die Computersicherheit zu steigern, so zum Beispiel RSBAC - Rule Set Based Access
Control, welches es ermöglicht die Zugriffsrechte von Prozessen weiter einzuschränken.
Auch wenn Anwendungen mit root-Rechten laufen, haben diese dann nicht den kompletten Systemzugriff. Da diese neuen Technologien jedoch sehr schwer zu administrieren sind,
sind sie nicht weit verbreitet.
14
Literatur
[1] Andrew S. Tanenbaum (2003): Moderne Betriebssysteme. Pearson Education
[2] Daniel P. Bovet, Marco Cesati (2005): nderstanding the Linux Kernel. O’Reilly Media
[3] Anonymous (1999): Linux hacker’s guide. Markt & Technik
[4] Brian Hatch, James Lee, George Kurtz (2001): Hacking Linux exposed. Mcgraw-Hill
[5] Linux Benutzer/GruppenID Sicherheitskonzept:
http://www.stanford.edu/ stinson/cs155/notes/setuid.txt (zuletzt abgerufen am
9.1.07)
[6] Ivan Buetler (2003): Funktionsweise des Linux ptrace Exploits
http://www.csnc.ch/static/download/misc/Linux PTrace Root Compromize.pdf
ComPass Security (zuletzte abgerufen am 9.1.07)
[7] ptrace Exploit Programmcode:
http://august.v-lo.krakow.pl/ anszom/km3.c
[8] Vixie Crontab Root Exploit:
http://insecure.org/sploits/vixie.crontab.overflow.html
[9] Adore NG Rootkit:
http://stealth.openwall.net/rootkits/
[10] Rootkit Erkennprogramm: http://www.chkrootkit.org/
[11] Sticky Bit: http://en.wikipedia.org/wiki/Sticky bit
-