Fuzzing – Angriff ist die beste Verteidigung

Seite 2: Smart Fuzzing

Inhaltsverzeichnis

Klassisches Fuzzing versorgt laufende Anwendungen automatisiert mit zufälligen, unerwarteten und bewusst unvollständigen oder fehlerhaften Eingaben. Es ermöglicht Entwicklern somit, umfassende Rückschlüsse auf die Testabdeckung und gegebenenfalls auf die Stabilität der Software zu ziehen.

Gute Fehlererkennungsmechanismen können das Vorhandensein von Fehlern oder sogar Sicherheitslücken aufzeigen. Smart Fuzzing zeichnet sich zusätzlich dadurch aus, dass es die notwendigen Eingabestrukturen oder Grammatiken der zu testenden Software versteht und Inputs vermeidet, die dem Strukturformat nicht entsprechen. Das erlaubt es, sich auf valide Inputs zu konzentrieren und dadurch eine effizientere Überprüfung von Sicherheit und Stabilität der Software zu gewährleisten. Ein "intelligenteres" Fuzzing (z.B. feedback-based Fuzzing) kann unter Zuhilfenahme von Instrumentierung kontinuierlich dazulernen, indem während der Ausführung Feedback, zum Beispiel der genaue Ausführungspfad oder Zahl- und Stringvergleiche an die Fuzzing Engine gegeben werden. Das dringt wesentlich tiefer in den Quellcode vor (höhere Abdeckung) und erleichtert es, potenzielle Fehler und Sicherheitslücken finden.

Feedback-basiertes Fuzzing (oft auch instrumented oder coverage-based Fuzzing genannt) erhält durch die Instrumentierung für jeden einzelnen Input detaillierte Informationen über die Codeabschnitte, die der Input erreicht. Die Instrumentierung kann man sich so vorstellen, dass sie Marker in den Code einsetzt, die ein Feedback an die Fuzzing-Engine geben, was genau im Programm passiert.

AFL (der prominenteste feedback-basierte Fuzzer im Penetration-Testing) hat den einfachen Trick angewandt, durch die Instrumentierung Informationen darüber zu sammeln, welcher Pfad bei jeder Eingabe durchlaufen wurde. Somit ist er in der Lage, die Eingaben zu identifizieren, die bei einer Mutation neue Pfade entdeckt haben. Der Fuzzing-Prozess startet mit einer initialen Datenbank von Eingabedaten, mutiert sie musterbasiert und zufällig, bis er Eingaben findet, die neue Pfade entdecken. Diese Parameter nimmt die Eingabedatenbank auf, sodass daraus wieder neue Mutationen entstehen. Weitere Forks von AFL und Tools wie libFuzzer verbessern die Instrumentierung soweit, dass Entwickler sie auch dafür nutzen, Zeichenketten oder Zahlenvergleiche auf dem Ausführungspfad an die Mutations-Engine zu übergeben, wodurch man schneller neue Pfade findet.

Diese Feedbackschleife ermöglicht dem Fuzzer, die Struktur der Eingaben automatisch “zu lernen” um damit mehr Codeabdeckung zu erreichen und letztendlich Bugs zu triggern. Diese Art von Fuzzing bietet somit nachvollziehbare Vorteile gegenüber dem vergleichsweise "dummen" Fuzzing von früher.