Folien - Freie Universität Berlin
Transcrição
Folien - Freie Universität Berlin
Schutz und Sicherheit Teil 2 Prof. Dr. Margarita Esponda Freie Universität Berlin - WS - 2011/2012 M. Esponda-Argüero 1 Sicherheit vs. Schutz - Schutzmechanismen beziehen sich auf die spezifischen Mechanismen und Methoden des Betriebssystems, die verwendet werden, um die Informationen im Rechner zu schützen und damit Sicherheit zu erzielen. - Sicherheit ist ein allgemeinerer Begriff, der die ganze Problematik umfasst. - Ein Sicherheitssystem muss das Umfeld des Systems in Betracht ziehen, um die Ressourcen schützen zu können. - M. Esponda-Argüero 2 Sicherheitssysteme Um ein System sicher zu machen, müssen Sicherheitsmassnahmen auf 4 verschiedenen Ebenen stattfinden. - physikalisch - menschlich - Betriebssystem - Netzwerk "Security is as weak as the weakest chain" - M. Esponda-Argüero 3 Sicherheitsanforderungen Vertraulichkeit der Daten - Lesezugriff - Information über die Existenz der Daten Datenintegrität - Schreiben, Ändern, Löschen oder Erstellen von Objekten Systemverfügbarkeit - Betriebsmittel des Systems Authentizität - Die Identität eines Benutzers feststellen Sicherheit muss in erster Linie vom Betriebssystem gewährleistet werden - M. Esponda-Argüero 4 Sicherheitsverletzungen Kategorien • Verstoß gegen die Vertraulichkeit • Verstoß gegen die Datenintegrität • Verstoß gegen die Verfügbarkeit von Information • Diebstahl von Diensten • Störung der Funktionalität, Dienste arbeitsunfähig zu machen - M. Esponda-Argüero 5 Das Sicherheitsproblem Angriffe - Insider-Angriffe • Hintertüren • Logische Bomben - Angriffe von außen • Ausnutzung von Programmfehlern • Brechen von Sicherheitssystemen • absichtlich • unbeabsichtigt oder zufällig - M. Esponda-Argüero 6 Standard-Sicherheitsangriffe Normaler Fluss Unterbrechung Mithören Veränderung - Erzeugung M. Esponda-Argüero 7 Malware-Programme Malware benötigt ein Host- unabhängig Programm Hintertüren Logische Trojanische Bomben Pferde Viren Wurm Zombie Taxonomie von Malware-Programmen nach W. Stallings - M. Esponda-Argüero 8 Anzahl der Malware-Signaturen 2000000 1500000 1000000 500000 0 2002 2003 2004 2005 2006 2007 2008 Symantec Report 2009 Im Jahr 2011 mehr als 10 Millionen Malware-Signaturen - M. Esponda-Argüero 9 Insider-Angriffe Logische Bombe • eingebetteter Programmcode, der nur unter bestimmten Bedingungen ausgeführt wird. • ist oft von Programmierern benutzt worden, um Arbeitgeber zu erpressen. Beispiel: In einem bekannten Fall (in Spafford et all. 1989 beschrieben) suchte eine logische Bombe nach dem ID eines bestimmten Angestellten, und wenn die ID zwei Mal hintereinander nicht in der Lohnabrechnung erschien, löste sie sich aus. - M. Esponda-Argüero 10 Logische Bombe • Donald Gene Burleson, Programmierer an der Firma USPA & IRA, Ft. Worth, Texas • wurde am 18. 9. 1985 entlassen • am 21. 9. 1985 um 3 Uhr wurden 168.000 Datensätze aus der Datenbank des Unternehmens gelöscht • Das Programm wurde bei Wiederherstellung der gelöschten Datensätze gefunden • Vor Gericht: “Benson, who spent four days testifying about how he uncovered the scheme, said the destructive programs were created Sept. 2 and Sept. 3, 1985, on Burlesonʼs computer terminal by someone using Burlesonʼs computer password.” Quelle: http://catless.ncl.ac.uk/Risks/7.56.html - M. Esponda-Argüero 11 Insider-Angriffe Hintertüren • Eintrittsstelle eines Programms ohne die üblichen Sicherheitsprüfungen. • Jahrelang "legal" verwendet von Entwicklern während der Testphasen von Programmen. • Oft von Firmen benutzt, um Wartungsaufgaben durchführen zu können. • Leider in der Vergangenheit oft von skrupellosen Programmierern missbraucht worden. • Schwer vom Betriebssystem aus zu kontrollieren. • Sicherheitsmaßnahmen müssen sich auf Software-Entwicklungsebene konzentrieren. - M. Esponda-Argüero 12 Insider-Angriffe Beispiel: Login-Code mit Hintertür aus Tanenbaum: Modern Operating Systems, 2001, S. 610 while (TRUE) { printf( "login: " ); get_string( name ); disable_echoing(); printf( "password: " ); get_string( password ); enable_echoing(); v = check_validity( name, password ); if (v || strcmp( name, "zzzzz" ) == 0) break; } execute_shell( name ); } - M. Esponda-Argüero 13 Hintertüren • 1983 Ken Thompson. "Reflections on Trusting Trust" (Turing Award lecture to the ACM) • Hintertür in früheren UNIX-Versionen • Der C-Compiler hat jedes Mal beim Übersetzen des login-Programms ein Programmteil eingeführt, das ein Passwort, vom Thomson gewählt, erkannt hat. • Der Compiler erkannte auch seine eigene Übersetzung und fügte jedes Mal in den neuen übersetzten Compiler den Teil des C-Compilers ein, der das Übersetzen des login-Programms erkannte. • Diese Hintertür blieb eine Weile aktiv und war nirgendwo im Quellprogramm sichtbar. - M. Esponda-Argüero 14 Hintertür • Juni 2003 • unbekannter Entwickler modifizierte (unautorisiert) die Linux-KernelQuellen • die modifizierte Programmzeilen gehörten zur sys_wait4()-Funktion oder wait4()–Systemaufruf • current->uid = 0 anstatt current->uid == 0 wenn jemand die wait4()-Funktion mit der gesetzten Optionen __WCLONE und __WALL benutzte (illegale Kombination), bekam der aufrufende Prozess root-Privilegien • - die zwei manipulierten Programmzeilen wurden entdeckt (casual checking) M. Esponda-Argüero 15 Angriffe von Außen Trojanische Pferde - Meistens holen sich naive Benutzer den Angriff selber, indem sie Software aus unsicheren Quellen im eigenen Rechner installieren. - Ein Trojanisches Pferd ist ein scheinbar nützliches Programm, das einen verborgenen Programmcode enthält, der bei Aktivierung schädigende Funktionen ausführt. Beispiele: Spyware, Pop-Up-Fenster, Verdeckte Kanäle, usw. - M. Esponda-Argüero 16 NetBus - 1998 - in Delphi geschrieben - von Carl-Fredrik Neikter - nur für Pranks entwickelt - Client- und Server-Anteil - als Fernwartung-Programm verwendet - oft als Trojaner verwendet - M. Esponda-Argüero 17 Trojanische Pferde - Im Jahr 2006 waren mehr als 55 Prozent der vom Informationsverbund des Bundes registrierten Malware-Programme Trojanische Pferde. - Moderne Trojaner sind von Virenscannern nur noch schwer erkennbar. 13% 9% 1% 3% 74% Trojan Worm Other Adware Spyware Information aus Panda Q1 Report 2009 - M. Esponda-Argüero 18 Das Ausnutzen von Programmierfehlern Pufferüberlauf - Pufferüberlauf (buffer overflow) ist einer der meist ausgenutzten Programmierfehler. - Entstehung des Problems • C-Compiler führen keine Überprüfung der Indexgrenzen eines Arrays durch. • C-Programmierer kontrollieren die Indexgrenzen auch nicht. • Folgendes C-Programm wird problemlos übersetzt. int main(){ char c[10]; c[1010] = 10; return 0; } - Ein Byte, das 1000 Positionen vom ursprünglichen Array entfernt ist, wird überschrieben M. Esponda-Argüero 19 Pufferüberlauf Virtueller Adressraum Lokale Variablen in Hauptprogramm AusführungStapel Lokale Variablen in Hauptprogramm Lokale Variablen in Hauptprogramm Rücksprung-Adresse Rücksprung-Adresse Lokale Variablen von Funktion A x Lokale Variablen von Funktion A x Puffer X in A Programm Programm Nachdem Funktion A aufgerufen wird - Programm Die Rücksprung-Adresse wird überschrieben M. Esponda-Argüero 20 Pufferüberlauf #include <stdio.h> #define BUFFER SIZE 256 int main(int argc, char *argv[]) { char buffer[BUFFER SIZE]; Hier kann als Argument ein if (argc < 2) String beliebiger Länge return -1; eingegeben werden. else { strcpy(buffer,argv[1]); } return 0; } - M. Esponda-Argüero 21 Pufferüberlauf #include <stdio.h> int main( int argc, char *argv[]){ execvp("\bin\sh","\bin\sh",NULL); return 0; } - • Dieses Programm in übersetzter Form kann in dem Buffer gespeichert werden. • Der Rest des Buffers kann bis einer Position vor der Rückgabeadresse mit NOPs ausgefüllt werden. • Die Rückgabeadresse wird mit der Anfangsadresse des Buffers (Buffer[0]) überschrieben. • Wenn die Funktion, wo der Buffer ist, beendet wird, geht die Ausführung in dem Programm weiter, das gerade in dem Buffer gespeichert worden ist. M. Esponda-Argüero 22 Pufferüberlauf Rücksprung-Adresse Frame-Zeiger buffer[BUFFER_SIZE-1] . . . buffer[1] - Rücksprung-Adresse des modifizierten Shell-Programms . . . . . . . NO_OPs Modifiziertes Shell-Programms buffer[0] Nachdem das ausführbare Programm kopiert worden ist. - M. Esponda-Argüero 23 Gegenmaßnahme #include <stdio.h> #define BUFFER_SIZE 256 int main(int argc, char *argv[]) { char buffer[BUFFER_SIZE]; if (argc < 2) return -1; - Hier wird die Länge begrenzt else { strncpy( buffer, argv[1], sizeof(buffer)-1); } return 0; } - M. Esponda-Argüero 24 Gegenmaßnahme void input_line() { char line[10]; if ( gets(line) ) . . . } - unsicher - sicherer void safe_input_line() { char line[10]; if ( fgets(line, sizeof line, stdin) ) . . . } - - fgets kontrolliert die Eingabelänge M. Esponda-Argüero 25 Gegenmaßnahme Unterstützung durch den Compiler Lokale Variablen in Hauptprogramm Rücksprung-Adresse Zufallszahl-Barriere ... buffer[2] buffer[1] buffer[0] Neue GNU-Compiler bieten Übersetzungs-Optionen, um CanaryZahl Überprüfungen zu aktivieren. - Eine Zahl vor der RücksprungAdresse wird vom Compiler erzeugt und als Überprüfungszahl verwendet. Programm - M. Esponda-Argüero 26 Gegenmaßnahme Unterstützung durch den Compiler Eine Sicherheitskopie der Rücksprung-Adresse wird erzeugt Lokale Variablen in Hauptprogramm Rücksprung-Adresse ... buffer[2] buffer[1] buffer[0] Rücksprung-Adresse Sicherheitskopie Programm - M. Esponda-Argüero 27 Das Ausnutzen von Programmierfehlern Formatstring-Angriffe - Das Problem entsteht durch die Verwendung ungefilterter Benutzereingaben in C-Funktionen wie printf() - Eine ungefilterte Eingabe, die zuerst in buffer gespeichert ist, wird wie folgt ausgegeben: printf( buffer ); die Variable buffer wird als String mit Formatangabe interpretiert Besser wäre: printf("%s", buffer); die Variable buffer wird als einfache Zeichenkette ausgegeben - M. Esponda-Argüero 28 Formatstring-Angriffe #include <stdio.h> #include <string.h> int main(){ int i = 0; char line[20], greetings[20] = "Hello "; gets(line); strcat(greetings,line); printf(greetings, &i); printf("i=%d\n",i); return 0; } - Eingabe: Peter %n Ausgabe: Hallo Peter i=12 Anzahl der Zeichen, die bis zu dieser Stelle ausgegeben wurden M. Esponda-Argüero 29 Zufallsgestaltung des Adressraum-Aufbaus Address Space Layout Randomization ASLR - - ASLR vergibt den Programmen zufällige Adressbereiche - das System ist nicht mehr deterministisch - Pufferüberlauf-Angriffe werden damit erschwert - zuerst in Open BSD - später im Windows Vista und Mac OS 10.5 M. Esponda-Argüero 30 Gegenmaßnahme Compiler und Compiler-Erweiterungen GNU-Compiler Erweiterungen: • Der Stack Smashing Protector von IBM ehemals als ProPolice bekannt • Der Stack Guard entwickelt an der Oregon Health and Science University und bei der Linux-Distribution Immunix • Microsoft Visual Studio Option /GS • ab GCC 4.1 - GCC –fstack-protector filename.c M. Esponda-Argüero 31 Gegenmaßnahme mit Hardware-Unterstützung • Die NX-Bit Abkürzung von No eXecute-Bit ist eine einfache Hardware-Unterstützung zur Verbesserung der Sicherheit eines Computers. • Zuerst von AMD mit dem Prozessor Athlon 64 x86-Markt eingeführt mit dem Namen Enhanced Virus Protection (EVP) • Intel verwendet in seinen neuesten Prozessoren die gleiche Technik mit der Bezeichnung XD-Bit (Execute Disable). • Andere Firmen verwenden ähnliche Techniken. • Mit dem NX-Bit können Speichersegmente mit Daten von Speichersegmenten mit Programmcode unterschieden werden. • Dieser Schutz funktioniert allerdings nur mit Betriebssystemen, die die Unterstützung des NX-Bit ausnutzen. - ab Hier! - M. Esponda-Argüero 32