Trình tạo dữ liệu ngẫu nhiên hoạt động như một ứng dụng 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 đượ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ờ dịch vụ AIDL
Như trong ví dụ trên, fuzzService được gọi trong trình tạo dữ liệu ngẫu nhiên và lấy IBinder (Dịch vụ) và dataProvider làm tham số đầu vào. Trước tiên, lớp này khởi tạo 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 đầu vào, cuối cùng nhận được thư trả lời vào một gói trả lời.
Tạo và chạy trình tìm lỗi mã nguồn
Trình tìm lỗi mã nguồn được tạo bằng mức độ sử dụng theo mặc định.
Bạn nên dùng các trình dọn dẹp sau để 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 với libFuzzer
, bạn có thể chỉ định một tập hợp văn bản (corpus) là một thư mục trong tệp Android.bp
và bạn có thể truyền thư mục này đến trình tìm lỗi mã nguồn. 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 tìm lỗi mã nguồn trên thiết bị, hãy chạy adb sync data
rồi chạy adb shell data/fuzz/arch/name/name
.
Để chạy trình tìm lỗi mã nguồn trên máy chủ lưu trữ, hãy chạy $ANDROID_HOST_OUT/fuzz/arch/name/name
.
Đề xuất trình kiểm thử mờ cho các dịch vụ mới hoặc hiện có
Hệ thống xây dựng kiểm tra xem mọi dịch vụ liên kết AOSP có mục nhập trình tạo dữ liệu ngẫu nhiên trong các liên kết trình tạo dữ liệu ngẫu nhiên của dịch vụ hay không.
Kiểm thử liên kết trình tạo dữ liệu ngẫu nhiên kiểm tra để đảm bảo rằng mọi dịch vụ trong service_contexts
đều có trình tạo dữ liệu ngẫu nhiên. Nếu không tìm thấy trình 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 tìm lỗi mã nguồn tự động cho dịch vụ C++ bằng cách thêm các trình tìm lỗi mã nguồn sau (chưa hỗ trợ trình tìm lỗi mã nguồn Java và Rust):
- Mục nhập
cc_fuzz
trongAndroid.bp
để xác định mô-đun trình tìm lỗi mã nguồn. Mô-đuncc_default
service_fuzzer_defaults
có các phần phụ thuộc bắt buộc chofuzzService
. - 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 tìm lỗi mã nguồn có thể trống.