v1.4 Copyright (C) 2020 Андреа Фиоральди [email protected]
Выпущено под лицензией Apache v2.0.
Этот экспериментальный фаззер предназначен для фаззинга API в памяти.
Дизайн вдохновлен и основан на AFL/AFL++.
ATM-мутатор довольно прост, всего лишь этапы разрушения и сращивания AFL.
Я тестировал только примеры в тестах/, это незавершенный проект, но известно, что он работает как минимум на GNU/Linux x86_64 и Android x86_64.
Вам понадобится Frida >= 12.8.1 для запуска ( pip3 install -U frida
) и frida-tools для компиляции обвязки.
Библиотеку fuzz
необходимо импортировать в специальный пакет, а затем скомпилировать с помощью frida-compile
для создания агента, который frida-fuzzer
внедрит в целевое приложение.
Большая часть логики фаззера находится в агенте.
Жгут имеет следующий формат:
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 = новый 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 = функция (/* Uint8Array */ payload) { Memory.writeByteArray(payload_mem, полезная нагрузка, полезная нагрузка.длина); 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
принимает следующие аргументы:
-я ПАПКА | Папка с первоначальными семенами |
-о ПАПКА | Выходная папка с промежуточными семенами и сбоями |
-У | Подключиться к USB |
-спаун | Создавать и прикреплять вместо просто прикреплять |
-скрипт СКРИПТ | Имя файла сценария (по умолчанию — fuzzer-agent.js) |
Если вы не укажете выходную папку, в /tmp будет создана временная папка. Если вы не укажете папку с начальным начальным числом, в качестве начального будет использовано неинформированное начальное число 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
Загрузите Frida-сервер Android x86_64 со страницы выпуска репозитория и скопируйте его на устройство в /data/local/tmp (используйте adb push).
Запустите оболочку и запустите frida-сервер:
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
Интересные тестовые случаи и сбои сохраняются в папке вывода.
Наслаждаться.
Привет, сообщество OSS, есть много TODO, если кто-то хочет внести свой вклад.
Фаззинг Java-кода (ожидание дополнительных методов в frida-java-bridge, должно быть легко, почти готово)
этап сращивания (объедините два тестовых примера в очереди и нанесите на них хаос)
поддерживать словари (и, таким образом, изменять и хаос)
выбор семян
встроенные инструменты для Arm64
подсчет производительности (изучите расписание AFL)
структурный мутатор (мутировать байты на основе грамматики, написанной в JSON)
CompareCoverage (профилирование подинструкций для обхода фаззинга)
переписать frida-fuzzer на C с помощью frida-core, чтобы иметь возможность запускать все на мобильном устройстве
Если у вас есть сомнения по поводу одной из этих функций, напишите мне в Твиттере.
Для предложений по функциям есть раздел «Проблемы».