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 để tạo lỗi ngẫu nhiên cho các 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 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 đầu vào, cuối cùng là nhận được phản hồi vào một gói phản hồ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 sử 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
, bạn có thể chỉ định một tập sao lục (là một thư mục)
trong tệp Android.bp
, rồi bạn có thể chuyển thư mục này đến trình kiểm thử mờ. Hơi nhiều
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 tuỳ 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 kiểm thử mờ trên máy chủ lưu trữ, hãy chạy
$ANDROID_HOST_OUT/fuzz/arch/name/name
.
Đề xuất trình tìm lỗi mã nguồn cho các dịch vụ mới hoặc hiện có
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 fuzzer trong
liên kết kiểm thử mờ dịch vụ.
Kiểm thử liên kết mờ kiểm tra để đảm bảo rằng mọi dịch vụ trong service_contexts
có một
kiểm thử mờ. Nếu không tìm thấy trình tạo dữ liệu ngẫu nhiên hoặc ngoại lệ cho một 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 mờ. Chiến lược phát hành đĩa đơn Mô-đuncc_default
service_fuzzer_defaults
có các phần phụ thuộc bắt buộc đối vớifuzzService
. - 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
Kiểm thử mờ bằng libFuzzer
. Để khắc phục lỗi bản dựng, hãy cập nhật các mối liên kết bằng dịch vụ mới và
tên kiểm thử mờ. Đố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.