
LibAFL 기반으로 개발된 커버리지 기반 REST API 퍼저
TNO는 LibAFL을 기반으로 개발된 커버리지 기반 REST API 퍼저인 WuppieFuzz를 개발했습니다. 이는 폭넓은 최종 사용자를 대상으로 하며, 사용 편의성, 발견된 결함의 설명 가능성, 모듈성에 중점을 두고 있습니다. WuppieFuzz는 세 가지 테스트 방식(블랙 박스, 그레이 박스, 화이트 박스)을 모두 지원합니다.
[!NOTE]
빠르게 따라 하며 배우고 싶다면 튜토리얼을 참고하세요!
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에 나열되어 있습니다.
주요 운영체제(MacOS, Windows, Linux)용 WuppieFuzz를 빠르게 설치하려면 releases를 참고하거나 brew install wuppiefuzz를 사용하세요.
docker build . -t wuppiefuzz:local로 도커 이미지를 빌드할 수 있습니다. 사용하려면 openapi 스펙이 포함된 폴더를 마운트해야 합니다. 로컬(도커가 아닌)에서 실행 중인 서비스를 퍼징할 때는 호스트 네트워킹을 지정해야 합니다:
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]
...
예를 들어, JaCoCo 에이전트가 연결된 Java 대상에 대해 WuppieFuzz를 실행하려면 OpenAPI 파일(API 명세에 대상이 실행 중인 URL이 포함됨)을 지정합니다. 또한 커버리지 형식이 JaCoCo임을 지정하고 classes 디렉터리를 다음과 같이 제공합니다:
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/ 디렉터리에는 Java 코드에 대한 JaCoCo 커버리지 보고서 생성과 Python 코드에 대한 LCOV 커버리지 보고서 생성에 사용할 두 개의 예시 구성 파일이 있습니다.
--report 플래그와 함께 WuppieFuzz를 실행하면 reports/ 내부에 타임스탬프를 이름으로 하는 하위 디렉터리가 생성됩니다. 지원되는 모든 커버리지 보고서가 이 하위 디렉터리에 작성됩니다. 두 가지 유형의 커버리지 보고서가 있습니다:
그 위에 퍼징 캠페인과 관련된 모든 요청 정보로 데이터베이스가 채워집니다. 이 데이터베이스는 Grafana 대시보드를 통해 시각화하고 탐색할 수 있습니다.
각 항목에 대한 자세한 내용은 해당 디렉터리의 README를 참고하세요.
기본적으로 WuppieFuzz는 C 종속성(OpenSSL, SQLite, Z3)을 벤더링하여 일반 cargo build가 바로 작동하도록 합니다. 개발 중 더 빠른 컴파일을 위해 모든 벤더링된 종속성을 비활성화하고 시스템에 설치된 라이브러리에 대신 링크할 수 있습니다.
[!NOTE]
z3크레이트는 Z3 4.15+를 요구하며, 이는 대부분의 Linux 배포판 패키지 관리자가 제공하는 버전보다 최신입니다. 호환되는 버전을 얻으려면 Homebrew(brew install z3)를 통해 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
저장소에는 --no-default-features로 빌드하여 모든 시스템 라이브러리에 링크하는 cargo 별칭이 .cargo/config.toml에 포함되어 있습니다:
cargo dev-build # build without vendored dependencies
cargo dev-run -- <args> # run without vendored dependencies
cargo dev-test # test without vendored dependencies
cargo doc --no-deps로 소스 코드의 주석에서 문서를 생성합니다. 문서의 메인 페이지는 target/doc/wuppiefuzz/index.html이 됩니다.