Tutorial zum Fuzz-Testen (Fuzzing).
โก Intelligente Zusammenfassung
Beim Fuzz-Testing werden ungรผltige, unerwartete oder zufรคllige Daten in ein Programm eingespeist und auf Abstรผrze, Hรคnger und Speicherfehler geachtet. Dadurch werden Sicherheitslรผcken aufgedeckt, die bei herkรถmmlichen Funktionstests fast nie gefunden werden.
Was ist Fuzz-Test?
Fuzz-Testing oder Fuzzing Fuzz-Testing ist eine Softwaretestmethode, bei der ungรผltige oder zufรคllige Daten, sogenannte Fuzz-Daten, in ein Softwaresystem eingeschleust werden, um Programmierfehler und Sicherheitslรผcken aufzudecken. Ziel des Fuzz-Testings ist es, Daten mithilfe automatisierter oder halbautomatisierter Verfahren einzufรผgen und das System auf verschiedene Ausnahmen wie Systemabstรผrze oder Fehler im integrierten Code zu testen.
Fuzz-Testing wurde ursprรผnglich von Barton Miller an der University of WisconsinโMadison entwickelt. Er prรคgte den Begriff, nachdem Leitungsrauschen in einer Modemverbindung die von ihm verwendeten Programme zum Absturz brachte. Seine Studenten setzten die ersten Fuzzer 1989 ein und stellten fest, dass etwa ein Drittel der getesteten UNIX-Dienstprogramme abstรผrzten oder sich aufhรคngten. Fuzz-Testing ist ein Softwaretest Technik, und es ist eine Art von Sicherheitstests.
Das untenstehende Diagramm zeigt die grundlegende Fuzzing-Schleife, in der generierte Daten an die zu testende Anwendung gesendet und die Reaktion beobachtet werden.
Warum Fuzz-Tests durchfรผhren?
Fuzzing ist ein wichtiger Bestandteil von Testplรคnen, da es Eingaben untersucht, fรผr die bisher niemand einen Testfall geschrieben hat. Die wichtigsten Grรผnde fรผr die Anwendung durch Teams sind unten aufgefรผhrt.
- Beim Fuzz-Testing werden in der Regel die schwerwiegendsten Sicherheitsfehler und -mรคngel aufgedeckt, da ein Absturz ein direkter Beweis fรผr einen nicht behandelten Eingabepfad ist.
- Fuzz-Testing liefert effektivere Ergebnisse, wenn es mit Schwarz Box Tests, Betatests und andere Debugging-Methoden.
- Fuzz-Testing wird verwendet, um die Schwachstellen von Software zu รผberprรผfen, und es ist eine sehr kosteneffektive Testmethode, da die Eingaben generiert und nicht manuell geschrieben werden.
- Fuzz-Testing ist eine der Black-Box-Testmethoden. Fuzzing ist auch eine der gรคngigsten Methoden, mit denen Hacker Schwachstellen in einem System aufspรผren. Daher wird Angreifern durch die vorherige Durchfรผhrung des Tests der einfachste Zugang verwehrt.
Arten von Fuzz-Tests
Fuzzer werden รผblicherweise danach gruppiert, wie viel sie รผber das zu testende Programm wissen. Je mehr der Fuzzer weiร, desto tiefer kann er in den Code eindringen.
| Typ | Was der Fuzzer weiร | Typische Verwendung |
| Black-Box-Fuzzing | Es gibt keine Informationen รผber die internen Ablรคufe; es erfasst nur Ein- und Ausgรคnge. | Quick Smoke testet eine Binรคrdatei oder einen aktiven Endpunkt. |
| Weiรbox-Fuzzing | Vollstรคndiger Quellcode, oft kombiniert mit symbolischer Ausfรผhrung, um schwer erreichbare Verzweigungen zu lรถsen. | Tiefgehende Analyse einer Komponente, deren Quellcode verfรผgbar ist. |
| Graubox-Fuzzing | Keine Quellcodeprรผfung, sondern Laufzeit-Feedback, z. B. welche Codezweige eine Eingabe erreicht. | Der Standardwert fรผr moderne Engines wie AFL++ und libFuzzer. |
Eine zweite, รคltere Spaltung trennt dummes Fuzzing ab intelligentes FuzzingEin einfacher Fuzzer manipuliert Bits, ohne das Eingabeformat zu kennen, sodass die meisten seiner Daten vom ersten Parser verworfen werden. Ein intelligenter Fuzzer hingegen versteht Prรผfsummen, Lรคngenfelder und die Nachrichtenstruktur, sodass seine Eingaben die Validierung รผberstehen und die zugrundeliegende Logik erreichen. Abdeckungsgesteuertes Fuzzing ist die Grey-Box-Verfeinerung, die das Fuzzing massentauglich gemacht hat: Die Engine instrumentiert die Binรคrdatei, behรคlt alle Eingaben bei, die einen neuen Zweig erreichen, und mutiert die รberlebenden, sodass sich der Korpus stetig in Richtung unerforschten Codes entwickelt, anstatt von zufรคlligem Rauschen neu zu starten.
So fรผhren Sie Fuzz-Tests durch
Die Schritte fรผr Fuzz-Testing umfassen die grundlegenden Testschritte:
Schritt 1) โโIdentifizieren Sie das Zielsystem โ Wรคhlen Sie die Binรคrdatei, Bibliothek, den Dienst oder den Protokollendpunkt aus, der angegriffen werden soll, und bestรคtigen Sie, dass Sie berechtigt sind, ihn zu testen.
Schritt 2) Identifizieren Sie die Eingaben โ Listet alle Einstiegspunkte auf, von denen das Ziel liest: Dateien, Befehlszeilenargumente, Umgebungsvariablen, Netzwerkpakete, Formularfelder und API-Nutzdaten.
Schritt 3) Fuzzed-Daten generieren โ fehlerhafte Eingaben erzeugen, indem gรผltige Beispiele verรคndert werden, indem sie aus einem Modell des Formats generiert werden oder indem beides kombiniert wird.
Schritt 4) Fรผhren Sie den Test mit Fuzzy-Daten durch. โ Fรผhren Sie das Ziel mit den generierten Eingaben aus, idealerweise in einer Schleife, die den Prozess nach jedem Fehler automatisch neu startet.
Schritt 5) รberwachen Sie das Systemverhalten โ Achten Sie auf Abstรผrze, Hรคnger, Assertionsfehler, รผbermรครige Speichernutzung und Sanitizer-Berichte, anstatt nur die gedruckte Ausgabe zu รผberprรผfen.
Schritt 6) Fehler protokollieren โ Speichern Sie die exakte Eingabe, die jeden Fehler ausgelรถst hat, reduzieren Sie sie auf den kleinsten reproduzierbaren Fall und fรผgen Sie sie dem Stapel hinzu. trace beigefรผgt.
Beispiele fรผr Fuzzer
Fuzzer werden auch danach klassifiziert, wie sie ihre Eingabe erstellen, und die drei unten aufgefรผhrten Ansรคtze sind diejenigen, denen Sie am hรคufigsten begegnen werden.
- Mutationsbasierte Fuzzer Vorhandene Datenbeispiele werden verรคndert, um neue Testdaten zu erzeugen. Dies ist ein sehr einfacher und unkomplizierter Ansatz: Man beginnt mit gรผltigen Beispielen eines Protokolls und verรคndert dann jedes Byte oder jede Datei.
- Generationsbasierte Fuzzer Neue Daten werden auf Basis der Modelleingaben definiert. Sie beginnen, Eingaben von Grund auf anhand der Spezifikation zu generieren.
- Protokollbasierte Fuzzer Die Tests setzen detaillierte Kenntnisse des zu testenden Protokollformats voraus, die aus der Spezifikation stammen. Dazu wird ein Array der Spezifikation in das Tool geschrieben. Anschlieรend wird mithilfe eines modellbasierten Testgenerierungsverfahrens die Spezifikation durchlaufen und Unregelmรครigkeiten in den Dateninhalten, der Datenreihenfolge usw. hinzugefรผgt. Dies wird auch als Syntaxtest, Grammatiktest oder Robustheitstest bezeichnet. Ein Fuzzer kann Testfรคlle aus bestehenden Testfรคllen generieren oder gรผltige bzw. ungรผltige Eingaben verwenden.
Beim protokollbasierten Fuzzing gibt es zwei Einschrรคnkungen:
- Die Tests kรถnnen erst fortgesetzt werden, wenn die Spezifikation ausgereift ist.
- Viele nรผtzliche Protokolle sind eine Erweiterung verรถffentlichter Protokolle. Wenn Fuzz-Tests auf verรถffentlichten Spezifikationen basieren, Testabdeckung fรผr neue Protokolle wird begrenzt sein.
Die einfachste Form des Fuzzing besteht darin, der Software zufรคllige Eingaben zu senden, entweder als Protokollpakete oder als Ereignis. Diese Technik ist sehr effektiv, um Fehler in vielen Anwendungen und Diensten aufzuspรผren. Es gibt auch andere Techniken, die sich leicht implementieren lassen. Dazu mรผssen lediglich die vorhandenen Eingaben verรคndert werden, beispielsweise durch einfaches Vertauschen ihrer Bits.
Von Fuzz Testing erkannte Fehlertypen
Da beim Fuzzing ein Programmlauf anhand des tatsรคchlichen Programmverhaltens und nicht anhand eines Erwartungswerts beurteilt wird, lassen sich die dabei aufgedeckten Fehler in drei Gruppen einteilen.
- Assertionsfehler und Speicherlecks: Diese Methodik wird hรคufig fรผr groรe Anwendungen eingesetzt, bei denen die Fehler die Speichersicherheit beeintrรคchtigen, was eine schwerwiegende Schwachstelle darstellt. Buffer รberlรคufe, Verwendung nach Freigabe und Lesezugriffe auรerhalb des zulรคssigen Bereichs treten alle hier auf.
- Ungรผltige Eingabe: Beim Fuzz-Testing werden Fuzzer eingesetzt, um ungรผltige Eingaben zu generieren, die zum Testen von Fehlerbehandlungsroutinen verwendet werden. Dies ist wichtig fรผr Software, die ihre Eingaben nicht kontrolliert. Einfaches Fuzzing kann als eine Mรถglichkeit zur Automatisierung angesehen werden. negative Prรผfung.
- Korrektheitsfehler: Fuzzing kann auch zur Erkennung bestimmter Arten von Fehlern eingesetzt werden, die die Korrektheit betreffen, wie beispielsweise eine beschรคdigte Datenbank oder fehlerhafte Suchergebnisse. Differenzielles Fuzzing, bei dem zwei Implementierungen dieselben Eingaben erhalten und die Ergebnisse verglichen werden, ist die รผbliche Methode, um solche Fehler aufzuspรผren.
Fuzz-Testtools
Tools, die in der Websicherheit eingesetzt werden, kรถnnen auch beim Fuzz-Testing verwendet werden, wie zum Beispiel Burp Suite und Peach Fuzzer. Einige der unten aufgefรผhrten klassischen Namen sind mittlerweile archiviert, daher wird ihr aktueller Status neben jedem Eintrag angegeben.
- Pfirsich FuzzerPeach Fuzzer bietet einen umfassenderen Sicherheitsschutz als ein Scanner. Andere Testwerkzeuge kรถnnen nur nach bekannten Bedrohungen suchen, wรคhrend Peach Fuzzer es Benutzern ermรถglicht, sowohl bekannte als auch unbekannte Bedrohungen zu finden. Peach Tech wurde von GitLab รผbernommen, und die Community Edition v3 wird nicht mehr weiterentwickelt; der Nachfolger ist die GitLab Protocol Fuzzer Community Edition.
- Spike-ProxySPIKE Proxy ist ein professionelles Tool, das nach Sicherheitslรผcken auf Anwendungsebene in Webanwendungen sucht. Es deckt die Grundlagen ab, wie zum Beispiel: SQL Injection und Cross-Site-Scripting auf einer vรถllig offenen Plattform Python Infrastruktur, und sie war verfรผgbar fรผr Linux und WindowsEs wurde seit vielen Jahren nicht mehr gepflegt und wird hier nur aus historischen Grรผnden aufgefรผhrt.
- WebScarabWebScarab ist geschrieben in Java WebScarab ist daher auf vielen Plattformen einsetzbar. Das Framework kommuniziert รผber HTTP- und HTTPS-Protokolle und fungiert als abfangender Proxy: Es ermรถglicht dem Benutzer, Browseranfragen zu prรผfen und zu modifizieren, bevor sie den Server erreichen, und Serverantworten zu prรผfen und zu aktualisieren, bevor sie den Browser erreichen. Jede von WebScarab gefundene Sicherheitslรผcke wird der Liste der gemeldeten Probleme hinzugefรผgt. Das Repository wurde im April 2024 archiviert und ist nun schreibgeschรผtzt.
- OWASP WSFuzzerWSFuzzer ist ein unter der GPL lizenziertes Programm, das in [Sprache/Architektur] geschrieben wurde. Python das auf Webdienste abzielte und in seiner letzten Version HTTP-basiert war SOAP-Dienste waren das Hauptziel. Es wurde als Teil von WebScarab ausgeliefert und zusammen mit diesem eingestellt; OWASP ZAP und sein Fuzzer-Add-on sind der empfohlene Ersatz.
- Beibehaltene Alternativen: AFL++ und libFuzzer sind die standardmรครigen, abdeckungsbasierten Engines fรผr nativen Code. OSS-Fuzz fรผhrt sie kontinuierlich und kostenlos fรผr Open-Source-Projekte aus, und Boofuzz behandelt Netzwerkprotokoll-Fuzzing in PythonEine ausfรผhrlichere Liste findet sich im Leitfaden zu Tools fรผr Sicherheitstests.
Fuzz-Testing: Bewรคhrte Verfahren
Ein Fuzzer, der einfach auf ein Zielsystem gerichtet und sich selbst รผberlassen wird, findet selten viel. Die folgenden Vorgehensweisen unterscheiden eine Kampagne, die zu gemeldeten Fehlern fรผhrt, von einer, die lediglich Rechenzeit verbraucht.
- Beginnen Sie mit einem guten Ausgangskorpus. Sammeln Sie echte, gรผltige Eingaben, die die Anwendung bereits akzeptiert. Das Verรคndern einer gรผltigen Datei erreicht den Parsing-Code wesentlich schneller als das Verรคndern zufรคlliger Bytes.
- Entwerfen Sie ein kleines, schnelles Geschirr. Der Einstiegspunkt sollte pro Durchlauf genau eine Sache erledigen, Netzwerkaufrufe und Festplattenschreibvorgรคnge vermeiden und schnell zurรผckkehren, da der Durchsatz in Ausfรผhrungen pro Sekunde gemessen wird.
- Desinfektionsmittel einschalten. Stille Speicherbeschรคdigung fรผhrt oft nicht zu einem Absturz. AddressSanitizer und UndefinedBehaviorSanitizer wandeln sie in einen sofortigen, diagnostizierbaren Fehler um.
- Lรคufe lange und laufe ununterbrochen. Ein ein- oder zweistรผndiger Testlauf deckt oberflรคchliche Fehler auf; tieferliegende Fehlerpfade benรถtigen in der Regel viele Stunden. Deshalb gehรถrt Fuzzing eher in einen nรคchtlichen CI-Job als in eine manuelle Sitzung.
- Minimiere und dedupliziert jeden Absturz. Reduziere die fehlerhafte Eingabe auf ihre kleinste Form und gruppiere Abstรผrze nach Stapel. tracAndernfalls wรผrde ein Fehler zu Hunderten von Tickets fรผhren.
- Fรผhren Sie einen Regressionskorpus. Fรผge jeden reproduzierenden Input einem permanenten Satz hinzu, der bei jedem Build ausgefรผhrt wird, damit ein behobener Fehler nicht unbemerkt wieder auftreten kann.
- Das Ziel muss legal anvisiert werden. Das Fuzzing eines laufenden Drittanbieterdienstes ohne schriftliche Genehmigung ist von einem Angriff nicht zu unterscheiden.
Vorteile des Fuzz-Tests
Bei realistischen Erwartungen bietet Fuzzing einen Mehrwert, den andere Techniken nur schwer erreichen.
- Fuzz-Testing verbessert die Software-Sicherheitstests.
- Die beim Fuzzing gefundenen Fehler sind manchmal gravierend und oft dieselben, die auch von Angreifern ausgenutzt werden, darunter Abstรผrze, Speicherlecks und unbehandelte Ausnahmen.
- Falls Fehler aufgrund von Zeit- und Ressourcenmangel von den Testern nicht bemerkt werden, werden diese Fehler auch beim Fuzz-Testing gefunden.
- Die Eingaben werden von einer Maschine generiert, sodass die Abdeckung รผber Nacht ohne zusรคtzlichen manuellen Aufwand stetig wรคchst.
Nachteile des Fuzz-Tests
Die gleichen Eigenschaften, die das Fuzzing kostengรผnstig machen, begrenzen auch, was es beweisen kann.
- Fuzz-Testing allein kann kein vollstรคndiges Bild einer gesamten Sicherheitsbedrohung oder einer Reihe von Fehlern liefern.
- Fuzz-Testing ist weniger effektiv bei der Bekรคmpfung von Sicherheitsbedrohungen, die keine Programmabstรผrze verursachen, wie beispielsweise einige Viren, Wรผrmer und Trojaner.
- Fuzz-Testing kann nur relativ einfache Fehler oder Bedrohungen aufdecken und berรผcksichtigt keine Geschรคftslogik.
- Fรผr eine effektive Durchfรผhrung ist ein erheblicher Maschineneinsatz erforderlich.
- Die Festlegung einer Randwertbedingung bei zufรคlligen Eingaben ist sehr problematisch, obwohl Tester dies mittlerweile grรถรtenteils mit deterministischen, benutzergesteuerten Algorithmen lรถsen.
Fuzz-Testing vs. Penetrationstesting
Beide Aktivitรคten suchen nach Sicherheitslรผcken, beantworten aber unterschiedliche Fragen und sind selten austauschbar.
| Eigenschaften | Fuzz-Tests | Penetrationstests |
| Angetrieben durch | Ein automatisierter Motor, der fehlerhafte Eingaben erzeugt | Ein erfahrener Tester, der รผber das System nachdenkt. |
| Schaut nach | Abstรผrze, Hรคnger und Speichersicherheitsfehler | Ausnutzbare Schwachstellen, einschlieรlich Logik- und Konfigurationsfehler |
| Tiefe | Sehr breite Eingabeabdeckung, oberflรคchliches Denken | Enger Themenbereich, tiefgrรผndige Argumentation |
| Ausgang | Eingaben und Stack reproduzieren traces | Ein Ergebnisbericht mit Exploit-Pfaden und Risikobewertungen |
| bester Moment | Kontinuierlich in der Build-Pipeline | In regelmรครigen Abstรคnden, gegen einen Release-Kandidaten |
In der Praxis ergรคnzen sich die beiden Ansรคtze: Durch das Fuzzing werden die billigen, automatisierbaren Abstรผrze beseitigt, sodass die begrenzte Zeit eines Testers fรผr die Fehler genutzt werden kann, die nur ein Mensch erkennen kann.

