از 27 مارس 2025، توصیه می کنیم از android-latest-release
به جای aosp-main
برای ساختن و کمک به AOSP استفاده کنید. برای اطلاعات بیشتر، به تغییرات AOSP مراجعه کنید.
AIDL fuzzing
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
fuzzer با وارد کردن یا فراخوانی آن از طریق خرد تولید شده به عنوان یک مشتری برای سرویس راه دور رفتار می کند:
استفاده از C++ API:
#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;
}
استفاده از Rust API:
#![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);
});
چارچوبی برای مبهم کردن خدمات AIDL
همانطور که در مثال بالا نشان داده شده است، fuzzService در fuzzer فراخوانی می شود و یک IBinder (سرویس) و dataProvider را به عنوان پارامترهای ورودی می گیرد. ابتدا یک شی بسته تصادفی را با استفاده از ارائهدهنده داده مقداردهی میکند و با استفاده از بسته ورودی، متد تراکنش را در سرویس راه دور فراخوانی میکند و در نهایت پاسخ را در یک بسته پاسخ دریافت میکند.
fuzzer ها را بسازید و اجرا کنید
Fuzzers به طور پیش فرض با پوشش ساخته شده است.
برای کشف مشکلات حافظه، ضدعفونیکنندههای زیر توصیه میشوند. ضدعفونیکنندههای hwaddress
فقط با معماری arm
کار میکنند:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
هنگام اجرا با libFuzzer
، ممکن است یک مجموعه، که یک دایرکتوری است، در فایل Android.bp
مشخص شود، و می توانید این فهرست را به fuzzer ارسال کنید. برخی از fuzzer ها همچنین یک dictionary:
در فایل Android.bp
خود مشخص می کنند، و می توانید آن را با -dict path/to/dict
به libFuzzer ارسال کنید. برای گزینههای بیشتر، به مستندات رسمی libFuzzer مراجعه کنید.
برای اجرای fuzzer ها روی دستگاه، adb sync data
و سپس adb shell data/fuzz/ arch / name / name
را اجرا کنید. برای اجرای fuzzer ها در میزبان، $ANDROID_HOST_OUT/ fuzz / arch / name / name
را اجرا کنید.
fuzzer ها را برای خدمات جدید یا موجود توصیه کنید
سیستم ساخت بررسی می کند که آیا هر سرویس بایندر AOSP یک ورودی fuzzer در اتصالات فازر سرویس دارد یا خیر. تست اتصال Fuzzer بررسی می کند که هر سرویس در service_contexts
دارای یک fuzzer باشد. اگر یک fuzzer یا استثنا برای یک سرویس جدید پیدا نشد، یک خطای ساخت وجود دارد.
یک fuzzer خودکار سرویس ++C را میتوان با افزودن موارد زیر نوشت (جاوا و Rust fuzzer هنوز پشتیبانی نمیشوند):
- یک ورودی
cc_fuzz
در Android.bp
برای تعریف ماژول fuzzer. ماژول cc_default
service_fuzzer_defaults
وابستگی های مورد نیاز برای fuzzService
دارد. - وابستگی های خاص سرویس باید به عنوان یک کتابخانه یا به عنوان منبع اضافه شوند.
- یک فایل اصلی که سرویس شما را می سازد و
fuzzService
را فراخوانی می کند
برای دستورالعمل های دقیق در مورد استفاده از cc_fuzz
، به مستندات Fuzzing with libFuzzer مراجعه کنید. برای رفع خطای ساخت، اتصالات را با نام سرویس جدید و fuzzer به روز کنید. برای سرویس های جاوا یا Rust، لیست fuzzer می تواند خالی باشد.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی."],[],[],null,["# AIDL fuzzing\n\nThe fuzzer behaves as a client for the remote service by importing or invoking\nit through the generated stub:\n\nUsing C++ API: \n\n #include \u003cfuzzbinder/libbinder_ndk_driver.h\u003e\n #include \u003cfuzzer/FuzzedDataProvider.h\u003e\n\n #include \u003candroid-base/logging.h\u003e\n #include \u003candroid/binder_interface_utils.h\u003e\n\n using android::fuzzService;\n using ndk::SharedRefBase;\n\n extern \"C\" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {\n auto binder = ndk::SharedRefBase::make\u003cMyService\u003e(...);\n\n fuzzService(binder-\u003easBinder().get(), FuzzedDataProvider(data, size));\n\n return 0;\n }\n\nUsing Rust API: \n\n #![allow(missing_docs)]\n #![no_main]\n #[macro_use]\n extern crate libfuzzer_sys;\n\n use binder::{self, BinderFeatures, Interface};\n use binder_random_parcel_rs::fuzz_service;\n\n fuzz_target!(|data: &[u8]| {\n let service = BnTestService::new_binder(MyService, BinderFeatures::default());\n fuzz_service(&mut service.as_binder(), data);\n });\n\nFramework to fuzz AIDL services\n-------------------------------\n\nAs shown in the example above,\n[fuzzService](https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/native/libs/binder/tests/parcel_fuzzer/libbinder_driver.cpp)\nis called in the fuzzer and takes in an IBinder (Service) and dataProvider as\ninput parameters. It first initializes a random Parcel object using the data\nprovider and call the transact method on the remote service by using the input\nparcel, and finally get the reply into a reply parcel.\n\nBuild and run fuzzers\n---------------------\n\nFuzzers are built with coverage by default.\n\nThe following sanitizers are recommended to discover memory issues.\n`hwaddress` sanitizers only run on `arm` architecture: \n\n SANITIZE_HOST=address SANITIZE_TARGET=hwaddress\n\nWhen running with `libFuzzer`, a corpus, which is a directory, may be specified\nin the `Android.bp` file, and you can pass this directory to the fuzzer. Some\nfuzzers also specify a `dictionary:` in their `Android.bp` file, and you can\npass this to libFuzzer with `-dict `\u003cvar translate=\"no\"\u003epath/to/dict\u003c/var\u003e. For\nmore options, see the\n[official libFuzzer documentation](https://llvm.org/docs/LibFuzzer.html).\n\nTo run fuzzers on device, run `adb sync data` and then\n`adb shell data/fuzz/`\u003cvar translate=\"no\"\u003earch\u003c/var\u003e`/`\u003cvar translate=\"no\"\u003ename\u003c/var\u003e`/`\u003cvar translate=\"no\"\u003ename\u003c/var\u003e.\nTo run fuzzers on host, run\n`$ANDROID_HOST_OUT/`\u003cvar translate=\"no\"\u003efuzz\u003c/var\u003e`/`\u003cvar translate=\"no\"\u003earch\u003c/var\u003e`/`\u003cvar translate=\"no\"\u003ename\u003c/var\u003e`/`\u003cvar translate=\"no\"\u003ename\u003c/var\u003e.\n\nRecommend fuzzers for new or existing services\n----------------------------------------------\n\nThe build system checks whether every AOSP binder service has a fuzzer entry in\n[service fuzzer bindings](https://cs.android.com/android/platform/superproject/+/android-latest-release:system/sepolicy/build/soong/service_fuzzer_bindings.go).\nThe Fuzzer binding test checks that every service in `service_contexts` has a\nfuzzer. If a fuzzer or exception isn't found for a new service, there's a build\nerror.\n\nAn automatic C++ service fuzzer can be written by adding the following (Java and\nRust fuzzers are not yet supported):\n\n- A `cc_fuzz` entry in `Android.bp` to define the fuzzer module. The `cc_default` module `service_fuzzer_defaults` has dependencies required for `fuzzService`.\n- Service-specific dependencies should be added as a library or as sources.\n- A main file that constructs your service and calls `fuzzService`\n\nFor detailed instructions on using `cc_fuzz`, see the\n[Fuzzing with libFuzzer](/docs/security/test/libfuzzer)\ndocumentation. To resolve build error, update bindings with the new service and\nfuzzer names. For Java or Rust services, the fuzzer list can be empty."]]