
Управляемый покрытием фаззер REST API, разработанный на основе LibAFL
TNO разработала WuppieFuzz — REST API-фаззер с покрытием на основе LibAFL, ориентированный на широкую аудиторию конечных пользователей, с сильным акцентом на простоту использования, объяснимость обнаруженных уязвимостей и модульность. WuppieFuzz поддерживает все три режима тестирования (чёрный ящик, серый ящик и белый ящик).
[!NOTE]
Для быстрого пошагового руководства перейдите к tutorial!
WuppieFuzz был представлен в:
Если вы хотите сослаться на WuppieFuzz в академической работе, пожалуйста, используйте предпочтительную публикацию, указанную в CITATION.cff:
Rooijakkers, T., Nijsten, A., Daniele, C., Weitenberg, E., Groenewegen, R., & Melissen, A. (2026). WuppieFuzz: Coverage-Guided, Stateful REST API Fuzzing. In Proceedings of the 12th International Conference on Information Systems Security and Privacy (ICISSP), Volume 2, 221-231. SciTePress. https://doi.org/10.5220/0000217100004061
WuppieFuzz распространяется под лицензией Apache-2.0; см. LICENSE.
Уведомления о лицензиях третьих сторон перечислены в THIRD_PARTY_NOTICES.
Для быстрой установки WuppieFuzz для популярных операционных систем (MacOS,
Windows, Linux) см. releases или используйте brew install wuppiefuzz
Вы можете собрать docker-образ командой docker build . -t wuppiefuzz:local. Чтобы использовать его, необходимо смонтировать папку, содержащую вашу openapi-спецификацию. При фаззинге сервиса, запущенного локально (не в Docker), необходимо указать host networking:
docker run \
--network host \
-v ./fuzzing-folder:/fuzzing-folder \ # The folder will be populated with wuppiefuzz outputs
-w /fuzzing-folder \
wuppiefuzz:local fuzz --timeout 60 --report openapi.json
Для сборки проекта необходимо установить следующие зависимости и инструменты:
sudo apt install -y build-essential pkg-config cmake # General build tools
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Rust
Перед запуском WuppieFuzz необходимо запустить ваше (инструментированное) целевое приложение.
Кроме того, необходимо предоставить WuppieFuzz OpenAPI-спецификацию, чтобы он знал, как генерировать и мутировать свои запросы. Для справки по аргументам командной строки используйте следующее:
$ cargo run -- --help # shows help for required parameters and flags
Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML]
...
Например, чтобы запустить WuppieFuzz против Java-цели с подключённым агентом JaCoCo, вы указываете его OpenAPI-файл (содержащий URL, по которому запущена цель, в спецификации API). Кроме того, вы указываете, что формат покрытия — JaCoCo, и задаёте каталог классов следующим образом:
cargo run -- fuzz openapi.yaml --coverage-format jacoco --jacoco-class-dir ../Targets/app/target/classes/
Если вы хотите использовать файл конфигурации вместо аргументов командной
строки или в сочетании с ними, вы можете использовать флаг --config <CONFIG_FILE>. Если вы используете аргументы командной строки в сочетании с файлом конфигурации, аргументы командной строки имеют приоритет.
Файл конфигурации должен быть yaml-файлом и содержать строку для каждого аргумента командной строки, который вы хотите указать, например:
coverage_format: jacoco
output_format: human-readable
source_dir: "/swagger-petstore/src/main/java"
jacoco_class_dir: "/swagger-petstore/target"
timeout: 20
Пример команды запуска в этом случае может быть таким:
$ cargo run -- fuzz --config=config.yaml --report --coverage-host=localhost:6300 --timeout=10 ./openapi.yaml
Эта строка объединила бы аргументы из командной строки и из файла
конфигурации. Поскольку флаг --timeout указан в обоих, таймаут, указанный в
командной строке (10 секунд), будет иметь приоритет.
В каталоге example_configs/ вы найдёте два примера файлов конфигурации для
использования при генерации отчётов о покрытии с помощью JaCoCo для Java-кода и для генерации
отчётов о покрытии с помощью LCOV для Python-кода.
Когда вы запускаете WuppieFuzz с флагом --report, внутри
reports/ создаётся подкаталог с именем в виде временной метки. Все поддерживаемые отчёты о покрытии
записываются в этот подкаталог. Существует два типа отчётов о покрытии:
Вдобавок к этому база данных заполняется всей информацией о запросах, связанной с вашей кампанией фаззинга. Эту базу данных можно визуализировать и исследовать через панель Grafana.
Для получения дополнительной информации о каждом из них см. README в этих каталогах.
По умолчанию WuppieFuzz включает свои C-зависимости (OpenSSL, SQLite, Z3), так что
обычная команда cargo build работает из коробки. Для более быстрой компиляции во время
разработки вы можете отключить все встроенные зависимости и вместо этого слинковаться с
установленными в системе библиотеками.
[!NOTE] Крейт
z3требует Z3 4.15+, что новее версии, поставляемой большинством менеджеров пакетов дистрибутивов Linux. Установите Z3 через Homebrew (brew install z3), чтобы получить совместимую версию.
Установите следующие библиотеки в вашей системе:
Debian/Ubuntu:
sudo apt install libssl-dev libsqlite3-dev
brew install z3 # apt's libz3-dev is too old; use Homebrew instead