Snapchange - KVMスナップショット ベースファジング チートシート
SnapchangeはAWSのRustフレームワークスナップショット ベース ファジングです。従来のファザーは各入力のターゲットを再スタートし、面白いコードが高価なセットアップの背後にある場合に致命的に遅い—ネットワーク ハンドシェイク、ログイン、解析された設定、読み込まれたデータベース。Snapchangeは代わりにメモリー スナップショットを正確なターゲット モーメント、その状態をリストアし、KVMを使用して変異し、本当に高い反復レート ファジングが従来型ファジングが到達するのに苦労するコード。
スナップショット ファジングはKVMおよびrootが必要です。分離された環境で実行します。
要件
| Requirement | Note |
|---|
| Linux with KVM | /dev/kvmアクセス可能 |
| Rust toolchain | SnapchangeはRustライブラリー |
| QEMU | スナップショット取得に使用 |
| Root | KVMおよびメモリー アクセス |
モデル
| Phase | What happens |
|---|
| 1. Snapshot | 関心モーメント、ダンプ メモリー +レジスター にターゲットをQEMUで実行 |
| 2. Harness | 入力がどこに移動し、いつ停止するかを説明するRustファザーを記述 |
| 3. Fuzz | Snapchangeは反復ごとにスナップショットを再スタートおよび入力を変異 |
| 4. Triage | クラッシュは正確なレジスター/メモリー状態で記録 |
重要な洞察:**すべてのセットアップ コストは1度、スナップショットで支払われます。**その後の毎反復はマイクロ秒でそう状態から開始。
スナップショット取得
# 概念的:QEMUの下でターゲットを実行し、関心関数で中断
# 物理メモリーおよび登録状態をダンプ
./snapchange/qemu_snapshot/take_snapshot.sh --target ./my-server
| Artifact | Contains |
|---|
fuzzvm.physmem | 完全なゲスト 物理メモリー |
fuzzvm.qemuregs | CPU登録状態 |
*.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 */ }
}
| Element | Purpose |
|---|
START_ADDRESS | 実行が再開される各反復ところ |
set_input | ゲスト メモリーに ファザー 入力をインジェクト |
reset_breakpoints | 反復が通常どこで終わる |
crash_breakpoints | クラッシュを示すアドレス(例:panic、abort) |
実行
| Command | Description |
|---|
cargo run -r -- fuzz -c 8 | 8コアでファザー |
cargo run -r -- project translate | シンボル化/スナップショット検査 |
cargo run -r -- coverage | コーパスからカバレッジ生成 |
cargo run -r -- trace <input> | 単一ステップ 入力トレース |
cargo run -r -- minimize <input> | クラッシュ 入力を縮小 |
スナップショット ファジングが勝つ場所
| Target characteristic | Conventional fuzzing | Snapchange |
|---|
| Expensive startup | 毎反復支払う | 1度支払う |
| Requires auth/handshake | 到達困難 | スナップショット その過去 |
| Stateful protocol | 困難 | スナップショット 中セッション |
| Kernel/hypervisor code | 非常に困難 | 自然な適合 |
カバレッジ & トリアージ
| Capability | Note |
|---|
| Breakpoint coverage | ベーシック ブロック上のブレークポイント経由 カバレッジ |
| Crash dedup | 障害アドレス/状態でグループ化 |
| Single-step traces | 与えられた 入力の完全な命令 トレース |
| Memory inspection | クラッシュ時にゲスト メモリー読む |
Snapchange対他のファザー
| Aspect | Snapchange | AFL++ | LibAFL (Nyx) | syzkaller |
|---|
| Execution | KVMスナップショット リストア | プロセス フォーク | スナップショット(Nyx) | VM + syscall |
| Setup cost | 1度支払う | 毎反復 | 1度 | VM当たり |
| Target | VMスナップショットのものすべて | ユーザースペース バイナリー | 設定可能 | OSカーネル |
| Effort | 高い(Rustファザー書く) | 低い | 高い | 中程度 |
LibAFL(スナップショット バックエンドも提供)およびカーネル syscall ファジング用syzkallerと比較。
リソース