
WuppieFuzz v1.7.1
Управляемый покрытием фаззер REST API, разработанный на основе LibAFL
WuppieFuzz v1.7.1
TNO разработала WuppieFuzz — фаззер REST API с управлением покрытием, созданный на основе LibAFL, ориентированный на широкую аудиторию конечных пользователей, с сильным акцентом на простоту использования, объяснимость обнаруженных уязвимостей и модульность. WuppieFuzz поддерживает все три режима тестирования (чёрный ящик, серый ящик и белый ящик).
[!NOTE]
Для быстрого пошагового руководства, пожалуйста, следуйте учебнику!
Освещение в СМИ
WuppieFuzz был представлен в:
- The ONE Conference e-magazine 2024
- Test your APIs easily with TNO's new REST API fuzzer
- OpenAPI.tools listing: WuppieFuzz
- Automated REST API Vulnerability Detection with WuppieFuzz (Nordic APIs on YouTube)
- Thoughtworks Technology Radar: 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) см. релизы или используйте brew install wuppiefuzz
Краткая инструкция
Предварительные требования для разработки
Для сборки проекта необходимо установить следующие зависимости и инструменты:
- build-essential
sudo apt install build-essential - pkg-config
sudo apt install pkg-config - Rust
curl --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/ создаётся
подкаталог с именем, содержащим временную метку. Все поддерживаемые отчёты о покрытии
записываются в этот подкаталог. Существует два типа отчётов о покрытии:
- покрытие конечных точек: может быть сгенерировано всегда, поскольку требует только OpenAPI-спецификацию.
- покрытие кода: в настоящее время поддерживается только для JaCoCo, но мы стремимся поддерживать больше. Сложность в том, что это требует сопоставления покрытия с исходными файлами и надёжной генерации отчётов, использующей это.
Кроме того, база данных заполняется всей информацией о запросах, связанных с вашей кампанией фаззинга. Эту базу данных можно визуализировать и исследовать через панель Grafana.
Структура этого репозитория
- assets: логотипы, изображения и т.д.
- coverage_agents: код и инструкции для отслеживания покрытия, которые можно накладывать на различные цели
- example_configs: примеры файлов конфигурации для настройки WuppieFuzz
- src: исходный код WuppieFuzz
- tutorial: подробный и низкоуровневый учебник о том, как фаззить конкретную цель и как интерпретировать результаты фаззинга
- dashboard: инструменты для триажа результатов фаззинга и производительности
Для получения дополнительной информации о каждом из них см. 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 в .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
