2495351

Fuzzing: In der Software-Entwicklung effizient und sicher testen

24.03.2020 | 10:17 Uhr | Sergej Dechand

Steigende Komplexität moderner Software und immer beliebter werdende agile Software-Entwicklungsmethoden erfordern effektivere und automatisierte Testing-Methoden.

Unternehmen, die Software entwickeln, betreiben einen hohen monetären und zeitlichen Aufwand, um die Sicherheit und Stabilität ihrer Releases zu verbessern. Je früher daher ein Bug in einem Software-Entwicklungsprozess gefunden wird, desto einfacher und günstiger ist es, diesen zu beheben.

Neben statischen Codeanalysen, die viele False Positives ausgeben (vermeintliche Fehler, die gar keine Probleme sind), wird viel auf manuelles Testing gesetzt (funktionale Abnahmetests und Penetrationstests). Dies ist nicht nur teuer, sondern verzögert auch die Release-Zyklen erheblich und steht damit im Konflikt mit den agilen Entwicklungsmethoden.

In den letzten Jahren hat sich modernes Fuzzing als eine sehr effektive und effiziente Testing-Methode etabliert. In Kombination mit modernen Bug-Erkennungsmechanismen hat es den Vorteil, fast keine False Positives zu produzieren.

Fuzzing wird sehr erfolgreich eingesetzt, um kritische Schwachstellen in verschiedenartiger Software zu finden. Google oder Microsoft nutzen diese Technik schon für automatisierte Tests ihrer Software. Mit der Hilfe von OSS-Fuzz wurden beispielsweise über 16.000 Bugs in Google Chrome und 11.000 Bugs in Open-Source-Projekten gefunden. 2019 hat man mit Fuzzing mehr Fehler bei Google gefunden als mit irgendeiner anderen Technologie. Dies zeigt, dass Feedback-basiertes Fuzzing (oft auch Coverage-based Fuzzing genannt) eine sehr effektive Technik für das Finden von Softwarefehlern ist.

Allerdings war Fuzz-Testing bisher sehr komplex und benötigte viel Expertenwissen für einen effektiven Einsatz. Aus diesem Grund  wird es - abgesehen von den großen Technologie-Unternehmen - noch nicht oft genutzt.

Eine neue Generation einer automatisierten Testing-Plattform, die auf Benutzbarkeit und Kosteneffektivität setzt, soll es jetzt jedem Unternehmen ermöglichen, moderne Fuzzing-Technologien in den Entwicklungsprozess zu integrieren. So können Unternehmen kosteneffektiv die Qualität ihrer Software verbessern und die Bugs früh beheben.

Modern Fuzzing – die Technologie hinter der aktuell effektivsten Software-Testing-Methode

Fuzzing gibt es schon seit den späten 80er Jahren. Ursprünglich war die Idee, Konsolenprogramme mit zufälligen Eingaben zu starten. Genauer gesagt startet ein Fuzzer ein Programm, übergibt eine zufällig generierte Eingabe und überwacht, ob das Programm abstürzt. Dies wird beliebig oft wiederholt.

Schon bei diesem Ansatz gibt es einen großen Vorteil (gegenüber beispielsweise statischen Ansätzen): Nachvollziehbarkeit. Wenn das Programm bei einer Eingabe abstürzt, kann dieser Fehler untersucht werden, indem der Entwickler das Programm in einem Debugger mit genau der gleichen Eingabe ein zweites Mal ausführt.

Basierend darauf gibt es mehrere Verbesserungen. Zum einen wird das zu testende Programm mit bestimmten Markern instrumentiert, die der Fuzzing-Engine zurückmelden, welchen Pfad im Programm eine bestimmte Eingabe genommen hat. Aus dieser Information kann die Fuzzing-Engine dann neue Eingaben generieren, die möglichst viele Pfade im Programm abdecken.

Dies ist die Innovation des 2015 herausgegebenen Fuzzers AFL (american fuzzy lop). Seitdem wurden Fuzzing-Technologien sehr aktiv weiterentwickelt und es werden enorme Fortschritte gemacht.

Die zweite Verbesserung sind neuere Erkennungsmechanismen für Bugs und Sicherheitslücken wie Sanitizer. Das sind Modifikationen des Programms, die mehr Fehler finden als nur Abstürze. Beispielsweise kann der Address Sanitizer für C und C++ Speicherverletzungen finden, die ohne Sanitizer nicht zum Absturz führen würden. Viele kritische Fehler können ausgenutzt werden, ohne das Programm zum Absturz zu bringen.

Code Intelligence beispielsweise entwickelt Fuzzing-Technologien, die sich einfach und effektiv in industrielle Anwendungsfälle integrieren lassen. Aktuelle OSS-Lösungen, entwickelt für Sicherheits- und Fuzzing-Experten, in das Tooling und in Entwicklungsprozesse zu integrieren ist mit viel manueller Arbeit und Expertise verbunden. Dies ist der Hauptgrund warum Fuzzing noch nicht in der Industrie angekommen ist. Lösungen wie Structure-aware Fuzzing, Stateful Fuzzing, die Unterstützung von gängigen Industrieprotokollen, helfen, Bugs tief in der Businesslogik komplexer Software zu erkennen. Außerdem wird die Analyse von gefundenen Bugs durch ein Debugging Interface sehr vereinfacht.

Einen wichtigen Schritt weiter ist man bei Code Intelligence im Bereich Java und dem Testen von Webapplikationen, wo man nun eine Reihe von Frameworks wie Spring Boot mit nur wenigen Klicks testen kann.

Branchen/Bereiche, die besonders von Fuzzing profitieren können

Je umfangreicher und komplexer eine Software ist, desto sinnvoller ist die Integration eines möglichst hohen und zuverlässigen Automatisierungsfaktors im Testing-Bereich. Diese Aussage gilt also erst einmal branchen- und anwendungsübergreifend.

Nichtsdestotrotz bietet sich diese Methode auch gerade für sicherheitskritische Bereiche wie Automotive, Aerospace, KRITIS, IoT, Banking, Cloud, Logistik und Industrie 4.0 an.

IoT-fähige Geräte beispielsweise verbreiten sich sowohl im privaten als auch im unternehmerischen Umfeld rasend schnell. Dass mit diesen Geräten sowohl private wie auch geschäftliche Daten und je nach Gerät auch Leib und Leben gefährdet sein können, darf nicht übersehen werden. Die Margen bei IoT-Geräten sind sehr klein und aus finanziellen Gründen werden Qualität und Sicherheit des Codes oft vernachlässigt. Entsprechend kann das Sicherheitsniveau in vielen Fällen nur als ungenügend bezeichnet werden.

Testing muss aus diesem Grund zu einem viel höheren Grad automatisiert werden, damit man es kosteneffektiv einsetzen und damit einen effizienten Entwicklungsprozess gestalten kann.

Mit Fuzzing die Testeffizienz und Sicherheit steigern

Die spezifischen Vorteile von Fuzzing – zügige und sehr zuverlässige Ergebnisse, eine sich stetig verbessernde Testabdeckung und die Feedback-basierte Vorgehensweise – decken sich geradezu vorbildlich mit der effizienten Softwareentwicklung. Die kontinuierliche Fehlersuche sorgt dafür, dass die im Fokus stehende Kundenzufriedenheit und die schnelle Entwicklung nicht durch Bugs und Sicherheitslücken zunichte gemacht wird. Bugs werden jetzt früh im Entwicklungsprozess automatisch gefunden und können kosteneffektiv gefixt werden.

Automatisches Fuzzing sollte zum Standard in jedem Entwicklungsprozess werden. Mit geringem Aufwand können so sehr komplexe Bugs automatisiert und früh im Entwicklungszyklus entdeckt und beseitigt werden. Das schont die Nerven der Entwickler, spart den Unternehmen Geld und hilft, zuverlässige und sichere Software zu produzieren.

PC-WELT Marktplatz

2495351