Abo
  • Services:
Anzeige
American Fuzzy Lop ist der Name dieser Kaninchenart - und außerdem der Name eines sehr effektiven Fuzzing-Tools.
American Fuzzy Lop ist der Name dieser Kaninchenart - und außerdem der Name eines sehr effektiven Fuzzing-Tools. (Bild: Lithonius/Wikimedia Commons)

Fuzzing: Auf Fehlersuche mit American Fuzzy Lop

American Fuzzy Lop ist der Name dieser Kaninchenart - und außerdem der Name eines sehr effektiven Fuzzing-Tools.
American Fuzzy Lop ist der Name dieser Kaninchenart - und außerdem der Name eines sehr effektiven Fuzzing-Tools. (Bild: Lithonius/Wikimedia Commons)

Programme testweise mit massenhaft fehlerhaften Daten zu füttern, ist eine effektive Methode, um Fehler zu finden. Das sogenannte Fuzzing ist schon seit Jahrzehnten bekannt, doch bessere Tools und einige spektakuläre Funde von Sicherheitslücken haben zuletzt das Interesse daran erneut geweckt.

Anzeige

Im September 2014, wenige Tage, nachdem der sogenannte Shellshock-Bug in der Unix-Kommandozeile Bash Unruhe entfacht hatte, fand der Google-Entwickler Michal Zalewski weitere Bugs in Bash, die ebenfalls zur Ausführung von Code geeignet waren. Zalewski erwähnte in seinem Blogeintrag damals ein Fuzzing-Tool mit dem Namen American Fuzzy Lop, das er selbst entwickelt hatte und das bis dahin kaum jemand kannte. In der Zwischenzeit sind Hunderte von Bugs mit Hilfe von American Fuzzy Lop gefunden worden.

Fehlerhafte Eingabedaten testen

Fuzzing ist eine sehr alte und eigentlich simple Strategie, um Fehler in Software zu finden. Zum ersten Mal tauchte der Begriff 1988 in einer Übungsaufgabe des Informatikers Barton Miller auf. Die Idee: Man erzeugt massenhaft Eingabedaten, die kleine, zufällige Fehler enthalten, und testet eine Software damit. Anschließend wird geprüft, ob die getestete Software unerwünschte Verhaltensweisen zeigt.

Im einfachsten Fall prüft man schlicht auf Abstürze, denn diese sind häufig ein Hinweis auf ungültige Speicherzugriffe wie Buffer Overflows oder Use-after-free-Fehler, die von Angreifern ausgenutzt werden können. Je komplexer ein Eingabeformat ist, desto wahrscheinlicher sind derartige Speicherzugriffsfehler, vor allem bei Programmen, die in C oder C++ geschrieben sind. Typische Fehlerquellen sind etwa die Parser für Bildformate, Videos oder auch TLS-Zertifikate.

Klassischerweise gab es beim Fuzzing zwei Ansätze: zum einen dumme Fuzzing-Tools, die lediglich zufällig Bitfehler in Dokumente einfügten, Bereiche herausschnitten oder Ähnliches. Ein Beispiel dafür ist das Programm Zzuf. Daneben gibt es Tools, die Informationen über die verwendeten Eingabedaten kennen. So kann ein Tool beispielsweise bestimmte Felder in einer Datenstruktur mit dem Maximal- oder Minimalwert füllen oder bestimmte Grenzfälle erzeugen.

Beide Vorgehensweisen haben ihre Nachteile. Einfaches Fuzzing findet nur sehr offensichtliche Bugs. Das ist kein Grund, solche Werkzeuge nicht trotzdem einzusetzen - in vielen Fällen reicht ein Tool wie Zzuf bereits, um Fehler zu finden. Fuzzing-Tools mit Formatinformationen haben wiederum den Nachteil, dass sie immer für bestimmte Eingabedaten angepasst werden müssen, was relativ aufwendig ist.

Untersuchung von Codepfaden als neuer Ansatz

American Fuzzy Lop geht hierbei einen neuen Weg: Das Tool hat keinerlei Informationen über die verwendeten Eingabedaten, es beobachtet aber, welche Codepfade in einem Programm durch eine Eingabedatei genutzt werden. Wird ein neuer Codepfad gefunden, nutzt der Fuzzer diese Eingabedatei bevorzugt für weitere Fuzzing-Vorgänge. Damit das funktioniert, greift American Fuzzy Loop bereits beim Kompilierungsvorgang ein. Zu testende Programme müssen mit einem Wrapper-Script neu kompiliert werden.

Die Strategie, Eingabedaten anhand der Codepfade zu priorisieren, führt zu teilweise faszinierenden Ergebnissen. In einem Experiment startete Zalewski einen Fuzzing-Vorgang mit der Standard-JPEG-Bibliothek. Als Eingabe nutzte er dabei eine sinnlose Datei. Nach einigen Stunden erzeugte der Fuzzer daraus gültige JPEG-Bilder. Das Experiment als solches hat natürlich keinen praktischen Nutzen, es ist sinnvoller und schneller, einen Fuzzing-Vorgang mit gültigen Eingabedaten zu starten. Aber da American Fuzzy Lop praktisch ohne Wissen über das Eingabeformat gültige Daten erzeugen kann, ist es auch in vielen anderen Situationen sehr effektiv. So können etwa bestimmte Features eines Dateiformats zufällig erzeugt werden.

American Fuzzy Lop arbeitet im Vergleich zu vielen bisher verfügbaren Tools sehr effektiv. Dazu kommt: Das Programm ist im Quellcode verfügbar und steht unter der freien MIT-Lizenz. Viele andere Tools zur Fehlersuche sind nur kommerziell verfügbar, was ihren Nutzen deutlich einschränkt.

Inzwischen gibt es eine ganze Reihe von Zusatzwerkzeugen und Erweiterungen zu American Fuzzy Lop. So gibt es beispielsweise einen Modus, der mit Hilfe des QEMU-Emulators auch das Fuzzen von Binärsoftware erlaubt. Ein Tool namens Preeny ermöglicht mit Einschränkungen auch das Fuzzen von Netzwerkeingaben.

Kommandozeilentool Strings erweist sich als problematisch

Selbst an völlig unerwarteten Stellen finden Fuzzer manchmal Fehler in der Eingabeverarbeitung. Linux-Systeme liefern ein Werkzeug namens Strings mit, das aus Binärdateien anzeigbare Zeichenketten extrahiert. Dabei kann eigentlich nicht viel schiefgehen, doch Strings macht noch mehr: Trifft es auf eine ausführbare ELF-Datei, versucht es, die Datenstrukturen aus den Sektionsheadern der ELF-Datei anzuzeigen. Michal Zalewski fand einen exploitbaren Fehler in Strings. Er war nicht der Erste: Bereits vor neun Jahren fand Tavis Ormandy ein ähnliches Problem in Strings.

Das Strings-Tool ist Teil des Binutils-Pakets, das Teil einer üblichen Linux-Entwicklungsumgebung ist. Motiviert durch die Funde versuchten nun andere, weitere Bugs in Strings und den anderen Binutils-Kommandozeilen-Tools zu finden. Unzählige Speicherzugriffsfehler wurden daraufhin im Binutils-Paket identifiziert und behoben.

Binutils war zwar ein Extremfall, doch dass sich mit Hilfe von Fuzzing relativ einfach Bugs finden lassen, trifft für sehr viele Programme zu. Die Webseite von American Fuzzy Lop listet eine Trophäensammlung - nahezu alle relevanten Open-Source-Bibliotheken finden sich dort.

Der Autor dieses Artikels konnte kürzlich zeigen, dass man mit Hilfe von Fuzzing auch den Heartbleed-Bug in OpenSSL hätte finden können. Neben American Fuzzy Lop kam dabei der sogenannte Address Sanitizer zum Einsatz. Address Sanitizer ist Teil der LLVM- und GCC-Compiler. Anschalten lässt es sich einfach durch einen Parameter beim Kompilieren (-fsanitize=address).

Address Sanitizer findet zusätzliche Speicherzugriffsfehler

Bei Heartbleed handelte es sich um einen fehlerhaften Speicherzugriff. Allerdings bringt Heartbleed OpenSSL in aller Regel nicht zum Absturz. Der Grund: Es ist lediglich ein lesender Speicherzugriff. Während zufällig gefundene fehlerhafte Schreibzugriffe ein Programm meistens zum Absturz bringen, ist das bei Lesezugriffen üblicherweise nicht der Fall, das Programm läuft anschließend einfach weiter. Address Sanitizer fügt einem Programm zusätzliche Checks hinzu, die derartige Fehler erkennen und das Programm anschließend mit einer ausführlichen Fehlermeldung beenden. Durch die Kombination von Fuzzing und Address Sanitizer lassen sich somit deutlich mehr Speicherzugriffsfehler in Programmen finden.

Die Erfahrungen mit Binutils und die Tatsache, dass die Situation bei vielen anderen Tools nicht viel besser war, hat den Autor dieses Artikels im vergangenen Jahr dazu veranlasst, das Fuzzing Project zu gründen. Das Ziel: Möglichst alle Tools, die auf einem gängigen Linux-System installiert sind, sollten mittels Fuzzing auf Fehler geprüft werden. Die Core Infrastructure Initiative der Linux Foundation hat vor kurzem beschlossen, das Fuzzing Project finanziell zu unterstützen.

Fuzzing ist eine sehr effektive Methode, um Speicherzugriffsfehler in Software zu finden, häufig handelt es sich dabei um Sicherheitslücken. Allerdings muss auch klar sein: Fuzzing ist kein Allheilmittel. Fuzzing findet prinzipienbedingt nur bestimmte Fehler. Es kann nie alle möglichen Eingaben testen und es funktioniert auch nur dann, wenn ein Fehler überhaupt automatisiert erkennbar ist. Für viele Logikfehler in Programmen gilt das nicht.


eye home zur Startseite
Mimus Polyglottos 14. Jul 2015

Das würde für Adobe wahrscheinlich viel zu teuer ;-)

MagicT 10. Jul 2015

... Programmierer != Programmierer Generell stimme ich dir da zu - auch wenn du als...



Anzeige

Stellenmarkt
  1. Schaeffler Automotive Aftermarket GmbH & Co. KG, Langen
  2. Robert Bosch GmbH, Schwieberdingen
  3. R&S Cybersecurity HSM GmbH, Berlin
  4. über Harvey Nash GmbH, Hamburg, Aschaffenburg, Wiesbaden


Anzeige
Hardware-Angebote
  1. (reduzierte Überstände, Restposten & Co.)
  2. 65,89€ (Bestpreis!)

Folgen Sie uns
       


  1. GigaKombi

    Vodafone verbessert Datenpaket für Warten aufs Festnetz

  2. Datenrate

    O2 drosselt mobiles Internet wegen EU-Roamings

  3. Netgear Nighthawk X6S

    Triband-Router kann mit Sprache gesteuert werden

  4. Spark

    DJI-Minicopter stürzt ab

  5. Nachfolger Watchbox

    RTL beendet Streamingportal Clipfish

  6. Chipmaschinenausrüster

    ASML demonstriert 250-Watt-EUV-System

  7. Linux-Distribution

    Opensuse Leap 42.3 baut Langzeitpflege aus

  8. Soziales Netzwerk

    Facebook soll an Smart-Speaker mit Display arbeiten

  9. Kumu Networks

    Vollduplex-WLAN auf gleicher Frequenz soll noch 2018 kommen

  10. IT-Dienstleister

    Daten von 400.000 Unicredit-Kunden kompromittiert



Haben wir etwas übersehen?

E-Mail an news@golem.de


Anzeige
Ikea Trådfri im Test: Drahtlos (und sicher) auf Schwedisch
Ikea Trådfri im Test
Drahtlos (und sicher) auf Schwedisch
  1. Die Woche im Video Kündigungen, Kernaussagen und KI-Fahrer
  2. Augmented Reality Ikea will mit iOS 11 Wohnungen virtuell einrichten
  3. Space10 Ikea-Forschungslab untersucht Umgang mit KI

Indiegames Rundschau: Meisterdiebe, Anti- und Arcadehelden
Indiegames Rundschau
Meisterdiebe, Anti- und Arcadehelden
  1. Jump So was wie Netflix für Indiegames
  2. Indiegames-Rundschau Weltraumabenteuer und Strandurlaub
  3. Indiegames-Rundschau Familienflüche, Albträume und Nostalgie

Creoqode 2048 im Test: Wir programmieren die größte portable Spielkonsole der Welt
Creoqode 2048 im Test
Wir programmieren die größte portable Spielkonsole der Welt
  1. Arduino 101 Intel stellt auch das letzte Bastler-Board ein
  2. 1Sheeld für Arduino angetestet Sensor-Platine hat keine Sensoren und liefert doch Daten
  3. Calliope Mini im Test Neuland lernt programmieren

  1. Re: Nicht nachvollziehbar

    salov | 20:33

  2. Re: Was wird an einem Router so oft umgestellt...

    ElMario | 20:30

  3. Re: Mieseste Netz, schlechtester Kundenservice

    Orwell84 | 20:30

  4. Re: O2 ist leider Drosselmeister

    zacha | 20:29

  5. Re: AMD und Intel dem Untergang geweiht

    plutoniumsulfat | 20:27


  1. 19:35

  2. 17:26

  3. 16:53

  4. 16:22

  5. 14:53

  6. 14:15

  7. 14:00

  8. 13:51


  1. Themen
  2. A
  3. B
  4. C
  5. D
  6. E
  7. F
  8. G
  9. H
  10. I
  11. J
  12. K
  13. L
  14. M
  15. N
  16. O
  17. P
  18. Q
  19. R
  20. S
  21. T
  22. U
  23. V
  24. W
  25. X
  26. Y
  27. Z
  28. #
 
    •  / 
    Zum Artikel