cargo-fuzz - Rustをlibfuzzerでファジング チートシート
cargo-fuzzはRustコードをファザーする標準方法。ライブラリー処理されたワークフロー:ファザー ターゲットを書く 任意バイトを取りlibfuzzerCargoネイティブ、cargo fuzz runを実行、カバレッジガイド付きファジング狩り パニック、算術オーバーフロー、および—unsafeコード—本当の メモリー エラー。安全Rustはメモリー 腐敗を防ぎ、パニック、無限ループ、またはロジック バグを防ぎません、CFF 依存関係はメモリー クラス 全体を再導入します。
インストール
| Step | Command |
|---|
| Install | cargo install cargo-fuzz |
| Nightly required | rustup install nightly(libFuzzer 夜 必要) |
| Initialize | cargo fuzz init(クレートで) |
| Verify | cargo fuzz --version |
ファザー ターゲット作成
cargo fuzz init # fuzz/ディレクトリー作成
cargo fuzz add parse_input # 新しいターゲット作成
// fuzz/fuzz_targets/parse_input.rs
#![no_main]
use libfuzzer_sys::fuzz_target;
fuzz_target!(|data: &[u8]| {
if let Ok(s) = std::str::from_utf8(data) {
let _ = my_crate::parse(s); // ここパニック 検査結果
}
});
実行
| Command | Description |
|---|
cargo fuzz run parse_input | ターゲット ファザー |
cargo fuzz run parse_input -- -max_total_time=300 | 5分で実行 |
cargo fuzz run parse_input -j 8 | 8並列ジョブ |
cargo fuzz list | ターゲット リスト |
cargo fuzz build | ビルド実行なし |
任意で構造化入力
ロー バイトは時間入力パーサー即座に拒否に無駄。arbitraryクレート 構築型値 代わりに:
use arbitrary::Arbitrary;
#[derive(Arbitrary, Debug)]
struct Config { name: String, retries: u8, enabled: bool }
fuzz_target!(|cfg: Config| {
let _ = my_crate::apply_config(cfg);
});
| Benefit | Why |
|---|
| Valid-shaped inputs | より深いロジック到達 |
| Typed targets | API ファザー、パーサー だけではなく |
Debug output | 読み取り可能な 再ジューサー |
サニタイザー
| Sanitizer | Flag |
|---|
| AddressSanitizer (default) | -s address |
| LeakSanitizer | ASanに含まれる |
| MemorySanitizer | -s memory |
| ThreadSanitizer | -s thread |
| None (faster) | -s none |
# ASan持つ unsafe FFI コードをファザー
cargo fuzz run ffi_target -s address
コーパスおよびカバレッジ
| Command | Purpose |
|---|
fuzz/corpus/<target>/ | 興味深い 入力 蓄積ところ |
cargo fuzz cmin <target> | コーパス 最小化 |
cargo fuzz tmin <target> <input> | クラッシュ 入力を最小化 |
cargo fuzz coverage <target> | カバレッジ データ生成 |
| Seed corpus | 有効な 例でブートストラップ |
コーパスをシード 実在する、有効な 例で入力:単一最も効果的なファジングを高速生産的にするする方法。
クラッシュを再現
# クラッシュfuzz/artifacts/<target>/ランド
cargo fuzz run parse_input fuzz/artifacts/parse_input/crash-abc123
# 最小ケースに縮小
cargo fuzz tmin parse_input fuzz/artifacts/parse_input/crash-abc123
最小化 入力をレギュラー#[test]にバグにとどまります。
Rustでファザー何
| Good target | Why |
|---|
| Parsers / deserializers | 信頼できない入力、複雑状態 |
unsafe blocks | メモリー安全性 実際に危険 |
| FFI boundaries | C コード後面 |
| Protocol/state machines | 順序バグ |
| Compression / encoding | 古典的なバグ テリトリー |
| Less useful | Why |
|---|
| Pure safe arithmetic | パニック通常明白 |
| Thin wrappers | ロジック少ない探索 |
cargo-fuzz対他のファザー
| Aspect | cargo-fuzz | AFL++ (afl.rs) | LibAFL | honggfuzz-rs |
|---|
| Engine | libFuzzer | AFL++ | カスタム | honggfuzz |
| Setup | Rust用最簡単 | 中程度 | 独自に構築 | 簡単 |
| Structured input | arbitrary | arbitrary | カスタム タイプ | arbitrary |
| Best for | 標準Rust ファジング | 永続/バイナリー モード | 異常なターゲット | ハードウェア フィードバック |
Rust 以外ターゲット用AFL++またはhonggfuzzを参照;カスタム ファザー用LibAFL。
リソース