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 を使用して複数のファズィングジョブを並列で実行します。

並列ファズテスト

編集

並列実行の設定とオプション

編集

フォークモード

編集

フォークモードの使用方法と利点

編集

マージの再開

編集

マージプロセスの途中再開方法

編集

オプション

編集

主要なコマンドラインオプションの詳細

編集

その他のオプションとその使用例

編集

出力

編集

ファズテスト実行中の出力情報の解説

編集

各イベントコードと統計情報の説明

編集

使用例

編集

トイ例

編集

シンプルなファズターゲットの例

編集

実行方法と期待される結果

編集

実践例

編集

実際のファズターゲットと発見されたバグの例

編集

詳細な解説と分析

編集

高度な機能

編集

辞書の使用

編集

ユーザー提供の辞書によるファズテストの強化

編集

CMP命令のトレース

編集

CMP命令のトレースとその効果

編集

バリュープロファイル

編集

バリュープロファイルの使用方法と利点

編集

ファズフレンドリービルドモード

編集

ファズテストに適したビルド設定の推奨

編集

AFL互換性

編集

AFLとの連携方法とベストプラクティス

編集

Fuzzerの評価

編集

ファズターゲットとコーパスの評価方法

編集

ユーザー提供のミューテーター

編集

カスタムミューテーターの使用方法

編集

開発者向け情報

編集

libFuzzerの開発方法と貢献方法

編集

コードレビューとバグ報告のガイドライン

編集

よくある質問と回答

編集

トロフィー

編集

libFuzzerが発見した著名なバグとその詳細

編集