Fuzzing, auch Fuzz-Testing genannt, ist eine au­to­ma­ti­sier­te Methode, die bestens für das Aufdecken von Schwach­stel­len 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 ver­schie­de­nen Fuzzing-Tools es gibt.

Was ist Fuzzing (Fuzz-Testing)?

Fuzzing bzw. Fuzz-Testing ist eine vom Wis­sen­schaft­ler Barton Miller ent­wi­ckel­te Methode, um Software sys­te­ma­tisch auf Schwach­stel­len zu testen. Dabei wird nicht versucht, den Quellcode des Programms zu in­ter­pre­tie­ren – vielmehr wird die Software als Blackbox und ihr Inhalt als gegeben be­trach­tet. Alle möglichen Schnitt­stel­len der Da­ten­ein­ga­be werden au­to­ma­ti­siert auf­ge­ru­fen und mit Zu­falls­da­ten gespeist. Dieser Prozess kann sich je nach Größe des un­ter­such­ten Software-Projekts über Stunden oder sogar Tage hinziehen.

Ziel des Fuzz-Testing ist es, fest­zu­stel­len, ob für alle möglichen Ein­ga­be­va­ri­an­ten die not­wen­di­gen Re­ak­tio­nen im Programm hin­ter­legt sind. Sinnlose oder feh­ler­haf­te Eingaben sollten möglichst durch Feh­ler­be­hand­lungs­rou­ti­nen auf­ge­fan­gen werden. Sind diese nämlich für bestimmte Eingaben nicht vorhanden oder funk­tio­nie­ren nicht richtig, kann ein Pro­gramm­ab­sturz die Folge sein. Das tech­ni­sche Vorgehen, Software auf alle Even­tua­li­tä­ten zu prüfen, ist im Bereich der Web­ent­wick­lung seit Langem fester Be­stand­teil von Ent­wick­lungs­um­ge­bun­gen. Viele Web­an­wen­dun­gen werden bei­spiels­wei­se schon seit Jahren per Cross-Browser-Testing auf ihre Funk­ti­ons­fä­hig­keit in ver­schie­de­nen Web­cli­ents bzw. Brow­ser­ver­sio­nen getestet.

Welche Arten von Fuzzing gibt es?

Man un­ter­schei­det grund­sätz­lich zwischen folgenden drei Varianten des Fuzzings:

Ap­pli­ca­ti­on-Fuzzing

Bei diesem Fuzz-Testing-Ansatz werden Funk­tio­nen wie Schalt­flä­chen und Ein­ga­be­fel­der gra­fi­scher Programme oder Optionen von Kom­man­do­zei­len­pro­gram­men getestet. Dabei werden Funk­tio­nen bei­spiels­wei­se gezielt un­na­tür­lich häufig oder schnell auf­ge­ru­fen oder Ein­ga­be­fel­der mit zu großen Inhalten gefüllt.

Protocol-Fuzzing

Für den Austausch von Daten nutzt man Pro­to­kol­le, etwa das Hypertext Transfer Protocol (HTTP) im Web. Die über­tra­ge­nen Daten müssen in einem be­stimm­ten Format vorliegen. Protocol Fuzzing dient dazu, das Verhalten beim Versenden falsch for­ma­tier­ter Inhalte zu über­prü­fen. Ins­be­son­de­re ist dabei wichtig, dass die über­sand­ten Inhalte nicht ver­se­hent­lich als Befehle in­ter­pre­tiert und dann auf einem Server aus­ge­führt werden.

File-Format-Fuzzing

Fuzzing-Tools, die den Ansatz des File-Format-Fuzzings verfolgen, erzeugen feh­ler­haf­te Dateien und lassen diese im Anschluss von der zu testenden Software ver­ar­bei­ten. Dateien haben üb­li­cher­wei­se ein genormtes Format wie .jpg für Bild­da­tei­en, damit sie unter ver­schie­de­nen An­wen­dun­gen aus­ge­tauscht werden können. Ent­spricht die geöffnete Datei nicht dem er­war­te­ten Format, kann das zu Problemen führen. In einer fort­ge­schrit­te­nen Version lassen sich auch im­ple­men­tier­te Funk­tio­nen testen, z. B. Kom­pres­si­ons­ver­fah­ren für Vi­deo­da­tei­en.

Wie funk­tio­niert Fuzzing im Detail?

Es ist sehr aufwendig, die Funk­ti­ons­wei­se einer Software nach­zu­ver­fol­gen. Oft besteht sie aus mehreren Tausend Zeilen Quellcode in einer Pro­gram­mier­spra­che. Ver­zwei­gun­gen und ein­ge­bun­de­ne Funk­tio­nen machen sie un­über­sicht­lich. Zudem muss der Quellcode nach dem Kom­pi­lie­ren zu­rück­er­stellt (de­kom­pi­liert) werden, was nicht immer möglich ist.

Fuzzing verfolgt daher einen anderen Ansatz: Es generiert alle er­denk­li­chen Zu­falls­da­ten einer vor­ge­ge­be­nen Art. So sollen möglichst viele Ein­ga­be­va­ri­an­ten abgedeckt werden. Fuzzing stellt dabei die Schnitt­stel­le zur au­to­ma­ti­sier­ten Eingabe dar. Dies kann auf un­ter­schied­li­chen Ebenen passieren. Im Rahmen des Ap­pli­ca­ti­on-Fuzzing werden bei­spiels­wei­se un­ter­schied­li­che Da­ten­ty­pen imitiert und an eine Software wei­ter­ge­ge­ben. Auch mögliche Längen und Da­ten­for­ma­te der Eingaben können getestet werden. Beim Protocol-Fuzzing kommen selbst­er­stell­te Da­ten­pa­ke­te zum Einsatz. Eine weitere Mög­lich­keit besteht darin, Inhalte ab­zu­fan­gen, zu ma­ni­pu­lie­ren und zu­rück­zu­sen­den. Das File-Format-Fuzzing funk­tio­niert mit zufällig ge­ne­rier­ten Test­da­tei­en. Zu testende Faktoren sind bei­spiels­wei­se die Größe, die Struktur oder gesetzte Marker (Flags).

An­wen­dungs­ge­bie­te von Fuzz-Testing

Vor­ran­gi­ges Ein­satz­ge­biet von Fuzzing ist die Qua­li­täts­si­che­rung in der Software-Ent­wick­lung. Aufgrund des hohen Au­to­ma­ti­sie­rungs­grads ist es möglich, Software re­gel­mä­ßig in einer vor­be­rei­te­ten Test­um­ge­bung zu prüfen. Diese lässt sich bei agiler Ent­wick­lung in bereits vor­han­de­ne Abläufe in­te­grie­ren. Aber auch bereits ver­öf­fent­lich­te Software kann im Rahmen eines Si­cher­heits­au­dits getestet werden, etwa um die Eignung für si­cher­heits­re­le­van­te Zwecke fest­zu­stel­len.

Natürlich kann Fuzzing auch bei der Ent­de­ckung von Exploits helfen. Al­ler­dings lassen sich nur An­halts­punk­te über Fehler in Pro­gramm­funk­tio­nen finden, da Fuzzing-Tools letztlich keinen Zugriff auf die internen Struk­tu­ren der un­ter­such­ten Software haben.

Vor- und Nachteile von Fuzzing im ta­bel­la­ri­schen Überblick

Vorteile von Fuzzing Nachteile von Fuzzing
Mög­lich­keit, durch vor­be­rei­te­te Tests einen ein­heit­li­chen Qua­li­täts­stan­dard zu ge­währ­leis­ten Teils kom­pli­zier­te Hand­ha­bung von Software
Stärkung der Software-Sta­bi­li­tät Zu­sätz­li­cher Ar­beits­auf­wand
Ver­bes­se­rung der Si­cher­heit Fehlende Ein­gren­zung von Ursachen bei der Fest­stel­lung von Fehlern
Ver­füg­bar­keit von kos­ten­lo­sen eta­blier­ten Tools Miss­brauchs­mög­lich­keit durch Ent­wick­ler von Schad­soft­ware

Die besten Fuzzing-Tools im Überblick

Es gibt eine Vielzahl an kos­ten­frei­en und kos­ten­pflich­ti­gen Fuzzing-Tools mit un­ter­schied­li­chem Funk­ti­ons­um­fang auf dem Markt. Hier eine kleine Übersicht:

  • American Fuzz Lop: Kann den Quellcode selbst­stän­dig kom­pi­lie­ren 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 Bi­blio­thek zur Erzeugung von Ein­ga­be­da­ten, mit deren Hilfe An­wen­dun­gen (pro­to­koll­ori­en­tiert) getestet werden können.
  • LibFuzzer: Bi­blio­thek, die Teil der Compiler-In­fra­struk­tur LLVM ist.
  • Clust­er­Fuzz: Test­um­ge­bung, die ur­sprüng­lich von Google zum Testen des Browsers Chrome ent­wi­ckelt wurde.
  • Sulley: Bietet eine Sammlung von Tools in der Script­spra­che Python; ins­be­son­de­re für einfache Testfälle wie das Ge­ne­rie­ren von Zu­falls­da­ten geeignet.
  • Peach: Stark au­to­ma­ti­sier­te Lösung für das Fuzz-Testing von Hard- und Software.
  • Power­fuz­zer: Bietet ver­schie­de­ne An­griffs­sze­na­ri­en wie SQL-In­jec­tions; die Bedienung erfolgt über eine web­ba­sier­te grafische Be­nut­zer­ober­flä­che.
Fuzz-Testing-Tool Ent­wick­ler Lizenz Kategorie Be­son­der­hei­ten
American Fuzz Lop (AFL) Michael Zalewski Open Source Ap­pli­ca­ti­on Grey-Box-Ansatz
Fuzzino Fraun­ho­fer Institut Open Source Protocol Geeignet für spezielle Testfälle
LibFuzzer LLVM Team Open Source Ap­pli­ca­ti­on In­te­griert in Compiler
Clust­er­Fuzz Google Open Source Ap­pli­ca­ti­on In­te­griert Tools wie AFL
Sulley OpenRCE Open Source Protocol File, einfache In­te­grier­bar­keit
Peach Peachtech Kom­mer­zi­ell Ap­pli­ca­ti­on Starke Au­to­ma­ti­sie­rung
Power­fuz­zer Marcin Kozlowski Open Source Ap­pli­ca­ti­on In­te­griert in KALI-Linux

Mögliche Al­ter­na­ti­ven zu Fuzz-Testing

Je nach An­wen­dungs­zweck gibt es Al­ter­na­ti­ven zum Fuzz-Testing, die einen anderen Ansatz verfolgen und andere Er­geb­nis­se liefern. Die wich­tigs­ten haben wir im Folgenden in Kurzform für Sie zu­sam­men­ge­fasst.

Reverse En­gi­nee­ring

Für Si­cher­heits­for­scher gehört das Reverse En­gi­nee­ring zu den Stan­dard­werk­zeu­gen. Gemeint ist die Un­ter­su­chung nach dem De­kom­pi­lie­ren (Rück­über­set­zung in Pro­gram­mier­spra­chen) oder nach dem Dis­as­sem­blie­ren (Über­set­zung in die ma­schi­nen­na­he Sprache Assembler). Es handelt sich um einen sehr auf­wen­di­gen und feh­ler­an­fäl­li­gen Prozess. Dafür können im Er­folgs­fall sämtliche Details zur Pro­gramm­funk­tio­na­li­tät fest­ge­stellt werden.

Debugging

Beim Debugging handelt es sich um einen Feh­ler­such­pro­zess im Rahmen der Software-Ent­wick­lung. Programme werden vor der Fer­tig­stel­lung in der Ent­wick­lungs­um­ge­bung temporär aus­ge­führt. Der Ent­wick­ler kann Un­ter­bre­chungs­punk­te setzen (Break­points), an denen das Programm stoppt. Dort kann er Inhalte von ver­wen­de­ten Variablen auslesen und auf ihre Rich­tig­keit über­prü­fen. Debugging kommt auch im Rahmen des Reverse En­gi­nee­ring zum Einsatz.

Mo­dul­tests

Komplexe Software wird oft modular erstellt. Hier hat es sich etabliert, einzelne Kom­po­nen­ten bereits im Rahmen so­ge­nann­ter Mo­dul­tests in ent­spre­chen­den Test­um­ge­bun­gen zu über­prü­fen.

Fazit

Fehler und Si­cher­heits­lü­cken in Software sind meist mit einem Ansehens- und Ver­trau­ens­ver­lust der Ent­wick­ler verbunden. Völlige Feh­ler­frei­heit ist utopisch, was auch den meisten Anwendern von Pro­gram­men klar sein dürfte. Der Ent­wick­ler hat mit Fuzzing al­ler­dings eine po­ten­zi­el­le Lösung parat, um Fehler zu finden, bevor diese von Dritten gemeldet werden. In jedem Fall ist die Methode ein Gewinn für Sta­bi­li­tät und Si­cher­heit der Software. Gute Gründe also, Fuzz Testing in die eigene Qua­li­täts­si­che­rung zu in­te­grie­ren.

Zum Hauptmenü