
Abdeckungsbasierter Fuzzer für Python-Anwendungen
pip3 install frelatage
Der Python Fuzzer, den die Welt verdient
Installation | Funktionsweise | Funktionen | Verwendung von Frelatage | Konfiguration
Frelatage ist eine abdeckungsbasierte Python-Fuzzing-Bibliothek, mit der Python-Code gefuzzt werden kann. Die Entwicklung von Frelatage wurde durch verschiedene andere Fuzzer inspiriert, darunter AFL/AFL++, Atheris und PythonFuzz. Der Hauptzweck des Projekts ist es, die besten Eigenschaften dieser Fuzzer zu nutzen und sie in einem neuen Werkzeug zu vereinen, um Python-Anwendungen effizient zu fuzzen.
HAFTUNGSAUSSCHLUSS : Dieses Projekt befindet sich im Alpha-Stadium und kann noch viele unerwartete Verhaltensweisen verursachen. Frelatage sollte derzeit nicht in einer Produktionsumgebung eingesetzt werden.
pip3 install frelatage
Für Entwickler empfohlen. Klont automatisch den Hauptbranch aus dem Frelatage-Repository und installiert aus dem Quellcode.
# Das Frelatage-Repository automatisch klonen und Frelatage aus dem Quellcode installieren
bash <(wget -q https://raw.githubusercontent.com/Rog3rSm1th/Frelatage/main/scripts/autoinstall.sh -O -)
Die Idee hinter dem Design von Frelatage ist die Verwendung eines genetischen Algorithmus, um Mutationen zu erzeugen, die so viel Code wie möglich abdecken. Die Funktionsweise eines Fuzzing-Zyklus kann grob mit diesem Diagramm dargestellt werden:
graph TB
m1(Mutation 1) --> |input| function(Gefuzzte Funktion)
m2(Mutation 2) --> |input| function(Gefuzzte Funktion)
mplus(Mutation ...) --> |input| function(Gefuzzte Funktion)
mn(Mutation n) --> |input| function(Gefuzzte Funktion)
function --> generate_reports(Berichte erstellen)
generate_reports --> rank_reports(Berichte bewerten)
rank_reports --> select(Die n besten Berichte auswählen)
select --> |mutate| nm1(Mutation 1) & nm2(Mutation 2) & nmplus(Mutation ...) & nmn(Mutation n)
subgraph Zyklusmutationen
direction LR
m1
m2
mplus
mn
end
subgraph Mutationen des nächsten Zyklus
direction LR
nm1
nm2
nmplus
nmn
end
style function fill:#5388e8,stroke:white,stroke-width:4px
Frelatage ermöglicht es, eine Funktion zu fuzzen, indem eine Datei als Eingabe übergeben wird.
import frelatage
import my_vulnerable_library
def MyFunctionFuzz(data):
my_vulnerable_library.parse(data)
input = frelatage.Input(value="initial_value")
f = frelatage.Fuzzer(MyFunctionFuzz, [[input]])
f.fuzz()
Frelatage bietet die Möglichkeit, Eingabeparameter vom Typ Datei zu fuzzen. Um den Wert dieser Dateien zu initialisieren, müssen Sie Dateien im Eingabeordner (standardmäßig ./in) erstellen.
Wenn wir den Wert einer Datei initialisieren möchten, die zum Fuzzen verwendet wird, können wir das so tun:
echo "initial value" > ./in/input.txt
Und dann den Fuzzer ausführen:
import frelatage
import my_vulnerable_library
def MyFunctionFuzz(data):
my_vulnerable_library.load_file(data)
input = frelatage.Input(file=True, value="input.txt")
f = frelatage.Fuzzer(MyFunctionFuzz, [[input]])
f.fuzz()
import frelatage
import my_vulnerable_library
input = frelatage.Input(file=True, value="input.txt")
@frelatage.instrument([[input]])
def MyFunctionFuzz_1(data):
my_vulnerable_library.load_file(data)
@frelatage.instrument([[input]])
def MyFunctionFuzz_1(data):
my_vulnerable_library.load_file_but_different(data)
# Und so weiter
# Es werden die instrumentierten Methoden nacheinander gefuzzt
frelatage.Fuzzer.fuzz_all()
Wenn Sie mehrere Dateien auf einmal in einen Korpus laden müssen (nützlich, wenn Sie einen großen Korpus verwenden), können Sie die integrierte Funktion von Frelatage load_corpus verwenden. Diese Funktion gibt eine Liste von Eingaben zurück.
load_corpus(directory: str, file_extensions: list) -> list[Input]
./, ./images["jpeg", "gif"], ["pdf"]import frelatage
import my_vulnerable_library
def MyFunctionFuzz(data):
my_vulnerable_library.load_file(data)
my_vulnerable_library.load_file(data2)
# Lade jede Datei im Verzeichnis ./in
corpus_1 = frelatage.load_corpus(directory="./")
# Lade jede .gif/.jpeg-Datei im Unterverzeichnis ./in/images
corpus_2 = frelatage.load_corpus(directory="./images", file_extension=["gif", "jpeg"])
f = frelatage.Fuzzer(MyFunctionFuzz, [corpus_1, corpus_2])
f.fuzz()
Sie können eines oder mehrere Wörterbücher, die sich hier befinden, in das für Wörterbücher vorgesehene Verzeichnis (./dict standardmäßig) kopieren.
Differenzielles Fuzzing ist eine beliebte Softwaretesttechnik, die versucht, Fehler zu erkennen, indem sie dieselbe Eingabe an mehrere Bibliotheken/Programme übergibt und Unterschiede in ihrem Verhalten beobachtet. Ein Beispiel für die Verwendung von differenziellem Fuzzing mit Frelatage mit den Bibliotheken json und ujson finden Sie hier.
Weitere Beispiele für Fuzzer und Korpus finden Sie im Beispielverzeichnis.