コンテンツにスキップ

LLVM/libFuzzer

出典: フリー教科書『ウィキブックス(Wikibooks)』


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の開発方法と貢献方法[編集]

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

FAQ[編集]

よくある質問と回答[編集]

トロフィー[編集]

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