v1.4 Copyright (C) 2020 Andrea Fioraldi [email protected]
Publicado bajo la licencia Apache v2.0
Este fuzzer experimental está diseñado para usarse para el fuzzing de API en memoria.
El diseño está muy inspirado y basado en AFL/AFL++.
ATM el mutador es bastante simple, solo las etapas de estrago y empalme de la AFL.
Probé solo los ejemplos bajo pruebas/, este es un proyecto WIP pero se sabe que funciona al menos en GNU/Linux x86_64 y Android x86_64.
Necesitas Frida >= 12.8.1 para ejecutar esto ( pip3 install -U frida
) y frida-tools para compilar el arnés.
La biblioteca fuzz
debe importarse a un arnés personalizado y luego compilarse con frida-compile
para generar el agente que frida-fuzzer
inyectará en la aplicación de destino.
La mayor parte de la lógica del fuzzer está en el agente.
Un arnés tiene el siguiente formato:
var fuzz = require("./fuzz");var TARGET_MODULE = "test_linux64";var TARGET_FUNCTION = DebugSymbol.fromName("target_func").address;;var RET_TYPE = "void";var ARGS_TYPES = ['pointer', ' int'];var func_handle = nueva Función Nativa(TARGET_FUNCTION, RET_TYPE, ARGS_TYPES, { trampas: 'todos' });fuzz.target_module = TARGET_MODULE;var payload_mem = Memory.alloc(fuzz.config.MAX_FILE);fuzz.fuzzer_test_one_input = function (/* Uint8Array */ payload) { Memory.writeByteArray(payload_mem , carga útil, carga útil.longitud); func_handle(payload_mem, payload.length);}
fuzz.fuzzer_test_one_input
es obligatorio. Si no especifica fuzz.target_module
, todo el código ejecutado será instrumentado.
También puede configurar fuzz.manual_loop_start = true
para indicarle al fuzzer que llamará fuzz.fuzzing_loop()
en una devolución de llamada y, por lo tanto, no debe llamarlo por usted (por ejemplo, para comenzar a realizar fuzzing cuando se hace clic en un botón en la aplicación de Android).
La devolución de llamada fuzz.init_callback
se puede configurar para ejecutar código cuando el fuzzer esté listo para comenzar. Consulte tests/test_java.js
para ver un ejemplo.
fuzz.dictionary
es un diccionario fuzzer clásico, una matriz en la que puede agregar elementos (los tipos aceptados son Array, ArrayBuffer, Uint8Array, String) que se usan como valores adicionales en el mutador. Consulte tests/test_libxml2.js
para ver un ejemplo.
frida-fuzzer
acepta los siguientes argumentos:
-yo CARPETA | Carpeta con semillas iniciales. |
-o CARPETA | Carpeta de salida con semillas intermedias y fallos. |
-U | Conectar a USB |
-desovar | Generar y adjuntar en lugar de simplemente adjuntar |
-guión GUIÓN | Nombre del archivo del script (el valor predeterminado es fuzzer-agent.js) |
Si no especifica la carpeta de salida, se crea una carpeta temporal en /tmp. Si no especifica la carpeta con la semilla inicial, se utiliza una semilla no informada 0000
como semilla inicial.
Si está modificando una aplicación local, es posible que desee ejecutar system-config
antes de frida-fuzzer
para ajustar los parámetros de su sistema y acelerar las cosas.
Al ejecutar ./frida-fuzzer -spawn ./tests/test_linux64
verá algo parecido a la siguiente pantalla de estado en su terminal:
También puede agregar fácilmente una etapa personalizada en fuzz/fuzzer.js
y agregarla a la lista de etapas en fuzz/index.js
.
Para personalizar el fuzzer, edite fuzz/config.js
. Las variables que quizás quieras cambiar son MAP_SIZE (si el código que estás difuminando es pequeño, puedes reducirlo y ganar un poco de velocidad), MAX_FILE (el tamaño máximo de entrada generada) y QUEUE_CACHE_MAX_SIZE (aumentar el tamaño de caché de la cola para más velocidad, especialmente en Android).
En tests
difusimos la biblioteca compartida nativa en la aplicación de Android de ejemplo.
Asegúrate de tener root en tu dispositivo virtual:
host$ adb root
Descargue el servidor frida x86_64 de Android desde la página de lanzamiento del repositorio y cópielo en el dispositivo en /data/local/tmp (use adb push).
Inicie un shell y ejecute el servidor frida:
device# cd /data/local/tmp device# ./frida-server
Ahora instale la aplicación de prueba tests/app-debug.apk
arrastrando y soltando en la ventana del emulador.
Luego, abre la aplicación.
Compile el script del agente con frida-compile:
host$ frida-compile -x tests/test_ndk_x64.js -o fuzzer-agent.js
Abra la aplicación en el emulador.
Borre la función test_func
de la biblioteca libnative-lib.so
incluida con la aplicación de prueba con el comando:
host$ ./frida-fuzzer -U -o output_folder/ com.example.ndktest1
Los casos de prueba interesantes y los fallos se guardan en la carpeta de salida.
Disfrutar.
Hola comunidad OSS, hay muchos TODO si alguien quiere contribuir.
Fuzzing de código Java (esperar métodos expuestos adicionales en frida-java-bridge, debería ser fácil, casi terminado)
etapa de empalme (fusionar dos casos de prueba en la cola y causar estragos en ellos)
apoyar diccionarios (y así modificar también estragos)
selección de semillas
instrumentación en línea para arm64
puntuación de desempeño (explorar el calendario de la AFL)
mutador estructural (mutación de bytes basado en una gramática escrita en JSON)
CompareCoverage (perfil de subinstrucción para evitar obstáculos difusos)
reescribe frida-fuzzer en C con frida-core para poder ejecutar todo en el dispositivo móvil
Si tienes dudas sobre alguna de estas características, no dudes en enviarme un mensaje de texto en Twitter.
Para propuestas de características, está la sección Problemas.