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