honggfuzz - セキュリティ志向カバレッジガイド付きファザー チートシート
honggfuzzはGoogleのフィードバック駆動のセキュリティ志向ファザーです。ターゲットを指すことが簡単で既知、外のボックスからの堅いマルチプロセスおよびマルチスレッドファジング、および両方をサポートソフトウェア計測およびハードウェアベースカバレッジ フィードバック(Intel BTS/PT)—後者は再コンパイルできないバイナリーをファジングさせます。広く使用ソフトウェアの実際の脆弱性検出の長い トラック レコード。
ファジングは大量のCPUとディスクを消費できます。 専用容量で実行し、分離された環境で実行します。
インストール
| Platform | Command |
|---|
| Debian/Ubuntu | sudo apt install honggfuzz |
| From source | git clone https://github.com/google/honggfuzz && make |
| macOS | brew install honggfuzz |
| Verify | honggfuzz --help |
2つのモード
| Mode | Use |
|---|
| File-based | ターゲット ファイル/stdinを読む;honggfuzz 入力を変異 |
| Persistent | ターゲット フザー エントリー ポイント公開;はるかに高速 |
ファイルベースファジング
# ファイル引数を取るプログラムをファザー
honggfuzz -i ./input_corpus -W ./workspace -- ./target ___FILE___
| Flag | Purpose |
|---|
-i DIR | 入力コーパス ディレクトリー |
-W DIR | ワークスペース(クラッシュ、統計) |
-o DIR | 出力コーパス |
___FILE___ | 入力ファイルで置換されたプレースホルダー |
-s | stdinで入力供給 |
-t SECS | 実行ごとのタイムアウト |
-n N | 同時ファジング スレッド数 |
永続モード(高速)
#include <stdint.h>
#include <stddef.h>
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
parse_input(data, size); // your target function
return 0;
}
# honggfuzzのclangラッパーでコンパイルしてからファザー
hfuzz-clang -fsanitize=address fuzz_target.c -o fuzz_target
honggfuzz -i corpus -P -- ./fuzz_target
| Element | Note |
|---|
LLVMFuzzerTestOneInput | libFuzzerと同じエントリー ポイント—ターゲットはポータブル |
-P | 永続モード有効化 |
hfuzz-clang / hfuzz-gcc | 計測を追加するコンパイラー ラッパー |
永続モードは入力ごとのプロセス起動を回避し、しばしば秒当たり実行数の10–100倍を提供します。
カバレッジ フィードバック オプション
| Mechanism | Flag / requirement |
|---|
| Software instrumentation | hfuzz-clangでコンパイル(デフォルト、最良) |
| Intel BTS | --linux_perf_bts_edge(再コンパイルなし) |
| Intel PT | --linux_perf_ipt_block(再コンパイルなし) |
| Instruction/branch counts | --linux_perf_instr、--linux_perf_branch |
ハードウェア フィードバックはクローズドソース バイナリーのエスケープ ハッチです—ソース アクセスなしでカバレッジ ガイダンスを取得します。
サニタイザー
# ASan + UBSanでビルドして、クラッシュ検出をより良く
hfuzz-clang -fsanitize=address,undefined target.c -o target
| Sanitizer | Catches |
|---|
| ASan | バッファー オーバーフロー、use-after-free |
| UBSan | 未定義動作 |
| MSan | 初期化されていない読み取り |
| LeakSanitizer | メモリー リーク |
監視および出力
| Item | Where |
|---|
| Live stats | ターミナルUI(execs/sec、カバレッジ、クラッシュ) |
| Crashes | WORKSPACE/*.fuzzファイル |
| Report | HONGGFUZZ.REPORT.TXT |
| Crash naming | シグナルおよび障害アドレスを含む |
| Flag | Effect |
|---|
-N N | N回の反復後に停止 |
--exit_upon_crash | 最初のクラッシュで停止 |
-v | 詳細 |
-Q | 静か |
トリアージワークフロー
# 1) クラッシュを再現
./target < WORKSPACE/SIGSEGV.PC.*.fuzz
# 2) デバッガーの下でスタック トレースを取得
gdb --args ./target WORKSPACE/SIGSEGV.PC.*.fuzz
# 3) 入力を最小化して、再ジューサーでバグを供出
honggfuzz対他のファザー
| Aspect | honggfuzz | AFL++ | libFuzzer | LibAFL |
|---|
| Setup | 非常に簡単 | 簡単 | 簡単(インプロセス) | 独自に構築 |
| Closed-source targets | はい(Intel PT/BTS) | QEMUモード | いいえ | はい |
| Persistent mode | はい | はい | ネイティブ | はい |
| Best for | 高速スタート、ハードウェア フィードバック | 最も広いエコシステム | ライブラリー API | カスタム ファザー |
AFL++を比較し最も広いエコシステム向け、およびLibAFLカスタム ファザーが必要な場合。
リソース