Kurz erklärt: Fuzzing (auch Fuzz-Testing) ist ein automatisiertes Testverfahren, bei dem ein Programm mit einer Vielzahl zufälliger, ungültiger oder gezielt generierter Eingaben konfrontiert wird, um Abstürze, unerwartetes Verhalten und Sicherheitslücken zu finden. Im Kontext von Blockchains dient Fuzzing vor allem der Prüfung von Smart Contracts.
Herkunft und Grundprinzip
Der Begriff geht auf ein Forschungsprojekt von Barton Miller an der University of Wisconsin um 1988/1990 zurück, bei dem Unix-Programme mit zufälligen Zeichenketten getestet wurden. Seither hat sich Fuzzing zu einer etablierten Methode der Softwaresicherheit entwickelt.
Das Grundprinzip besteht darin, ein Programm mit vielen automatisch erzeugten Eingaben auszuführen und dabei auf abnormales Verhalten zu achten. Ein Fuzzer erzeugt Eingaben, führt das Zielprogramm damit aus und protokolliert Fehlerzustände wie Abstürze, Speicherfehler oder verletzte Zusicherungen (Assertions).
Varianten
Fuzzing lässt sich nach dem Grad der Kenntnis über das Zielprogramm und die Art der Eingabeerzeugung unterscheiden:
- Black-Box-Fuzzing: ohne Kenntnis des internen Aufbaus, rein über die Schnittstelle.
- White-Box-Fuzzing: unter Einbeziehung des Quellcodes und Programmpfade.
- Coverage-guided Fuzzing: die Eingabeerzeugung wird durch die erreichte Codeabdeckung gesteuert (z. B. AFL, libFuzzer).
- Property-based Fuzzing: es werden zuvor definierte Eigenschaften (Invarianten) geprüft, die stets gelten müssen.
Fuzzing im Blockchain-Umfeld
Bei Smart Contracts wird häufig property-based Fuzzing eingesetzt: Entwickler formulieren Invarianten wie „die Summe aller Guthaben entspricht dem Gesamtbestand“, und der Fuzzer versucht, diese durch beliebige Transaktionsfolgen zu verletzen. Verbreitete Werkzeuge sind Echidna und Medusa (beide von Trail of Bits) sowie die integrierte Fuzz-Funktion des Foundry-Frameworks.
Fuzzing ergänzt andere Prüfmethoden wie die statische Analyse mit Slither oder die symbolische Ausführung mit Mythril und ist ein fester Bestandteil vieler Sicherheitsaudits, etwa auf Plattformen wie Code4rena.
Häufige Fragen
Was unterscheidet Fuzzing von klassischen Unit-Tests?
Unit-Tests prüfen einzelne, vom Entwickler vorgegebene Fälle. Fuzzing erzeugt automatisch sehr viele, oft unerwartete Eingaben und deckt so Randfälle auf, die bei manueller Testauswahl übersehen werden.
Kann Fuzzing alle Fehler finden?
Nein. Fuzzing findet nur Fehler, die sich durch die erzeugten Eingaben auslösen lassen, und garantiert keine Vollständigkeit. Es wird deshalb mit anderen Methoden wie statischer Analyse, symbolischer Ausführung und manuellem Review kombiniert.
Welche Werkzeuge werden für Smart-Contract-Fuzzing genutzt?
Verbreitet sind Echidna und Medusa von Trail of Bits sowie die eingebaute Fuzz-Funktion des Foundry-Frameworks. Sie prüfen vor allem vorgegebene Invarianten.
Was ist coverage-guided Fuzzing?
Dabei misst der Fuzzer, welche Codepfade eine Eingabe erreicht, und bevorzugt Eingaben, die neue Pfade abdecken. So werden systematisch tiefer liegende Programmteile erreicht.
Ist Fuzzing nur für Sicherheitstests relevant?
Nein. Fuzzing wird allgemein zur Qualitätssicherung eingesetzt und deckt neben Sicherheitslücken auch funktionale Fehler, Abstürze und Robustheitsprobleme auf.
Zusammenfassung
Fuzzing ist ein automatisiertes Testverfahren, das Programme mit vielen generierten Eingaben durchprobiert, um Fehler und Sicherheitslücken zu finden. Im Blockchain-Umfeld wird vor allem property-based Fuzzing zur Prüfung von Smart Contracts eingesetzt und mit statischer Analyse und symbolischer Ausführung kombiniert.
Weiterführende Quellen
- Wikipedia: Fuzzing: de.wikipedia.org
- OWASP: Fuzzing: owasp.org