
Fuzzer basado en cobertura para aplicaciones Python
pip3 install frelatage
El fuzzer de Python que el mundo merece
Instalación | Cómo funciona | Características | Usar Frelatage | Configuración
Frelatage es una librería de fuzzing para Python basada en cobertura que puede ser usada para fuzzear código Python. El desarrollo de Frelatage se inspiró en varios otros fuzzers, incluyendo AFL/AFL++, Atheris y PythonFuzz. El propósito principal del proyecto es aprovechar las mejores características de estos fuzzers y reunirlas en una nueva herramienta para fuzzear aplicaciones Python de manera eficiente.
AVISO: Este proyecto está en fase alfa y aún puede causar muchos comportamientos inesperados. Frelatage no debe ser utilizado en un entorno de producción en este momento.
pip3 install frelatage
Recomendado para desarrolladores. Clona automáticamente la rama principal del repositorio de frelatage e instala desde el código fuente.
# Clona automáticamente el repositorio de Frelatage e instala Frelatage desde el código fuente
bash <(wget -q https://raw.githubusercontent.com/Rog3rSm1th/Frelatage/main/scripts/autoinstall.sh -O -)
La idea detrás del diseño de Frelatage es el uso de un algoritmo genético para generar mutaciones que cubran la mayor cantidad de código posible. El funcionamiento de un ciclo de fuzzing se puede resumir aproximadamente con este diagrama:
graph TB
m1(Mutación 1) --> |input| function(Función fuzzeada)
m2(Mutación 2) --> |input| function(Función fuzzeada)
mplus(Mutación ...) --> |input| function(Función fuzzeada)
mn(Mutación n) --> |input| function(Función fuzzeada)
function --> generate_reports(Generar reportes)
generate_reports --> rank_reports(Clasificar reportes)
rank_reports --> select(Seleccionar n mejores reportes)
select --> |mutate| nm1(Mutación 1) & nm2(Mutación 2) & nmplus(Mutación ...) & nmn(Mutación n)
subgraph Mutaciones del ciclo
direction LR
m1
m2
mplus
mn
end
subgraph Mutaciones del siguiente ciclo
direction LR
nm1
nm2
nmplus
nmn
end
style function fill:#5388e8,stroke:white,stroke-width:4px
Frelatage permite fuzzear una función pasando un archivo como entrada.
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 te ofrece la posibilidad de fuzzear parámetros de entrada de tipo archivo. Para inicializar el valor de estos archivos, debes crear archivos en la carpeta de entrada (./in por defecto).
Si queremos inicializar el valor de un archivo usado para fuzzear, podemos hacerlo así:
echo "initial value" > ./in/input.txt
Y luego ejecutar el 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)
# Y así sucesivamente
# Fuzzeará los métodos instrumentados uno tras otro
frelatage.Fuzzer.fuzz_all()
Si necesitas cargar varios archivos en un corpus de una sola vez (útil si usas un corpus grande), puedes usar la función incorporada de Frelatage load_corpus. Esta función devuelve una lista de entradas.
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)
# Carga todos los archivos en el directorio ./in
corpus_1 = frelatage.load_corpus(directory="./")
# Carga todos los archivos .gif/.jpeg en el subdirectorio ./in/images
corpus_2 = frelatage.load_corpus(directory="./images", file_extension=["gif", "jpeg"])
f = frelatage.Fuzzer(MyFunctionFuzz, [corpus_1, corpus_2])
f.fuzz()
Puedes copiar uno o más diccionarios ubicados aquí en el directorio dedicado a los diccionarios (./dict por defecto).
El fuzzing diferencial es una técnica popular de prueba de software que intenta detectar errores proporcionando la misma entrada a múltiples librerías/programas y observando diferencias en sus comportamientos. Encontrarás un ejemplo aquí de un uso de fuzzing diferencial con Frelatage con las librerías json y ujson.
Puedes encontrar más ejemplos de fuzzers y corpus en el directorio de ejemplos.