
Управляемый покрытием фаззер REST API, разработанный на основе LibAFL
TNO разработала WuppieFuzz — фаззер REST API с управлением покрытием, созданный на основе LibAFL, ориентированный на широкую аудиторию конечных пользователей, с сильным акцентом на простоту использования, объяснимость обнаруженных уязвимостей и модульность. WuppieFuzz поддерживает все три режима тестирования (чёрный ящик, серый ящик и белый ящик).
[!NOTE]
Для быстрого пошагового руководства, пожалуйста, следуйте учебнику!
WuppieFuzz был представлен в:
Если вы хотите процитировать WuppieFuzz в академической работе, пожалуйста, используйте предпочтительную публикацию, указанную в :
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) см. релизы или используйте brew install wuppiefuzz
Для сборки проекта необходимо установить следующие зависимости и инструменты:
sudo apt install build-essentialsudo apt install pkg-configcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shПеред запуском WuppieFuzz необходимо запустить ваше (инструментированное) целевое приложение.
Кроме того, вы должны предоставить WuppieFuzz OpenAPI-спецификацию, чтобы он знал, как генерировать и мутировать свои запросы. Для справки по аргументам командной строки используйте следующее:
$ cargo run -- --help # показывает справку по требуемым параметрам и флагам
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
На Linux Homebrew устанавливается в нестандартный путь. Добавьте его каталог библиотек в ваше окружение, чтобы компилятор и динамический компоновщик могли найти Z3:
eval "$(brew shellenv)"
export LIBRARY_PATH="$(brew --prefix z3)/lib:$LIBRARY_PATH"
export LD_LIBRARY_PATH="$(brew --prefix z3)/lib:$LD_LIBRARY_PATH"
[!TIP] Добавьте строки выше в ваш
~/.bashrcили~/.zshrc, чтобы сделать их постоянными.
Fedora (42+):
sudo dnf install openssl-devel sqlite-devel z3-devel
macOS (Homebrew):
brew install openssl sqlite z3
Репозиторий включает псевдонимы cargo в .cargo/config.toml, которые собирают с
--no-default-features, связываясь со всеми системными библиотеками:
cargo dev-build # сборка без поставляемых зависимостей
cargo dev-run -- <args> # запуск без поставляемых зависимостей
cargo dev-test # тестирование без поставляемых зависимостей
cargo doc --no-deps для генерации документации из комментариев в исходном
коде. Главная страница документации будет
target/doc/wuppiefuzz/index.html