
Этот экспериментальный фаззер предназначен для использования при фаззинге API в памяти.
v1.4 Copyright (C) 2020 Andrea Fioraldi [email protected]
Выпущено под лицензией Apache License v2.0
Этот экспериментальный фаззер предназначен для фаззинга API в памяти.
Дизайн сильно вдохновлён и основан на AFL/AFL++.
На данный момент мутатор довольно прост, только стадии havoc и splice от AFL.
Я тестировал только примеры из tests/, это проект в разработке, но известно, что он работает как минимум на GNU/Linux x86_64 и Android x86_64.
Вам нужен Frida >= 12.8.1 для запуска (pip3 install -U frida) и frida-tools для компиляции harness.
Библиотека fuzz должна быть импортирована в пользовательский harness, а затем скомпилирована с помощью frida-compile для создания агента, который frida-fuzzer внедрит в целевое приложение.
Большая часть логики фаззера находится в агенте.
Harness имеет следующий формат:
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 = new NativeFunction(TARGET_FUNCTION, RET_TYPE, ARGS_TYPES, { traps: 'all' });
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, payload, payload.length);
func_handle(payload_mem, payload.length);
}
fuzz.fuzzer_test_one_input обязателен. Если вы не укажете fuzz.target_module, то весь выполняемый код будет инструментирован.
Вы также можете установить fuzz.manual_loop_start = true, чтобы сообщить фаззеру, что вы будете вызывать fuzz.fuzzing_loop() в обратном вызове, и поэтому он не должен вызывать его за вас (например, для запуска фаззинга при нажатии кнопки в Android-приложении).
Обратный вызов fuzz.init_callback можно установить для выполнения кода, когда фаззер будет готов начать. См. пример в tests/test_java.js.
fuzz.dictionary — это классический словарь фаззера, массив, в который можно добавлять элементы (допустимые типы: Array, ArrayBuffer, Uint8Array, String), используемые как дополнительные значения в мутаторе. См. пример в tests/test_libxml2.js.
frida-fuzzer принимает следующие аргументы:
Если вы не укажете выходную папку, будет создана временная папка в /tmp.
Если вы не укажете папку с начальным seed-файлом, в качестве начального seed-файла будет использован неинформированный seed 0000.
Если вы фаззите локальное приложение, вы можете выполнить system-config перед frida-fuzzer, чтобы настроить параметры вашей системы и ускорить процесс.
Запустив ./frida-fuzzer -spawn ./tests/test_linux64, вы увидите на терминале что-то вроде следующего экрана состояния:

Вы также можете легко добавить собственную стадию в fuzz/fuzzer.js и добавить её в список стадий в fuzz/index.js.
Чтобы настроить фаззер, отредактируйте fuzz/config.js.
Переменные, которые вы, возможно, захотите изменить: MAP_SIZE (если фаззингующийся код невелик, вы можете уменьшить его и немного ускориться), MAX_FILE (максимальный размер генерируемого ввода) и QUEUE_CACHE_MAX_SIZE (увеличьте размер кэша очереди для большей скорости, особенно на Android).
Давайте профаззим нативную разделяемую библиотеку в примере Android-приложения в tests.
Убедитесь, что у вас есть root-доступ на виртуальном устройстве:
host$ adb root
Скачайте Android x86_64 frida-server со страницы релизов репозитория и скопируйте его на устройство в /data/local/tmp (используйте adb push).
Откройте оболочку и запустите frida-server:
device# cd /data/local/tmp
device# ./frida-server
Теперь установите тестовое приложение tests/app-debug.apk, перетащив его в окно эмулятора.
Затем откройте приложение.
Скомпилируйте скрипт агента с помощью frida-compile:
host$ frida-compile -x tests/test_ndk_x64.js -o fuzzer-agent.js
Откройте приложение в эмуляторе.
Профаззьте функцию test_func библиотеки libnative-lib.so, поставляемой с тестовым приложением, с помощью команды:
host$ ./frida-fuzzer -U -o output_folder/ com.example.ndktest1
Интересные тестовые примеры и сбои сохраняются в output_folder.
Наслаждайтесь.

Привет, сообщество OSS, здесь много TODO, если кто-то хочет внести свой вклад.
Если у вас есть сомнения по поводу какой-либо из этих функций, не стесняйтесь написать мне в Twitter.
Для предложений функций есть раздел Issues.
| -i FOLDER | Папка с начальными seed-файлами |
| -o FOLDER | Выходная папка с промежуточными seed-файлами и сбоями |
| -U | Подключение к USB |
| -spawn | Запустить и присоединиться вместо простого присоединения |
| -script SCRIPT | Имя скрипта (по умолчанию fuzzer-agent.js) |