TL;DR

LLVM に含まれる、プロセス内(in-process)で動くカバレッジガイデッドなファジングエンジン。テスト対象のライブラリと同じプロセスで動き、カバレッジを手がかりに入力を変化させる。

仕組み

利用者は「ファズターゲット」と呼ばれる関数 LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) を書き、受け取ったバイト列をテスト対象の API に渡す。libFuzzer はコーパスの入力を変化させ、新しいコードを通った入力を残していく。カバレッジは LLVM の SanitizerCoverage による計装で取る。

ビルド時に -fsanitize=fuzzer を付けてコンパイル・リンクする。Clang 6.0 以降には libFuzzer が含まれているので、別途インストールする必要はない。

注意点

  • メモリ破壊はその場でクラッシュせず見逃されることがあるので、AddressSanitizer などのサニタイザと組み合わせて使う
  • ファズターゲットはどんな入力も受け付け、決定的で、速く動く必要がある。exit() を呼んではいけない
  • 元の開発者は Centipede に移っている。重要なバグの修正は続くが、大きな新機能は期待できない

関連

出典