LLVM/libFuzzer
< LLVM
libFuzzer – カバレッジガイド型ファズテストライブラリ[編集]
はじめに[編集]
libFuzzer は、LLVM の SanitizerCoverage 計装を使用してコードカバレッジを最大化するために、入力データの変異を生成するインプロセスのカバレッジガイド型進化的ファズィングエンジンです。このエンジンは、テスト対象のライブラリとリンクすることで動作します。
状況[編集]
- 現在の開発
- 元の著者は別のファズィングエンジンである Centipede に注力しているため、大きな新機能の追加は期待されていませんが、重要なバグ修正は引き続き行われます。
バージョン[編集]
- libFuzzer は、対応するバージョンの Clang を必要とします。
始めに[編集]
ファズターゲット[編集]
- 定義
- テスト対象の API を使用してバイト配列を処理する関数を実装します。
- 例
- :
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { DoSomethingInterestingWithMyAPI(Data, Size); return 0; }
- 要件
- どんな入力にも対応し、非決定論を避け、迅速に実行し、グローバル状態を変更しないようにします。
ファザーの使用方法[編集]
- コンパイル
- :
clang -g -O1 -fsanitize=fuzzer,address mytarget.c
- オプション
- ASAN, UBSAN, MSAN などのサニタイザーと組み合わせて使用します。
コーパス[編集]
- 定義
- サンプル入力のコレクションです。
- 管理
-merge=1
フラグを使用してコーパスを最小化または拡張します。
実行[編集]
- セットアップ
- 初期入力をディレクトリに配置し、ファザーを実行します。
mkdir CORPUS_DIR cp /some/input/samples/* CORPUS_DIR ./my_fuzzer CORPUS_DIR
並列ファズィング[編集]
- 複数のプロセス
-jobs=N
と-workers=N
を使用して複数のファズィングジョブを並列で実行します。