Fuzzing – Angriff ist die beste Verteidigung
Seite 3: Erkennungsmechanismen
Fuzzer erkennen vornehmlich Stellen im Quellcode, die zum Absturz eines Programms führen können. Um auch Bugs zu entdecken, die nicht zum Absturz führen, benötigen Tester zusätzliche Erkennungsmechanismen. Die bekannteste Methode für C/C++ sind die Sanitizer von Google, die Laufzeit-Checks während der Kompilierung des Codes ausführen, um den Zustand des Programms während der Laufzeit zu beobachten. Wenn ein Fehler identifiziert ist, generieren sie hilfreiche Debug-Informationen, die Benutzern helfen, den Bug zu analysieren und schnell zu verstehen. Für C/C++ gibt es zahlreiche Sanitizer, die ein breites Spektrum von Bugs wie Speicherverletzungen und Race Conditions identifizieren.
Die Vorteile einer smarten und hochautomatisierten Software-Testing-Methode sind Schnelligkeit, breite und aussagekräftige Testabdeckung (Code-Coverage) und kontinuierliche Verbesserung der Resultate. Damit ist Fuzzing im besonderen Maße für die agile Softwareentwicklung prädestiniert. Konkret erlaubt die effektive Einbindung von Fuzzing, kontinuierlich Bugs und Sicherheitslücken früh im Entwicklungsprozess zu finden und damit sicherere und stabile Software zu produzieren.
Während man statische Tests grundsätzlich jederzeit im Softwareentwicklungsprozess ausführen kann, ist Fuzzing nur einsetzbar, wenn zumindest eine ausführbare Software vorliegt. Idealerweise sollten Entwickler den Softwarecode möglichst während des ganzen Entwicklungsprozesses und wiederkehrend testen (vgl. Test-Driven Development und Self-Testing Code). Ziel ist es, Ressourcen so effizient wie möglich einzusetzen und unnötigen Aufwand bei der Auslieferung von Software zu vermeiden. Eine frühe Integration in den Entwicklungsprozess (Stichwort "Shift-left" bzw. "DevSecOps") hilft, die aktuellen und zukünftigen Herausforderungen im Bereich Softwareentwicklung zu bewältigen.
Durch die Möglichkeit, Fuzzing bei Continuous-Integration-Prozessen einzusetzen, können Anwender regelmäßiges Testen weitgehend automatisieren. Dabei übernimmt ein CI-Server die Aufgabe, nach jeder Änderung des Codes diesen zu kompilieren und die vorgesehenen Tests inklusive Fuzz-Tests auszuführen. Die Fuzz-Engines, die die Test-Inputs generieren, sind auf sogenannte Fuzz-Targets (z.B. öffentliche APIs) ausgerichtet. Im Rahmen des Testdurchlaufs liefert der instrumentierte Code unmittelbares Feedback, sobald ein Fehler auftritt. Der nächste Durchlauf liefert spezifischere Informationen zu tieferliegenden Fehlerursachen. Erfreulicherweise hemmen die Abläufe das Durchlaufen der Continuous-Integration-Pipeline nicht, sondern erfolgen gänzlich unbemerkt im Hintergrund.
Neben dem sinnvollen und streng ergebnisorientierten Einsatz bestimmter Tools hängt der Erfolg des Software-Testings und der damit verbundenen Entwicklung sicherer und stabiler Software vor allem von den Softwareentwicklungs-Teams und deren Mitgliedern ab. Geeignete Mitglieder der Entwicklungsteams sollten zu "Security Champions" ausgebildet werden. Als solche lernen sie, Fuzzing im Sinne des Projektziels durchzuführen, zu betreuen und zu promoten. Als überzeugte Fuzz-Tester können sie die Testmethode aus den Blackbox-Tests während der Pentests direkt in den Entwicklungsprozess integrieren und im besten Fall die zukünftige "Fuzz-driven Development"-Strategie etablieren. Aufbauend auf dem Prinzip der testfokussierten
Softwareentwicklung bietet Fuzzing eine der momentan am besten geeigneten automatisierten Testmethoden und eröffnet einen Produktivitäts- und Qualitätsvorsprung. Dass Fuzzing die Zukunft im Bereich Test-driven Development darstellt, beweisen anschaulich die Betreiber der mit Abstand größten und beliebtesten Suchmaschine der Welt.