Fuzz-Testing (Fuzzing)
Was ist Fuzz-Testing (Fuzzing)?
Fuzz-Testing (Fuzzing) ist ein Qualitätssicherungsverfahren, das zur Entdeckung von Programmierfehlern oder Bugs und Sicherheitslücken in Software, Betriebssystemen und Netzwerken eingesetzt wird. Beim Fuzzing werden große Mengen an Zufallsdaten, Fuzz genannt, in das Testobjekt eingegeben, um es zum Absturz zu bringen.
Wird eine Sicherheitslücke gefunden, wird ein Software-Tool, ein so genannter Fuzzer, eingesetzt, um mögliche Ursachen zu ermitteln. Fuzz-Tests wurden ursprünglich von Barton Miller an der Universität von Wisconsin im Jahr 1989 entwickelt.
Wie funktioniert Fuzz-Testing?
Fuzzing ist eine Technik zum Testen der Anwendungssicherheit, bei der ungültige Eingaben in ein Softwareprogramm eingespeist werden, um Schwachstellen aufzudecken. Es handelt sich dabei häufig um eine Black-Box-Testtechnik, die ohne Kenntnis der internen Struktur des betreffenden Programms durchgeführt wird.
Das Programm wird mit absichtlich falsch aufgebauten, unerwarteten oder völlig zufälligen Eingaben gefüttert, um zu sehen, wie es darauf reagiert. Auf diese Weise werden Bedrohungen der Cybersicherheit und Schwachstellen wie Speicherlecks aufgedeckt. Sobald die Schwachstellen identifiziert sind, können sie gepatcht werden, so dass Bedrohungsakteure sie nicht zur Installation von Malware, zum Diebstahl vertraulicher Daten oder zu anderen Zwecken nutzen können.
Fuzzing wird in der Regel mit automatisierter Software durchgeführt, die neue Testfälle erzeugt und das Programm mit Eingaben füttert. Dabei wird auch festgestellt, ob das Programm abstürzt, sich aufhängt oder andere Schwachstellen aufweist. Einige Fuzz-Testprogramme verändern die Eingaben so lange, bis sie sich unerwartet verhalten und der Test ein positives Ergebnis liefert.
Normalerweise sind Programme, die strukturierte Eingaben verarbeiten, Gegenstand von Fuzz-Tests. Ausgefeiltere Fuzzers füttern das Programm mit semivaliden Eingaben, die für das Programm beim Parsen gültig genug sind, aber ungültig genug, um Schwachstellen aufzudecken.
Es gibt sowohl kostenpflichtige als auch kostenlose Open-Source-Software-Fuzzing-Tools.
Verschiedene Arten von Fuzz-Tests
Es werden verschiedene Arten von Fuzz-Tests verwendet, darunter die folgenden:
- Dumb Fuzzers: Diese relativ „dummen“ Fuzzer sind sich der Eingabestruktur der Software nicht bewusst.
- Smart Fuzzers: Diese sind sich hingegen der Eingabestruktur der Software bewusst.
- Mutationsbasierte Fuzz-Tests ändern bestehende Eingaben in semivalide Eingaben.
- Generationsbasierte Fuzz-Tests verwenden von Grund auf neu generierte Eingaben. Diese Art von Fuzzer benötigt keine vorhandenen Eingaben; er generiert Eingaben auf der Grundlage der bekannten Eingabestruktur.
- Black-Box-Tests haben keine Kenntnis von der Struktur eines Programms und generieren Eingaben nach dem Zufallsprinzip. Sie prüfen die Grundfunktionalität eines Programms und sind gut geeignet, um einfache Fehler aufzuspüren.
- White-Box-Tests kennen die Struktur eines Programms und entwerfen die Testeingaben auf der Grundlage dieses Wissens. White-Box-Tests benötigen in der Regel mehr Zeit, um Eingaben zu generieren, eignen sich aber gut für die Entdeckung von Fehlern tief im Programm.
- Gray-Box-Fuzzing hat ein teilweises Verständnis der Struktur von Computerprogrammen und ist eine Mischung aus Black- und White-Box-Testing.
- Abdeckungsgesteuerte Fuzz-Tests sind eine Art mutationsbasiertes Testen, bei dem die Codeabdeckung der Fuzz-Testeingaben verfolgt und dann das Verhalten des Programms bewertet wird. Die Informationen aus dem anfänglichen Test werden verwendet, um zu bestimmen, welche Eingaben mutiert werden müssen, um eine möglichst hohe Abdeckung zu erreichen.
Anwendungsbeispiele für Fuzz-Tests
Fuzzers eignen sich am besten zum Aufspüren von Schwachstellen, die Bedrohungsakteure für verschiedene Arten von Angriffen ausnutzen könnten, zum Beispiel Pufferüberläufe, Denial of Service, Cross Site Scripting und SQL Injection. Dies sind Schemata, die böswillige Hacker verwenden, um in kürzester Zeit so viel Schaden wie möglich anzurichten. Angreifer verwenden bösartigen Code als missgestaltete Dateneingabe, um ein System zu manipulieren, ähnlich wie beim Fuzz-Testing.
Fuzz-Tests werden verwendet, um verschiedene Datentypen in Programmiersprachen zu testen, darunter Metadaten, Zeichen und binäre Sequenzen. Einige Methoden für Fuzz-Tests sind die folgenden:
- Beim Protokoll-Fuzzing wird die Funktionalität auf Protokollebene getestet, indem mutierte Netzwerkpakete als Eingabe verwendet werden.
- Das Dateiformat-Fuzzing beginnt mit einem legitimen Dateimuster und verändert es wiederholt, bis das Programm beim Versuch, die Datei zu öffnen, abstürzt.
- Beim Anwendungs-Fuzzing werden die Benutzeroberfläche, Texteingaben und Befehlszeilenoptionen getestet.
Die Vorteile von Fuzz-Tests
Fuzz-Testing hat ein sehr gutes Kosten-Nutzen- Verhältnis und deckt oft Fehler auf, die beim Schreiben und Debuggen von Software übersehen werden. Im Folgenden sind einige der spezifischen Vorteile von Fuzz-Tests aufgeführt:
- Automatisierung. Sobald eine Fuzzer-Anwendung konfiguriert ist, können Algorithmen verwendet werden, um Tests automatisch und mit wenig bis gar keinem menschlichen Eingriff durchzuführen, was Geld und Zeit spart.
- Systematischer Ansatz. Fuzz ist eine völlig zufällige Eingabe, so dass sie nicht der Voreingenommenheit des Software-Testers unterliegt und Schwachstellen aufdecken kann, die ein menschlicher Tester übersehen würde.
- Ideal für geschlossene Systeme. Es ist unmöglich, das Innenleben eines Programms oder Geräts zu kennen, das auf einem geschlossenen System aufgebaut ist, daher ist das Testen von Zufallsdaten die einzige Option. Bei Anwendungen für künstliche Intelligenz und Deep Learning ist es beispielsweise unmöglich, die genaue Beziehung zwischen Eingaben und Ausgaben zu erkennen.
Die Grenzen von Fuzz-Tests
Fuzz-Tests unterliegen einigen wesentlichen Einschränkungen, darunter die folgenden:
- Nicht abgedeckte Angriffsarten. Fuzz-Tests sind weniger geeignet, um Software-Sicherheitsbedrohungen zu entdecken, die keine Programmabstürze aufgrund von fehlerhaften Eingaben verursachen. Zu diesen Arten von Bedrohungen gehören Spyware, einige Viren, Würmer, Trojaner und Keylogger.
- Schwierige Einrichtung. Für die Verwaltung und Überwachung von Fuzz-Tests und den richtigen Umgang mit den gefundenen Fehlern sind umfangreiche Programmierkenntnisse erforderlich.
- Begrenzter Umfang. Die meisten Arten von Fuzz-Tests liefern kein vollständiges Bild von der Sicherheit, Qualität und Effektivität eines Programms. Sie finden lediglich Fehler. Auch andere Arten von Softwaretests wie Funktionstests und Betatests werden im Softwareentwicklungsprozess benötigt.