
LibAFL上に開発されたカバレッジガイド型REST APIファザー
TNOは、LibAFL上に開発されたカバレッジガイド型REST APIファザーであるWuppieFuzzを開発しました。これは幅広いエンドユーザーを対象とし、使いやすさ、発見された欠陥の説明可能性、モジュール性を重視しています。WuppieFuzzはテストの3つの設定(ブラックボックス、グレーボックス、ホワイトボックス)すべてをサポートしています。
[!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を使用してください。
プロジェクトをビルドするには、以下の依存関係とツールをインストールする必要があります。
sudo apt install build-essentialsudo apt install pkg-configcurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shWuppieFuzzを実行する前に、(計測された)ターゲットアプリケーションを起動する必要があります。
さらに、WuppieFuzzにOpenAPI仕様を指定する必要があります。これにより、リクエストの生成方法と変更方法が決まります。コマンドライン引数のヘルプについては、次のコマンドを使用してください:
$ cargo run -- --help # shows help for required parameters and flags
Usage: wuppiefuzz [OPTIONS] [OPENAPI_SPEC.YAML]
...
例えば、JaCoCoエージェントをアタッチしたJavaターゲットに対してWuppieFuzzを実行するには、OpenAPIファイル(ターゲットが実行されているURLをAPI仕様に含むもの)を指定します。さらに、カバレッジ形式がJaCoCoであることを指定し、クラスディレクトリを次のように指定します:
cargo run -- fuzz openapi.yaml --coverage-format jacoco --jacoco-class-dir ../Targets/app/target/classes/
コマンドライン引数の代わりに、またはコマンドライン引数と組み合わせて設定ファイルを使用したい場合は、フラグ --config <CONFIG_FILE> を使用できます。コマンドライン引数と設定ファイルを組み合わせて使用する場合、コマンドライン引数が優先されます。
設定ファイルはyamlファイルであり、指定したい各コマンドライン引数に対して1行ずつ含める必要があります。例:
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によるカバレッジレポート生成に使用する2つの設定ファイル例があります。
--report フラグを付けてWuppieFuzzを実行すると、reports/ 内にタイムスタンプを名前とするサブディレクトリが作成されます。サポートされているすべてのカバレッジレポートがこのサブディレクトリに書き込まれます。カバレッジレポートには2つのタイプがあります:
さらに、ファジングキャンペーンに関連するすべてのリクエスト情報を格納するデータベースが作成されます。このデータベースは、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
このリポジトリには、.cargo/config.toml にcargoエイリアスが含まれており、--no-default-features でビルドしてすべてのシステムライブラリにリンクします:
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 になります。