Fuzzing: Das steckt hinter der automatisierten Test-Methode

Fuzzing, auch Fuzz-Testing genannt, ist eine automatisierte Methode, die bestens für das Aufdecken von Schwachstellen in Software geeignet ist. Erfahren Sie in diesem Artikel, worum es sich bei diesem Test-Verfahren handelt, welche Vor- und Nachteile mit der Methode verknüpft sind und welche verschiedenen Fuzzing-Tools es gibt.

Was ist Fuzzing (Fuzz-Testing)?

Fuzzing bzw. Fuzz-Testing ist eine vom Wissenschaftler Barton Miller entwickelte Methode, um Software systematisch auf Schwachstellen zu testen. Dabei wird nicht versucht, den Quellcode des Programms zu interpretieren – vielmehr wird die Software als Blackbox und ihr Inhalt als gegeben betrachtet. Alle möglichen Schnittstellen der Dateneingabe werden automatisiert aufgerufen und mit Zufallsdaten gespeist. Dieser Prozess kann sich je nach Größe des untersuchten Software-Projekts über Stunden oder sogar Tage hinziehen.

Ziel des Fuzz-Testing ist es, festzustellen, ob für alle möglichen Eingabevarianten die notwendigen Reaktionen im Programm hinterlegt sind. Sinnlose oder fehlerhafte Eingaben sollten möglichst durch Fehlerbehandlungsroutinen aufgefangen werden. Sind diese nämlich für bestimmte Eingaben nicht vorhanden oder funktionieren nicht richtig, kann ein Programmabsturz die Folge sein. Das technische Vorgehen, Software auf alle Eventualitäten zu prüfen, ist im Bereich der Webentwicklung seit Langem fester Bestandteil von Entwicklungsumgebungen. Viele Webanwendungen werden beispielsweise schon seit Jahren per Cross-Browser-Testing auf ihre Funktionsfähigkeit in verschiedenen Webclients bzw. Browserversionen getestet.

Welche Arten von Fuzzing gibt es?

Man unterscheidet grundsätzlich zwischen folgenden drei Varianten des Fuzzings:

Application-Fuzzing

Bei diesem Fuzz-Testing-Ansatz werden Funktionen wie Schaltflächen und Eingabefelder grafischer Programme oder Optionen von Kommandozeilenprogrammen getestet. Dabei werden Funktionen beispielsweise gezielt unnatürlich häufig oder schnell aufgerufen oder Eingabefelder mit zu großen Inhalten gefüllt.

Protocol-Fuzzing

Für den Austausch von Daten nutzt man Protokolle, etwa das Hypertext Transfer Protocol (HTTP) im Web. Die übertragenen Daten müssen in einem bestimmten Format vorliegen. Protocol Fuzzing dient dazu, das Verhalten beim Versenden falsch formatierter Inhalte zu überprüfen. Insbesondere ist dabei wichtig, dass die übersandten Inhalte nicht versehentlich als Befehle interpretiert und dann auf einem Server ausgeführt werden.

File-Format-Fuzzing

Fuzzing-Tools, die den Ansatz des File-Format-Fuzzings verfolgen, erzeugen fehlerhafte Dateien und lassen diese im Anschluss von der zu testenden Software verarbeiten. Dateien haben üblicherweise ein genormtes Format wie .jpg für Bilddateien, damit sie unter verschiedenen Anwendungen ausgetauscht werden können. Entspricht die geöffnete Datei nicht dem erwarteten Format, kann das zu Problemen führen. In einer fortgeschrittenen Version lassen sich auch implementierte Funktionen testen, z. B. Kompressionsverfahren für Videodateien.

Wie funktioniert Fuzzing im Detail?

Es ist sehr aufwendig, die Funktionsweise einer Software nachzuverfolgen. Oft besteht sie aus mehreren Tausend Zeilen Quellcode in einer Programmiersprache. Verzweigungen und eingebundene Funktionen machen sie unübersichtlich. Zudem muss der Quellcode nach dem Kompilieren zurückerstellt (dekompiliert) werden, was nicht immer möglich ist.

Fuzzing verfolgt daher einen anderen Ansatz: Es generiert alle erdenklichen Zufallsdaten einer vorgegebenen Art. So sollen möglichst viele Eingabevarianten abgedeckt werden. Fuzzing stellt dabei die Schnittstelle zur automatisierten Eingabe dar. Dies kann auf unterschiedlichen Ebenen passieren. Im Rahmen des Application-Fuzzing werden beispielsweise unterschiedliche Datentypen imitiert und an eine Software weitergegeben. Auch mögliche Längen und Datenformate der Eingaben können getestet werden. Beim Protocol-Fuzzing kommen selbsterstellte Datenpakete zum Einsatz. Eine weitere Möglichkeit besteht darin, Inhalte abzufangen, zu manipulieren und zurückzusenden. Das File-Format-Fuzzing funktioniert mit zufällig generierten Testdateien. Zu testende Faktoren sind beispielsweise die Größe, die Struktur oder gesetzte Marker (Flags).

Anwendungsgebiete von Fuzz-Testing

Vorrangiges Einsatzgebiet von Fuzzing ist die Qualitätssicherung in der Software-Entwicklung. Aufgrund des hohen Automatisierungsgrads ist es möglich, Software regelmäßig in einer vorbereiteten Testumgebung zu prüfen. Diese lässt sich bei agiler Entwicklung in bereits vorhandene Abläufe integrieren. Aber auch bereits veröffentlichte Software kann im Rahmen eines Sicherheitsaudits getestet werden, etwa um die Eignung für sicherheitsrelevante Zwecke festzustellen.

Natürlich kann Fuzzing auch bei der Entdeckung von Exploits helfen. Allerdings lassen sich nur Anhaltspunkte über Fehler in Programmfunktionen finden, da Fuzzing-Tools letztlich keinen Zugriff auf die internen Strukturen der untersuchten Software haben.

Vor- und Nachteile von Fuzzing im tabellarischen Überblick

Vorteile von Fuzzing Nachteile von Fuzzing
Möglichkeit, durch vorbereitete Tests einen einheitlichen Qualitätsstandard zu gewährleisten Teils komplizierte Handhabung von Software
Stärkung der Software-Stabilität Zusätzlicher Arbeitsaufwand
Verbesserung der Sicherheit Fehlende Eingrenzung von Ursachen bei der Feststellung von Fehlern
Verfügbarkeit von kostenlosen etablierten Tools Missbrauchsmöglichkeit durch Entwickler von Schadsoftware

Die besten Fuzzing-Tools im Überblick

Es gibt eine Vielzahl an kostenfreien und kostenpflichtigen Fuzzing-Tools mit unterschiedlichem Funktionsumfang auf dem Markt. Hier eine kleine Übersicht:

  • American Fuzz Lop: Kann den Quellcode selbstständig kompilieren und dann testen; man nennt die Kategorie des Programms daher auch „Grey Box Fuzzer“. Steht der Quelltext nicht zur Verfügung, erfolgt eine Emulation mittels QEMU (Kurzform für Quick Emulator).
  • Fuzzino: Bietet eine Bibliothek zur Erzeugung von Eingabedaten, mit deren Hilfe Anwendungen (protokollorientiert) getestet werden können.
  • LibFuzzer: Bibliothek, die Teil der Compiler-Infrastruktur LLVM ist.
  • ClusterFuzz: Testumgebung, die ursprünglich von Google zum Testen des Browsers Chrome entwickelt wurde.
  • Sulley: Bietet eine Sammlung von Tools in der Scriptsprache Python; insbesondere für einfache Testfälle wie das Generieren von Zufallsdaten geeignet.
  • Peach: Stark automatisierte Lösung für das Fuzz-Testing von Hard- und Software.
  • Powerfuzzer: Bietet verschiedene Angriffsszenarien wie SQL-Injections; die Bedienung erfolgt über eine webbasierte grafische Benutzeroberfläche.
Fuzz-Testing-Tool Entwickler Lizenz Kategorie Besonderheiten
American Fuzz Lop (AFL) Michael Zalewski Open Source Application Grey-Box-Ansatz
Fuzzino Fraunhofer Institut Open Source Protocol Geeignet für spezielle Testfälle
LibFuzzer LLVM Team Open Source Application Integriert in Compiler
ClusterFuzz Google Open Source Application Integriert Tools wie AFL
Sulley OpenRCE Open Source Protocol File, einfache Integrierbarkeit
Peach Peachtech Kommerziell Application Starke Automatisierung
Powerfuzzer Marcin Kozlowski Open Source Application Integriert in KALI-Linux

Mögliche Alternativen zu Fuzz-Testing

Je nach Anwendungszweck gibt es Alternativen zum Fuzz-Testing, die einen anderen Ansatz verfolgen und andere Ergebnisse liefern. Die wichtigsten haben wir im Folgenden in Kurzform für Sie zusammengefasst.

Reverse Engineering

Für Sicherheitsforscher gehört das Reverse Engineering zu den Standardwerkzeugen. Gemeint ist die Untersuchung nach dem Dekompilieren (Rückübersetzung in Programmiersprachen) oder nach dem Disassemblieren (Übersetzung in die maschinennahe Sprache Assembler). Es handelt sich um einen sehr aufwendigen und fehleranfälligen Prozess. Dafür können im Erfolgsfall sämtliche Details zur Programmfunktionalität festgestellt werden.

Debugging

Beim Debugging handelt es sich um einen Fehlersuchprozess im Rahmen der Software-Entwicklung. Programme werden vor der Fertigstellung in der Entwicklungsumgebung temporär ausgeführt. Der Entwickler kann Unterbrechungspunkte setzen (Breakpoints), an denen das Programm stoppt. Dort kann er Inhalte von verwendeten Variablen auslesen und auf ihre Richtigkeit überprüfen. Debugging kommt auch im Rahmen des Reverse Engineering zum Einsatz.

Modultests

Komplexe Software wird oft modular erstellt. Hier hat es sich etabliert, einzelne Komponenten bereits im Rahmen sogenannter Modultests in entsprechenden Testumgebungen zu überprüfen.

Fazit

Fehler und Sicherheitslücken in Software sind meist mit einem Ansehens- und Vertrauensverlust der Entwickler verbunden. Völlige Fehlerfreiheit ist utopisch, was auch den meisten Anwendern von Programmen klar sein dürfte. Der Entwickler hat mit Fuzzing allerdings eine potenzielle Lösung parat, um Fehler zu finden, bevor diese von Dritten gemeldet werden. In jedem Fall ist die Methode ein Gewinn für Stabilität und Sicherheit der Software. Gute Gründe also, Fuzz Testing in die eigene Qualitätssicherung zu integrieren.