2025년 3월 27일부터 AOSP를 빌드하고 기여하려면 aosp-main
대신 android-latest-release
를 사용하는 것이 좋습니다. 자세한 내용은 AOSP 변경사항을 참고하세요.
AIDL 퍼징
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
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 서비스를 퍼징하기 위한 프레임워크
위의 예와 같이 fuzzer에서 fuzzService를 호출하고 fuzzService는 IBinder(서비스)와 dataProvider를 입력 매개변수로 사용합니다. 먼저 데이터 제공업체를 사용하여 임의의 Parcel 객체를 초기화하고 입력 parcel을 사용하여 원격 서비스에서 transact 메서드를 호출합니다. 그런 다음 마지막으로 응답 parcel에 응답을 가져옵니다.
퍼저 빌드 및 실행
퍼저는 기본적으로 적용 범위로 빌드됩니다.
메모리 문제를 발견하려면 다음 새니타이저를 사용하는 것이 좋습니다.
hwaddress
정리기는 arm
아키텍처에서만 실행됩니다.
SANITIZE_HOST=address SANITIZE_TARGET=hwaddress
libFuzzer
로 실행할 때는 디렉터리인 자료가 Android.bp
파일에 지정될 수 있으며 이 디렉터리를 fuzzer에 전달할 수 있습니다. 일부 퍼저는 Android.bp
파일에서 dictionary:
를 지정하기도 하며, 이를 -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 항목이 있는지 확인합니다.
Fuzzer 바인딩 테스트는 service_contexts
의 모든 서비스에 fuzzer가 있는지 확인합니다. 새 서비스에 fuzzer 또는 예외가 없으면 빌드 오류가 발생합니다.
다음을 추가하여 자동 C++ 서비스 fuzzer를 작성할 수 있습니다(Java 및 Rust fuzzer는 아직 지원되지 않음).
Android.bp
에 cc_fuzz
항목을 사용해 fuzzer 모듈을 정의합니다. cc_default
모듈 service_fuzzer_defaults
는 fuzzService
에 요구되는 종속 항목을 갖습니다.
- 서비스별 종속 항목은 라이브러리 또는 소스로 추가되어야 합니다.
- 서비스를 구성하며
fuzzService
를 호출하는 기본 파일입니다.
cc_fuzz
사용에 관한 자세한 안내는 libFuzzer를 사용한 퍼징 문서를 참고하세요. 빌드 오류를 해결하려면 새 서비스와 fuzzer 이름으로 결합을 업데이트하세요. Java 또는 Rust 서비스의 경우 fuzzer 목록이 비어 있을 수 있습니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[[["이해하기 쉬움","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(UTC)"],[],[],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."]]