whitebox fuzz tests - symbolische ausführung im rahmen von ... · whitebox fuzz tests symbolische...

33
Whitebox Fuzz Tests Symbolische Ausführung im Rahmen von Fuzz Tests Ferhat Beyaz Seminar Beiträge zum Software Engineering Institut für Mathematik und Informatik Abschlusspräsentation, 31.10.2013

Upload: buidat

Post on 27-Aug-2019

224 views

Category:

Documents


0 download

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

„Knightmare on Wall Street“

,

Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 2

„Knightmare on Wall Street“

,

Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 3

„Knightmare on Wall Street“

,

Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 4

„Knightmare on Wall Street“

,

Seminar BSE, Whitebox Fuzz Tests, 31.10.2013 5

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

Ferhat Beyaz
Text

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