
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 , 221-231. SciTePress.
WuppieFuzz는 Apache-2.0 라이선스 하에 배포됩니다. LICENSE를 참조하세요.
타사 라이선스 고지는 THIRD_PARTY_NOTICES에 나열되어 있습니다.
주요 운영 체제(MacOS, Windows, Linux)용 WuppieFuzz의 빠른 설치는 releases를 참조하거나 brew install wuppiefuzz를 사용하세요.
프로젝트를 빌드하려면 다음 종속성과 도구를 설치해야 합니다:
sudo apt install build-essentialsudo apt install pkg-configcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shWuppieFuzz를 실행하기 전에 (계측된) 대상 애플리케이션을 시작해야 합니다.
또한 WuppieFuzz에 OpenAPI 사양을 제공해야 요청을 생성하고 변형하는 방법을 알 수 있습니다. 명령줄 인수에 대한 도움말은 다음을 사용하세요:
$ cargo run -- --help # 필수 매개변수 및 플래그에 대한 도움말 표시
Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML]
...
예를 들어, JaCoCo 에이전트가 연결된 Java 대상을 WuppieFuzz로 테스트하려면 OpenAPI 파일(API 사양에 대상이 실행 중인 URL 포함)을 지정합니다. 또한 커버리지 형식이 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/ 디렉터리에는 Java 코드용 JaCoCo 커버리지 보고서 생성과 Python 코드용 LCOV 커버리지 보고서 생성을 위한 두 개의 예제 구성 파일이 있습니다.
--report 플래그로 WuppieFuzz를 실행하면 reports/ 내부에 타임스탬프를 이름으로 하는 하위 디렉터리가 생성됩니다. 지원되는 모든 커버리지 보고서가 이 하위 디렉터리에 기록됩니다. 두 가지 유형의 커버리지 보고서가 있습니다:
또한 퍼징 캠페인과 관련된 모든 요청 정보로 데이터베이스가 채워집니다. 이 데이터베이스는 Grafana 대시보드를 통해 시각화하고 탐색할 수 있습니다.
각 항목에 대한 자세한 내용은 해당 디렉터리의 README를 참조하세요.
기본적으로 WuppieFuzz는 C 종속성(OpenSSL, SQLite, Z3)을 벤더링하므로 일반적인 cargo build가 바로 작동합니다. 개발 중 더 빠른 컴파일을 위해 모든 벤더링된 종속성을 비활성화하고 시스템에 설치된 라이브러리에 연결할 수 있습니다.
[!NOTE]
z3크레이트는 대부분의 Linux 배포판 패키지 관리자가 제공하는 버전보다 새로운 Z3 4.15+가 필요합니다. 호환 버전을 얻으려면 Homebrew를 통해 Z3를 설치하세요(brew install z3).
시스템에 다음 라이브러리를 설치하세요:
Debian/Ubuntu:
sudo apt install libssl-dev libsqlite3-dev
brew install z3 # apt의 libz3-dev는 너무 오래됨; Homebrew 사용
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/config.toml에 --no-default-features로 빌드하고 모든 시스템 라이브러리에 연결하는 cargo 별칭이 포함되어 있습니다:
cargo dev-build # 벤더링된 종속성 없이 빌드
cargo dev-run -- <args> # 벤더링된 종속성 없이 실행
cargo dev-test # 벤더링된 종속성 없이 테스트
cargo doc --no-deps를 실행하여 소스 코드의 주석에서 문서를 생성합니다. 문서의 기본 페이지는 target/doc/wuppiefuzz/index.html입니다.