
Fuzzer basé sur la couverture pour applications Python
pip3 install frelatage
Le fuzzer Python que le monde mérite
Installation | Fonctionnement | Fonctionnalités | Utiliser Frelatage | Configuration
Frelatage est une bibliothèque de fuzzing Python basée sur la couverture qui peut être utilisée pour fuzzer du code Python. Le développement de Frelatage a été inspiré par divers autres fuzzers, notamment AFL/AFL++, Atheris et PythonFuzz. L'objectif principal du projet est de tirer parti des meilleures fonctionnalités de ces fuzzers et de les rassembler dans un nouvel outil afin de fuzzer efficacement les applications Python.
AVERTISSEMENT : Ce projet est au stade alpha et peut encore provoquer de nombreux comportements inattendus. Frelatage ne doit pas être utilisé dans un environnement de production pour le moment.
pip3 install frelatage
Recommandé pour les développeurs. Clone automatiquement la branche principale du dépôt frelatage et installe à partir des sources.
# Clone automatiquement le dépôt Frelatage et installe Frelatage depuis les sources
bash <(wget -q https://raw.githubusercontent.com/Rog3rSm1th/Frelatage/main/scripts/autoinstall.sh -O -)
L'idée derrière la conception de Frelatage est l'utilisation d'un algorithme génétique pour générer des mutations qui couvriront le plus de code possible. Le fonctionnement d'un cycle de fuzzing peut être résumé approximativement par ce diagramme :
graph TB
m1(Mutation 1) --> |input| function(Fonction fuzzée)
m2(Mutation 2) --> |input| function(Fonction fuzzée)
mplus(Mutation ...) --> |input| function(Fonction fuzzée)
mn(Mutation n) --> |input| function(Fonction fuzzée)
function --> generate_reports(Générer des rapports)
generate_reports --> rank_reports(Classer les rapports)
rank_reports --> select(Sélectionner les n meilleurs rapports)
select --> |mutate| nm1(Mutation 1) & nm2(Mutation 2) & nmplus(Mutation ...) & nmn(Mutation n)
subgraph Cycle mutations
direction LR
m1
m2
mplus
mn
end
subgraph Mutations du cycle suivant
direction LR
nm1
nm2
nmplus
nmn
end
style function fill:#5388e8,stroke:white,stroke-width:4px
Frelatage permet de fuzzer une fonction en passant un fichier en entrée.
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 vous offre la possibilité de fuzzer des paramètres d'entrée de type fichier. Pour initialiser la valeur de ces fichiers, vous devez créer des fichiers dans le dossier d'entrée (./in par défaut).
Si nous voulons initialiser la valeur d'un fichier utilisé pour le fuzzing, nous pouvons le faire ainsi :
echo "initial value" > ./in/input.txt
Et ensuite exécuter le fuzzer :
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)
# Et ainsi de suite
# Il fuzzera les méthodes instrumentées les unes après les autres
frelatage.Fuzzer.fuzz_all()
Si vous avez besoin de charger plusieurs fichiers dans un corpus en une seule fois (utile si vous utilisez un gros corpus), vous pouvez utiliser la fonction intégrée de Frelatage load_corpus. Cette fonction retourne une liste d'entrées (inputs).
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)
# Charge tous les fichiers du répertoire ./in
corpus_1 = frelatage.load_corpus(directory="./")
# Charge tous les fichiers .gif/.jpeg du sous-répertoire ./in/images
corpus_2 = frelatage.load_corpus(directory="./images", file_extension=["gif", "jpeg"])
f = frelatage.Fuzzer(MyFunctionFuzz, [corpus_1, corpus_2])
f.fuzz()
Vous pouvez copier un ou plusieurs dictionnaires situés ici dans le répertoire dédié aux dictionnaires (./dict par défaut).
Le fuzzing différentiel est une technique de test logiciel populaire qui tente de détecter des bogues en fournissant la même entrée à plusieurs bibliothèques/programmes et en observant les différences dans leurs comportements. Vous trouverez un exemple ici d'une utilisation du fuzzing différentiel avec Frelatage avec les bibliothèques json et ujson.
Vous pouvez trouver plus d'exemples de fuzzers et de corpus dans le répertoire des exemples.