AIDL Fuzzing

Bộ làm mờ hoạt động như một máy khách cho dịch vụ từ xa bằng cách nhập/gọi nó thông qua sơ khai được tạo:

Sử dụng API C++:

#include <fuzzbinder/libbinder_ndk_driver.h>
#include <fuzzer/FuzzedDataProvider.h>

#include <android-base/logging.h>
#include <android/binder_interface_utils.h>

using android::fuzzService;
using ndk::SharedRefBase;

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
    auto binder = ndk::SharedRefBase::make<MyService>(...);

    fuzzService(binder->asBinder().get(), FuzzedDataProvider(data, size));

    return 0;
}

Sử dụng API Rust:

#![allow(missing_docs)]
#![no_main]
#[macro_use]
extern crate libfuzzer_sys;

use binder::{self, BinderFeatures, Interface};
use binder_random_parcel_rs::fuzz_service;

fuzz_target!(|data: &[u8]| {
    let service = BnTestService::new_binder(MyService, BinderFeatures::default());
    fuzz_service(&mut service.as_binder(), data);
});

Khung để làm mờ các dịch vụ AIDL

Như được hiển thị trong ví dụ trên, fuzzService được gọi trong fuzzer và lấy IBinder (Service) và dataProvider làm tham số đầu vào. Đầu tiên, nó khởi tạo một đối tượng Bưu kiện ngẫu nhiên bằng cách sử dụng nhà cung cấp dữ liệu và gọi phương thức giao dịch trên dịch vụ từ xa bằng cách sử dụng bưu kiện đầu vào và cuối cùng nhận được phản hồi vào bưu kiện trả lời.

Xây dựng và chạy fuzzer

Fuzzers được xây dựng với mức độ phù hợp theo mặc định.

Các chất khử trùng sau đây được khuyên dùng để phát hiện các vấn đề về bộ nhớ. chất khử trùng hwaddress chỉ chạy trên kiến ​​trúc arm :

SANITIZE_HOST=address SANITIZE_TARGET=hwaddress

Khi chạy với libFuzzer , một kho văn bản là một thư mục có thể được chỉ định trong tệp Android.bp và bạn có thể chuyển thư mục này tới fuzzer. Một số bộ làm mờ cũng chỉ định một dictionary: trong tệp Android.bp của họ và bạn có thể chuyển nó tới libFuzzer bằng -dict path/to/dict . Để có thêm tùy chọn, hãy xem tài liệu libFuzzer chính thức .

Để chạy bộ làm mờ trên thiết bị, hãy chạy adb sync data và sau đó chạy adb shell data/fuzz/ arch / name / name . Để chạy bộ làm mờ trên máy chủ, hãy chạy $ANDROID_HOST_OUT/ fuzz / arch / name / name .

Hệ thống xây dựng sẽ kiểm tra xem mọi dịch vụ liên kết AOSP có mục nhập fuzzer trong các liên kết fuzzer dịch vụ hay không. Kiểm tra ràng buộc Fuzzer kiểm tra xem mọi dịch vụ trong service_contexts đều có bộ mờ hay không. Nếu không tìm thấy bộ làm mờ/ngoại lệ cho một dịch vụ mới thì đó là lỗi xây dựng.

Một bộ làm mờ dịch vụ C++ tự động có thể được viết bằng cách thêm vào phần sau (bộ làm mờ Java và Rust chưa được hỗ trợ):

  • Mục nhập cc_fuzz trong Android.bp để xác định mô-đun bộ mờ. Mô-đun cc_default service_fuzzer_defaults có các phần phụ thuộc cần thiết cho fuzzService .
  • Các phần phụ thuộc dành riêng cho dịch vụ phải được thêm dưới dạng thư viện hoặc dưới dạng nguồn.
  • Một tệp chính xây dựng dịch vụ của bạn và gọi fuzzService

Để biết hướng dẫn chi tiết về cách sử dụng cc_fuzz , hãy xem tài liệu Làm mờ bằng libFuzzer . Để giải quyết lỗi xây dựng, hãy cập nhật các liên kết với tên dịch vụ và bộ điều khiển mới. Đối với các dịch vụ Java/Rust, danh sách fuzzer có thể trống.