LibAFL - モジュール型ファジング フレームワーク チートシート
LibAFLはファジング フレームワークで、ファザーではなく。Rustで書かれた合成可能ビルディング ブロック—オブザーバー、フィードバック、変異子、スケジューラー、ステージ、実行者—をターゲットに合わせたファザーに集約します。動機は単形式ファザーは従来型ターゲットで良好に動作し、異常なターゲット(カスタム プロトコル、エミュレートされたファームウェア、カーネル、文法)で不幸であり、それでツールと闘います。LibAFLでターゲットが必要なファザーを構築し、マルチコア スケーリングを無料で取得します。
ファザーをビルドするのは1つを実行することはより多くの作業です。オフザシェルフ ツール本当にフィットしない場合のみLibAFLに到達します。
セットアップ
| Step | Command |
|---|
| New project | cargo new my_fuzzer && cd my_fuzzer |
| Add LibAFL | cargo add libafl libafl_bolts |
| Target instrumentation | cargo add libafl_targets(またはlibafl_qemu、libafl_frida) |
| Build | cargo build --release |
コア概念
| Component | Role |
|---|
| Input | ファジング対象(バイト、文法木、syscall) |
| Observer | 実行中にデータを記録(カバレッジ マップ、タイミング) |
| Feedback | 実行が「興味深い」かどうかを決定 |
| Objective | 実行がソリューション(クラッシュ)かどうかを決定 |
| Corpus | 興味深い入力のストレージ |
| Mutator | 入力を変形 |
| Scheduler | 次の実行する入力を選択 |
| Stage | 入力ごとに適用されるフェーズ(変異、トリミング、キャリブレーション) |
| Executor | 入力でターゲットを実行 |
最小限のファザー(形状)
// 概念的な構造—LibAFLの例で完全なコードを参照
let mut feedback = MaxMapFeedback::new(&edges_observer);
let mut objective = CrashFeedback::new();
let mut state = StdState::new(
StdRand::with_seed(current_nanos()),
InMemoryCorpus::new(),
OnDiskCorpus::new("./crashes")?,
&mut feedback,
&mut objective,
)?;
let scheduler = QueueScheduler::new();
let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);
let mut executor = InProcessExecutor::new(
&mut harness, tuple_list!(edges_observer), &mut fuzzer, &mut state, &mut mgr,
)?;
let mutator = StdScheduledMutator::new(havoc_mutations());
let mut stages = tuple_list!(StdMutationalStage::new(mutator));
fuzzer.fuzz_loop(&mut stages, &mut executor, &mut state, &mut mgr)?;
実行者(ターゲットが実行される方法)
| Executor | Use |
|---|
InProcessExecutor | 最速;同一プロセスでハーネス |
ForkserverExecutor | AFL形式 forkserver 外部バイナリー |
CommandExecutor | 入力ごとに外部コマンド実行 |
libafl_qemu | エミュレートされたターゲット / バイナリーのみのファジング |
libafl_frida | 動的計測(バイナリーのみ) |
libafl_nyx | スナップショット ベースVM ファジング |
フィードバック
| Feedback | Interesting when |
|---|
MaxMapFeedback | 新しいカバレッジ エッジ ヒット |
TimeFeedback | 実行時間変更 |
CrashFeedback | ターゲット クラッシュ(目標) |
TimeoutFeedback | ターゲット ハング(目標) |
NewHashFeedback | 新しいユニーク クラッシュ スタック |
| Combinators | feedback_or!、feedback_and!で合成 |
変異子
| Mutator | Does |
|---|
havoc_mutations() | 標準AFL スタイルのランダム 変異 |
tokens_mutations() | 辞書/トークン 挿入 |
| Grammar mutators | 構造対応 生成 |
| Custom | カスタム 入力タイプ用 Mutator トレイト 実装 |
カスタム 入力タイプ プラス カスタム 変異子はLibAFLを選ぶ主な理由です—プロトコルまたはASTインテリジェントにファジングするのではなくバイト フリップではなく。
マルチコア スケーリング
| Mechanism | Note |
|---|
LlmpRestartingEventManager | コア間 低オーバーヘッド メッセージ パッシング |
Launcher | 共有コーパス 単一ファザーがコア実行 |
| Corpus sync | 興味深い 入力が インスタンス間に伝播 |
| Restarting | ファザー プロセスの クラッシュから生き残ります |
LibAFL対オフザシェルフ ファザー
| Aspect | LibAFL | AFL++ | honggfuzz |
|---|
| Model | 独自に構築 | 実行用準備 | 実行用準備 |
| Effort | 高い | 低い | 低い |
| Flexibility | 合計 | 設定可能 | 設定可能 |
| Best for | 異常なターゲット、研究 | 標準バイナリー | 高速スタート、ハードウェア フィードバック |
AFL++またはhonggfuzzで開始;LibAFLにターゲットが理由を述べることができない場合に移動。
リソース