コンテンツにスキップ

Snapchange - KVMスナップショット ベースファジング チートシート

Snapchange - KVMスナップショット ベースファジング チートシート

SnapchangeはAWSのRustフレームワークスナップショット ベース ファジングです。従来のファザーは各入力のターゲットを再スタートし、面白いコードが高価なセットアップの背後にある場合に致命的に遅い—ネットワーク ハンドシェイク、ログイン、解析された設定、読み込まれたデータベース。Snapchangeは代わりにメモリー スナップショットを正確なターゲット モーメント、その状態をリストアし、KVMを使用して変異し、本当に高い反復レート ファジングが従来型ファジングが到達するのに苦労するコード。

スナップショット ファジングはKVMおよびrootが必要です。分離された環境で実行します。

要件

RequirementNote
Linux with KVM/dev/kvmアクセス可能
Rust toolchainSnapchangeはRustライブラリー
QEMUスナップショット取得に使用
RootKVMおよびメモリー アクセス

モデル

PhaseWhat happens
1. Snapshot関心モーメント、ダンプ メモリー +レジスター にターゲットをQEMUで実行
2. Harness入力がどこに移動し、いつ停止するかを説明するRustファザーを記述
3. FuzzSnapchangeは反復ごとにスナップショットを再スタートおよび入力を変異
4. Triageクラッシュは正確なレジスター/メモリー状態で記録

重要な洞察:**すべてのセットアップ コストは1度、スナップショットで支払われます。**その後の毎反復はマイクロ秒でそう状態から開始。

スナップショット取得

# 概念的:QEMUの下でターゲットを実行し、関心関数で中断
# 物理メモリーおよび登録状態をダンプ
./snapchange/qemu_snapshot/take_snapshot.sh --target ./my-server
ArtifactContains
fuzzvm.physmem完全なゲスト 物理メモリー
fuzzvm.qemuregsCPU登録状態
*.symbolsシンボル テーブル カバレッジ/ブレークポイント
vmlinux / binaryシンボル化用

ファザーを記述

// 概念的な形状—Snapchangeの例で完全なコードを参照
impl Fuzzer for MyFuzzer {
    type Input = Vec<u8>;
    const START_ADDRESS: u64 = 0x555555555000;
    const MAX_INPUT_LENGTH: usize = 1024;

    fn set_input(&mut self, input: &Self::Input, fuzzvm: &mut FuzzVm<Self>) -> Result<()> {
        // 変異入力をゲスト メモリーにターゲットがそれを読むところに書く
        fuzzvm.write_bytes_dirty(VirtAddr(BUFFER_ADDR), CR3, input)?;
        Ok(())
    }

    fn reset_breakpoints(&self) -> Option<&[AddressLookup]> { /* stop conditions */ }
    fn crash_breakpoints(&self) -> Option<&[AddressLookup]> { /* crash sites */ }
}
ElementPurpose
START_ADDRESS実行が再開される各反復ところ
set_inputゲスト メモリーに ファザー 入力をインジェクト
reset_breakpoints反復が通常どこで終わる
crash_breakpointsクラッシュを示すアドレス(例:panicabort

実行

CommandDescription
cargo run -r -- fuzz -c 88コアでファザー
cargo run -r -- project translateシンボル化/スナップショット検査
cargo run -r -- coverageコーパスからカバレッジ生成
cargo run -r -- trace <input>単一ステップ 入力トレース
cargo run -r -- minimize <input>クラッシュ 入力を縮小

スナップショット ファジングが勝つ場所

Target characteristicConventional fuzzingSnapchange
Expensive startup毎反復支払う1度支払う
Requires auth/handshake到達困難スナップショット その過去
Stateful protocol困難スナップショット 中セッション
Kernel/hypervisor code非常に困難自然な適合

カバレッジ & トリアージ

CapabilityNote
Breakpoint coverageベーシック ブロック上のブレークポイント経由 カバレッジ
Crash dedup障害アドレス/状態でグループ化
Single-step traces与えられた 入力の完全な命令 トレース
Memory inspectionクラッシュ時にゲスト メモリー読む

Snapchange対他のファザー

AspectSnapchangeAFL++LibAFL (Nyx)syzkaller
ExecutionKVMスナップショット リストアプロセス フォークスナップショット(Nyx)VM + syscall
Setup cost1度支払う毎反復1度VM当たり
TargetVMスナップショットのものすべてユーザースペース バイナリー設定可能OSカーネル
Effort高い(Rustファザー書く)低い高い中程度

LibAFL(スナップショット バックエンドも提供)およびカーネル syscall ファジング用syzkallerと比較。

リソース