Testing: Mit Jazzer erscheint ein Open-Source-Fuzzer für JVM-Anwendungen
Das vom deutschen Start-up Code Intelligence veröffentlichte Projekt nutzt Fuzzing zum Auffinden von Schwachstellen in Anwendungen uff dieser Java Virtual Machine.
Developer Von
- Rainald Menge-Sonnentag
Das deutsche Unternehmen Code Intelligence hat mit Jazzer ein Tool veröffentlicht, das das Fuzz-Testing von Anwendungen ermöglicht, die auf der Java Virtual Machine (JVM) laufen. Es baut auf libFuzzer auf, der im Rahmen der Compilerarchitektur LLVM verfügbar ist.
Fuzzer untersuchen anders als Tools zur statischen Codeanalyse nicht den Sourcecode, um Bugs und Schwachstellen aufzuspüren. Stattdessen füttern sie die zu testenden Anwendungen mit Eingabedaten, die zufällig oder bewusst unvollständig beziehungsweise fehlerhaft sind. Damit können die Fuzzer Fehler aufspüren, die unter anderem durchrutschen, wenn menschliche Tester lediglich plausible Daten an die APIs über- oder in Eingabefelder eingeben.
Ein bekannter Vertreter der Fuzz-Testing-Tools ist das 2016 von Google veröffentlichte OSS Fuzz, das die Grundlage zum Aufspüren von Schwachstellen für die vor Kurzem gestartete Datenbank Open Source Vulnerabilites ist. Code Intelligence ist ein deutsches Start-up, das sich auf Fuzzing spezialisiert hat.
Improvisationen im Free Jazz(er)
Jazzer führt den Bytecode innerhalb des Fuzzer-Prozeses aus, um eine möglichst hohe Performance zu erreichen. Er benötigt eine JVM-Klassse, die eine Methode enthält, über die der Fuzzer die Anwendung mit Eingaben füttert. Die Klasse muss entweder die Methode
public static boolean fuzzerTestOneInput(byte[] input)
für die Übergabe von Rohdaten als Byte-Array oder die folgende Methode:
public static boolean fuzzerTestOneInput(com.code_intelligence.api.FuzzedDataProvider data)
die die Eingabe über das Interface FuzzedDataProvider erhält, einbinden. Das Interface ermöglicht die Vorverarbeitung der Rohdaten.
Wenn die von Jazzer übergebenen Eingabedaten eine nicht abgefangene Exception oder eine fehlgeschlagene Assertion auslösen, erstellt das Tool neben einem Java-Stack-Trace zwei Dateien, die Informationen über die Eingabedaten und die verantwortliche Java-Klasse zum Reproduzieren des Problems enthalten.
Zum Besten von fortgeschrittener Jazzer
Wie das Vorbild libFuzzer ermöglicht Jazzer grundsätzlich paralleles Fuzzing. Allerdings verwaltet er derzeit alle Coverage-Informationen in einer globalen Variable, die sich alle Threads teilen. Das kann bei Multithreading-Anwendungen zu irreführenden Coverage-Daten führen.
Der Fuzzer kann auch native Libraries untersuchen, die JVM-Anwendungen beispielsweise über System.load() einbinden. Jazzer unterstützt dabei das Zusammenspiel mit dem Sanitizer-Werkzeug AddressSanitizer, das bei der Suche nach Speicherfehlern in C- und C++-Code hilft.
Weitere Details zu Jazzer lassen dem GitHub-Repository entnehmen. Zum Start ist das Tool nur für x64-Linux verfügbar. Entwicklerinnen und Entwickler können Jazzer mit dem Build-Tool Bazel erstellen. Jazzer nutzt Bazelisk, um Bazel automatisch herunterzuladen und zu installieren, sofern es noch nicht auf dem System vorhanden ist. Einen tieferen technischen Einblick bietet ein Beitrag im Code-Intelligence-Blog.
(rme)
Quelle: www.heise.de