اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release
بدلاً من aosp-main
لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
فحص لغة تعريف واجهة نظام Android (AIDL) بحثًا عن الثغرات
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
يتصرّف أداة التدقيق العشوائي كعميل للخدمة البعيدة من خلال استيرادها أو استدعاؤها
من خلال الرمز البرمجي الذي تم إنشاؤه:
باستخدام واجهة برمجة التطبيقات 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;
}
باستخدام 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);
});
إطار عمل لتشويه خدمات لغة تعريف واجهة نظام Android
كما هو موضّح في المثال أعلاه، يتم استدعاء fuzzService في أداة التدقيق ويتلقّى IBinder (خدمة) وdataProvider كمَعلمات إدخال. أولاً، يتمّ إعداد عنصر Parcel عشوائي باستخدام مقدّم البيانات ويُستخدَم أسلوب المعاملة في الخدمة البعيدة باستخدام عنصر الإدخال Parcel، وفي النهاية يتمّ الحصول على الردّ في عنصر الردّ.
إنشاء برامج البحث عن الأخطاء وتشغيلها
يتم إنشاء برامج التزييف مع تغطية تلقائيًا.
يُنصح باستخدام أدوات التطهير التالية لاكتشاف مشاكل الذاكرة.
لا تعمل hwaddress
المطهّرات إلا على بنية arm
:
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
عند التشغيل باستخدام libFuzzer
، يمكن تحديد ملف نصي، وهو دليل،
في ملف Android.bp
، ويمكنك تمرير هذا الدليل إلى أداة البحث عن الأخطاء. تحدِّد بعض
أداة التحكّم في الأخطاء أيضًا dictionary:
في ملف Android.bp
، ويمكنك
تمرير هذا إلى libFuzzer باستخدام -dict path/to/dict
. للحصول على
مزيد من الخيارات، يُرجى الاطّلاع على
مستندات libFuzzer الرسمية.
لتشغيل برامج البحث عن الأخطاء على الجهاز، شغِّل adb sync data
ثم
adb shell data/fuzz/arch/name/name
.
لتشغيل برامج البحث عن الأخطاء على المضيف، شغِّل
$ANDROID_HOST_OUT/fuzz/arch/name/name
.
اقتراح برامج البحث العشوائي للخدمات الجديدة أو الحالية
يتحقّق نظام الإنشاء ممّا إذا كانت كل خدمة ربط في AOSP تحتوي على إدخال لأداة تحقُّق الأخطاء في
عمليات ربط أداة تحقُّق الأخطاء في الخدمة.
يتحقّق اختبار ربط أداة التزييف من أنّ كل خدمة في service_contexts
تحتوي على
أداة تحقُّق من الأخطاء. إذا لم يتم العثور على أداة تحقُّق من الأخطاء أو استثناء لخدمة جديدة، يعني ذلك أنّ هناك خطأ في عملية الإنشاء.
يمكن كتابة أداة تلقائية لفحص أخطاء الخدمات بلغة C++ من خلال إضافة ما يلي (لا تتوفّر أدوات فحص أخطاء Java و
Rust بعد):
- إدخال
cc_fuzz
في Android.bp
لتحديد وحدة أداة البحث عن الأخطاء تحتوي وحدة
cc_default
service_fuzzer_defaults
على تبعيات مطلوبة ل
fuzzService
.
- يجب إضافة التبعيات الخاصة بالخدمة كمكتبة أو كمصادر.
- ملف رئيسي ينشئ خدمتك ويتصل بـ
fuzzService
للحصول على تعليمات مفصّلة حول استخدام cc_fuzz
، يُرجى الاطّلاع على مستندات
الفحص العشوائي باستخدام libFuzzer. لحلّ خطأ الإنشاء، عدِّل عمليات الربط باستخدام اسمَي الخدمة و
أداة التدقيق الجديدَين. بالنسبة إلى خدمات Java أو Rust، يمكن أن تكون قائمة أداة البحث عن الأخطاء العشوائية فارغة.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","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-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],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."]]