Kiểm thử mờ AIDL

Trình kiểm thử mờ hoạt động như một ứng dụng khách cho dịch vụ từ xa bằng cách nhập hoặc gọi dịch vụ đó thông qua mã giả lập đã 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ờ dịch vụ AIDL

Như đã trình bày trong ví dụ trên, fuzzService được gọi trong trình mờ và nhận IBinder (Dịch vụ) và dataProvider làm tham số đầu vào. Trước tiên, hệ thống sẽ khởi chạy một đối tượng Parcel ngẫu nhiên bằng cách sử dụng trì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 gói dữ liệu đầu vào, cuối cùng là nhận thư trả lời trong gói trả lời.

Tạo và chạy trình kiểm thử mờ (fuzzer)

Theo mặc định, trình mờ được tạo với mức độ bao phủ.

Bạn nên dùng các trình dọn dẹp sau đây để phát hiện các vấn đề về bộ nhớ. Trình dọn dẹp hwaddress chỉ chạy trên cấu trúc arm:

SANITIZE_HOST=address SANITIZE_TARGET=hwaddress

Khi chạy bằng libFuzzer, một tập sao lục 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 đến trình kiểm thử mờ. Một số trình kiểm thử mờ cũng chỉ định dictionary: trong tệp Android.bp và bạn có thể truyền mã này đến libFuzzer bằng -dict path/to/dict. Để biết thêm lựa chọn, hãy xem tài liệu chính thức về libFuzzer.

Để chạy trình kiểm thử mờ trên thiết bị, hãy chạy adb sync data rồi adb shell data/fuzz/arch/name/name. Để chạy trình kiểm thử mờ trên máy chủ lưu trữ, 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 (Dự án nguồn mở Android) có mục nhập mờ trong liên kết trình kiểm thử mờ dịch vụ hay không. Quy trình kiểm thử liên kết mờ sẽ kiểm tra để đảm bảo mọi dịch vụ trong service_contexts đều có trình kiểm thử mờ (fuzzer). Nếu không tìm thấy trình kiểm thử mờ hoặc ngoại lệ cho dịch vụ mới, thì sẽ có lỗi bản dựng.

Bạn có thể viết trình kiểm thử mờ dịch vụ C++ tự động bằng cách thêm đoạn mã sau (các trình kiểm thử mờ Java và Rust chưa được hỗ trợ):

  • Mục nhập cc_fuzz trong Android.bp để xác định mô-đun mờ. Mô-đun cc_default service_fuzzer_defaults có các phần phụ thuộc bắt buộc cho fuzzService.
  • Bạn nên thêm các phần phụ thuộc dành riêng cho dịch vụ dưới dạng thư viện hoặc nguồn.
  • Tệp chính để tạo dịch vụ 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 về Làm mờ bằng libFuzzer. Để khắc phục lỗi bản dựng, hãy cập nhật các liên kết bằng tên dịch vụ và trình kiểm thử mờ (fuzzer) mới. Đối với các dịch vụ Java hoặc Rust, danh sách trình kiểm thử mờ có thể để trống.