whitebox fuzz tests - symbolische ausführung im rahmen von ... · whitebox fuzz tests symbolische...
TRANSCRIPT
Whitebox Fuzz TestsSymbolische Ausführung im Rahmen von Fuzz Tests
Ferhat BeyazSeminar Beiträge zum Software EngineeringInstitut für Mathematik und Informatik
Abschlusspräsentation, 31.10.2013
Blackbox Fuzzing
Barton P. Miller, University ofWisconsin
… Arbeiten von zu Hause, da Unwetterden Weg zur Uni erschwerten
… Zugang auf seinen Rechner amInstitut von zu Hause aus
… Absturz des Insitutrechners… Viele Abstürze derselben Art in derRegion gemeldet
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 6
Blackbox Fuzzing
Bartons PC
UNIX Tool
Rauschen
Die Quelle versendet diese Nachricht.
Di¨º Que33e versentå‚∂ diΩπe Nach¢|⁄cht.
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 7
Blackbox Fuzzing
… 1989: Fuzzing mit 80 CLI-Tools, 25-30% der Tools stürzten ab… 1995: Mehr CLI-Tools, GUI-Anwendungen, Netzwerkdienste, etc., biszu 43% abgestürzte Tools
… 2000 und 2006: Windows und Mac Anwendungen, 40% abgestürzteAnwendungen
Blackbox Fuzzing
„Senden von unstrukturierten Zufallsdaten als Eingabe in einComputerprogramm“
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 8
Blackbox Fuzzing
int test (int x) {if (x == 13) {
abort();}return 0;
}
… Blackbox Fuzzing benötigt keinWissen über den Quellcode
… Obwohl Blackbox Fuzzing effektivsein kann, gibt es Schwierigkeiten:
… x = 13 wird nur in einem von 232Fällen ausgeführt
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 9
Whitebox Fuzzing
… Warum nicht das Wissen über den Quellcode beim Fuzzing nutzen?… Technologische Weiterentwicklung der Blackbox Tests… Nicht bloßzufällig Eingaben generieren… Sondern den Quellcode hinzuziehen… Benutzen meist große Unternehmen: Microsoft, Google, Nasa, etc.
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 10
Whitebox Fuzzing Definition
Whitebox Fuzzing ist die automatische Testgenerierung, basierend auf
symbolischer Ausführung und dem Lösen von Pfadbedingungen.
Patrice Godefroid
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 11
Whitebox Fuzzing Definition
Whitebox Fuzzing ist das Erstellen von wohlgeformten Testeingaben, die den
Code in den tiefsten semantischen Einheiten untersuchen.
Vijay Ganesh
Whitebox Fuzzing ist das Einspeisen von falschen Daten, um zu verifizieren, dass alle Zielpfade
innerhalb eines Codes durchlaufen werden, wobei die Softwarekonfiguration und die zufälligen
Eingaben derart verändert werden, sodass alle Datenvalidierungen im getesteten Code
durchlaufen werden.
John Neystadt,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 12
Schwachstellenselektion
… Testdurchlauf mit zufälliger Eingabe… Aufzeichnen des durchlaufenen Programmflusses… Identifikation von Schwachstellen, z. B.:
… Systemaufrufe… Aufrufe in fremde Bibliotheken
… Generierung neuer Eingaben für kritische Bereiche… Beispieltool: BuzzFuzz
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 13
Pfadanalyse
… Testdurchlauf mit zufälliger Eingabe… Aufzeichnen des durchlaufenen Programmflusses… Sammeln der Konditionale auf dem Pfad… Systematisches Negieren der Pfadbedingungen ! neue Eingaben… Beispieltools: jFuzz und SAGE
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 14
Extrahieren der Komponentenschnittstellen
… Extrahieren von Schnittstellen mittels statischer Codeanalyse… Generierung eines Testtreibers… Blackbox Fuzz Tests mit Testtreiber… Generierung neuer Eingaben aus zufälligen Eingaben… Beispieltool: DART
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 15
Whitebox Fuzzing Definition
… Eingaben generiert, die ...… ... nicht durch initiale Eingabevalidierung durchfallen… ... Fehler tiefer im Code offenbaren
… Daher: Directed Fuzzing als geeignete alternative Bezeichnung
Eigene Definition
„Whitebox Fuzzing ist eine spezielle Technik für Softwaretests, bei derzufällig Daten erzeugt werden, um zielgerichtet Programmflüsse mitdiesem Eingaben zu analysieren und mögliche Schwachstellenaufzudecken.“
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 16
SAGE
… Scalable, Automated, Guided Execution… findet selbst dann noch Schwachstellen, wenn Blackbox Fuzzing undstatische Codeanalysetools versagen (z. B. MS07-017 ANI)
… nicht öffentlich, wird intern benutzt und weiterentwickelt… „Arbeit von 93% der PC Benutzer weltweit wurden bereits indirektdurch SAGE beeinflusst.“
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 17
Symbolische Ausführung undTestgenerierung
… Symbolic Execution inspiriert durch Arbeiten von J. C. King… Pfadkonstruktion ohne das Programm auszuführen… Ausführung des Programms ohne die Eingabevariablen festzulegen… Ausgabe ist ein Term, der Eingabevariablen als freie Variablen enthält… Menge an Eingaben, die verschiedene Pfade durchlaufen
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 18
Symbolische Ausführung undTestgenerierung
void test (char input[4]) {int cnt = 0;if (input[0] == ’b’) cnt++;if (input[1] == ’a’) cnt++;if (input[2] == ’d’) cnt++;if (input[3] == ’!’) cnt++;if (cnt >= 3) abort();
}
… Zufällige Testeingabe:„good“
… �good = hi0 6= b, i1 6= a, i2 6=d, i3 6=!i
… �goo! = hi0 6= b, i1 6= a, i2 6=d, i3 =!i
0 1 1 2 1 2 2 3 1 2 2 3 2 3 3 4
good goo! godd god! gaod gao! gadd gad! bood boo! bodd bod! baod bao! badd bad!
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 19
Einschränkungen
… Explosion der Zahl möglicher Pfade… Lösung: Nicht alle Programmpfade auf einmal testen… Oder: „Funktionszusammenfassungen“
… Unvollständige Präzision… Komplexe Zeigeroperationen, arithmetische Ausdrücke mitFließkommazahlen, Systemaufrufe, etc. in den Pfadbedingungen
… Lösung: Ersetzen mit besseren Werten
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 20
Generationelle Suche
… systematisch alle oder Teile der Zustandsmenge ausfindig machen… Zahl an generierten Tests maximieren… Redundanzen in den Tests vermeiden… so effizient wie möglich eine hohe Codeabdeckung erreichen
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 21
Generationelle Suche
1 search (inputSeed) {2 inputSeed.bound = 0;3 workList = {inputSeed};4 run(inputSeed);5 while (workList not empty) {6 input = pickFirst(workList);7 childInputs = expandExecution(input);8 while (childInputs not empty) {9 newInput = pickOne(childInputs);
10 run(newInput);11 score(newInput);12 workList.addSorted(newInput);13 }14 }15 }
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 22
Generationelle Suche
1 expandExecution (input) {2 childInputs = {};3 // symbolically execute (program, input)4 PC = computePathConstraint(input);5 for (j = input.bound; j < |PC|; j++) {6 if ((PC[0..(j-1)] and not(PC[j])) has
solution I) {7 newInput = input.update(I);8 newInput.bound = j;9 childInputs.add(newInput);
10 }11 }12 return childInputs;13 }
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 23
Grammatikbasierte Testgenerierung
… Effektivität vieler Whitebox Fuzzer bei Compilern, Interpretern, etc.begrenzt
… Lösung: Generiere geeignete Pfadbedingungen… Pfadbedingungen bestehend aus symbolischen Tokens, die vom Lexerzurückgegeben werden
… Lösen der Constraints mit einem eigenen Constraintlöser… Lösungen müssen der Grammatik zugrundeliegen
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 24
BuzzFuzz
… Erstellen von validen Eingaben… Aufzeichnen der Programmflüsse mit diesen Eingaben… Definition kritischer Bereiche… Ermitteln von Eingabebytes, die kritische Bereiche durchlaufen
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 25
BuzzFuzz
BuzzFuzz
Programm
Valide Eingaben
Kritische Bereiche
Testeingaben
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 26
BuzzFuzz
… BuzzFuzz generiert Eingaben zu potentiellen Schwachstellen… SAGE generiert Eingaben für neue Codebereiche
… BuzzFuzz benötigt eine valide Eingabe… Verkompliziert automatisiertes Testen
… BuzzFuzz kann gezielt kritische Codebereiche durchtesten… SAGE arbeitet eher „in die Breite“
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 27
DART
… Entwickelt von Patrice Godefroid (Hauptentwickler SAGE)… nicht öffentlich… Schnittstellenextraktion… operiert auf in C geschriebenem Programmcode
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 28
DART
… Schnittstelle definiert als… die externen Variablen und Funktionen sowie… die Argumente der Methode, die das Programm startet(Kommandozeilenparameter, etc.)
… Komfortable Schnittstellendefinition… Paramater der Schnittstellen dynamisch initialisiert vs. syntaktischeObjekte wie in Variablen
… Uniformes Behandeln dynamischer Datenstrukturen… keine hohen Alias-Analyse-Kosten… externe Funktionen
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 29
DART
… Fokus auf externe Variablen und Funktionen
… eignet sich nicht für große Codemengen, da… keine expandExecution Funktion wie in SAGE… Ausführung der Programme sowohl symbolisch als auch konkret
… Schnittstellenexktration und testen von externen Faktoren… ist in SAGE nicht implementiert
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 30
Fazit
… zwei Drittel aller sicherheitsrelaventen Bugs in Windows 7 von SAGEund Blackbox Fuzzing entdeckt
… SAGE eignet sich sehr gut für große Codemengen… BuzzFuzz ist zielführend, arbeitet aber nicht vollautomatisch… DART kann den Eingaberaum stark eingrenzen, eignet sich aber nichtfür große Codemengen
… Symbolische Ausführung als Kernmethode
… Fuzzing als zuverlässige Methode zur Qualitätssicherung?!… In welchen Szenarien?
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 31
DART Testtreibergenerierung
1 void main() {2 for (i = 0; i < depth; i++) {3 int tmp;4 random_init(&tmp, int);5 test(tmp);6 }7 }
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 32
DART Testtreibergenerierung
1 void random_init(m, type) {2 if (type == pointer to type2) {3 if (fair coin toss == head) {4 *m = NULL;5 } else {6 *m = malloc(sizeof(type));7 random_init(*m, type2);8 }9 } else if (type == struct) {
10 for all fields f in struct11 random_init(&(m->f), typeof(f));12 } else if (type == array[n] of type3) {13 for (int i = 0; i < n; i++)14 random_init((m+i), type3);15 } else if (type == basic type) {16 *m = random_bits(sizeof(type));17 }18 }
,
Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 33