
WuppieFuzz v1.7.1
LibAFL 기반으로 개발된 커버리지 기반 REST API 퍼저
WuppieFuzz v1.7.1
TNO는 LibAFL 기반으로 개발된 커버리지 가이드 REST API 퍼저인 WuppieFuzz를 개발했습니다. 이 도구는 광범위한 최종 사용자를 대상으로 하며, 사용 용이성, 발견된 결함의 설명 가능성 및 모듈성에 중점을 둡니다. 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에 나열되어 있습니다.
빠른 설치
주요 운영 체제(MacOS, Windows, Linux)용 WuppieFuzz의 빠른 설치는 releases를 참조하거나 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]
...
예를 들어, 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/ 내부에 타임스탬프를 이름으로 하는 하위 디렉터리가 생성됩니다. 지원되는 모든 커버리지 보고서가 이 하위 디렉터리에 기록됩니다. 두 가지 유형의 커버리지 보고서가 있습니다:
- 엔드포인트 커버리지: OpenAPI 사양만 필요하므로 항상 생성할 수 있습니다.
- 코드 커버리지: 현재 JaCoCo만 지원하지만 더 많은 형식을 지원할 계획입니다. 까다로운 점은 커버리지를 소스 파일에 매핑하고 이를 사용하는 강력한 보고서 생성이 필요하다는 것입니다.
또한 퍼징 캠페인과 관련된 모든 요청 정보로 데이터베이스가 채워집니다. 이 데이터베이스는 Grafana 대시보드를 통해 시각화하고 탐색할 수 있습니다.
이 저장소의 구조
- assets: 로고, 이미지 등
- coverage_agents: 다양한 대상에 적용할 커버리지 추적용 코드 및 지침
- example_configs: WuppieFuzz를 구성하기 위한 예제 구성 파일
- src: WuppieFuzz의 소스 코드
- tutorial: 특정 대상을 퍼징하는 방법과 퍼징 결과를 해석하는 방법에 대한 심층적이고 저수준의 튜토리얼
- dashboard: 퍼징 결과 및 성능을 분류하기 위한 도구
각 항목에 대한 자세한 내용은 해당 디렉터리의 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 별칭
저장소에는 .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입니다.
