mô-đun lông tơ

Tính năng làm mờ Rust được hỗ trợ thông qua thùng libfuzzer-sys , cung cấp các liên kết với công cụ làm mờ libFuzzer của LLVM. Để biết thêm thông tin, hãy xem kho lưu trữ libfuzzer-sys cũng như trang dự án LLVM libFuzzer .

Mô-đun rust_fuzz tạo ra một nhị phân fuzzer bắt đầu mờ khi nó chạy (tương tự như các mô-đun cc_fuzz ). Khi bộ làm mờ tận dụng công cụ làm mờ libFuzzer , nó có thể cần một số đối số để kiểm soát việc làm mờ. Chúng được liệt kê trong tài liệu libFuzzer .

Các mô-đun rust_fuzz là phần mở rộng của các mô-đun rust_binary và do đó có chung các thuộc tính và cân nhắc. Ngoài ra, chúng còn triển khai nhiều thuộc tính và chức năng giống như mô-đun cc_fuzz .

Khi xây dựng các mô-đun rust_fuzz , cờ --cfg fuzzing được phát ra. Cờ này có thể được sử dụng để hỗ trợ việc biên dịch mã thư viện có điều kiện nhằm cải thiện việc làm mờ.

Viết một fuzzer Rust cơ bản

Bạn có thể xác định mô-đun fuzz trong tệp xây dựng Android.bp bằng mã này:

rust_fuzz {
    name: "example_rust_fuzzer",
    srcs: ["fuzzer.rs"],

    // Config for running the target on fuzzing infrastructure can be set under
    // fuzz_config. This shares the same properties as cc_fuzz's fuzz_config.
    fuzz_config: {
        fuzz_on_haiku_device: true,
        fuzz_on_haiku_host: false,
    },

    // Path to a corpus of sample inputs, optional. See https://llvm.org/docs/LibFuzzer.html#corpus
    corpus: ["testdata/*"],

    // Path to a dictionary of sample byte sequences, optional. See https://llvm.org/docs/LibFuzzer.html#dictionaries
    dictionary: "example_rust_fuzzer.dict",
}

Tệp fuzzer.rs chứa một bộ mờ đơn giản:

fn heap_oob() {
    let xs = vec![0, 1, 2, 3];
    let val = unsafe { *xs.as_ptr().offset(4) };
    println!("Out-of-bounds heap value: {}", val);
}

fuzz_target!(|data: &[u8]| {
    let magic_number = 327;
    if data.len() == magic_number {
        heap_oob();
    }
});

Đây fuzz_target!(|data: &[u8]| { /* fuzz using data here */ }); xác định điểm vào mục tiêu fuzz được gọi bởi công cụ libFuzzer . Đối số data là một chuỗi byte được cung cấp bởi công cụ libFuzzer để được xử lý làm đầu vào nhằm làm mờ hàm mục tiêu.

Trong ví dụ này, bộ làm mờ chỉ kiểm tra độ dài của dữ liệu để xác định xem có nên gọi hàm heap_oob hay không, việc gọi hàm này sẽ dẫn đến kết quả đọc vượt quá giới hạn. libFuzzer là một bộ làm mờ hướng dẫn phạm vi bảo hiểm, do đó, nó nhanh chóng hội tụ về độ dài có vấn đề vì nó xác định rằng 326 B dữ liệu đầu tiên không dẫn đến các đường dẫn thực thi mới.

Tìm ví dụ này, trong cây, tại tools/security/fuzzing/example_rust_fuzzer/ . Để xem một ví dụ phức tạp hơn một chút về một bộ mờ khác (làm mờ phần phụ thuộc rustlib ) trong cây, hãy xem Legacy_blob_fuzzer .

Để được hướng dẫn về cách viết bộ mờ Rust nhận biết cấu trúc , hãy xem sách Rust Fuzz , tài liệu chính thức cho dự án Rust Fuzz.