
Android APEX 키 재사용 취약점에 대한 개념 증명 코드
이 저장소는 Meta Red Team X 취약점 공개를 함께 제공하기 위해 현 상태 그대로 제공됩니다. 공식 Meta 프로젝트가 아니며 공식 프로젝트처럼 지원되지 않습니다.
AOSP의 테스트 키로 서명된 APEX를 탑재한 Android 기기의 탐지 및 익스플로잇을 보여주는 스크립트와 아티팩트 모음입니다. 자세한 내용은 블로그 게시물 "누락된 서명: 여러 브랜드가 Android의 핵심 요소를 보호하는 방법을 잊어버린 방법"을 참조하세요.
apex-checker/: 알려진 테스트 키의 다이제스트를 저장하고 대량의 APEX에서 해당 키의 서명을 확인하는 Bash 스크립트 세트입니다.apex-forger/: AOSP의 apexer 및 deapexer 도구에 대한 경량 래퍼로, APEX를 쉽게 풀고, 수정하고, 다시 패키징할 수 있습니다. APEX용 apktool과 같습니다.vndk-libt/: 취약한 APEX에 추가하여 코드 실행이 가능함을 증명하기 위해 만든 라이브러리의 소스 코드입니다. 이 라이브러리는 로드하는 각 프로세스의 명령줄을 logcat에 출력하는 기능만 합니다.m apexer deapexer apksigner를 실행하여 필요한 도구를 빌드합니다.envsetup.sh (여기 있는 파일, AOSP에 있는 파일이 아님)를 업데이트하여 $AOSP와 $ANDROID_HOST_OUT을 적절한 위치로 지정합니다.adb shell getprop ro.build.version.sdk 및 adb shell getprop ro.vndk.version을 실행합니다.adb pull /system/apex/com.android.vndk.current.apex vndk.apex를 실행합니다. 일치하지 않으면 adb pull /system_ext/apex/com.android.vndk.v<NN>.apex vndk.apex를 실행합니다. 여기서 <NN>은 ro.vndk.version입니다.apex-checker/check.sh vndk.apex로 APEX가 취약한지 확인합니다. 출력이 "OI"(외부 및 내부 서명 모두 테스트 키에서 왔음을 나타냄)로 시작하지 않으면 이 PoC를 사용할 수 없습니다. (단, 이는 기기가 안전하다는 것을 보장하지 않으며 다른 APEX가 여전히 취약할 수 있습니다.)apex-forger/unpack.sh vndk.apex vndk로 APEX를 압축 해제합니다.libutils.so를 패치하여 삽입된 libt.so를 로드하도록 시도합니다: git apply --directory=vndk vndk-libt/libutils-v31.patch. 작동하지 않으면(예: 다른 VNDK 버전) 16진수 편집기를 사용하여 vndk/payload/lib64/libutils.so의 적절한 DT_NEEDED에서 libc.so를 libt.so로 수동으로 변경합니다.vndk-libt/ 내에서 ndk-build를 실행하여 libt.so를 빌드합니다. vndk-libt/libs/arm64-v8a/libt.so를 vndk/payload/lib64/libt.so로 복사합니다.apex_build_info.bp에서 canned_fs_config를 추출합니다. 이를 쉽게 수행하는 도구는 없습니다. 가장 가까운 방법은 protoc --decode_raw <vndk/apex_build_info.bp를 실행한 다음 필드 #3을 수동으로 이스케이프 해제하는 것입니다. canned_fs_config를 vndk/에 배치합니다.canned_fs_config에 /lib64/libt.so에 대한 줄을 추가합니다.apex-forger/repack.sh vndk com.android.vndk.v<NN>.{pem,pubkey,pk8,x509.pem}으로 APEX를 다시 패키징합니다.adb install vndk/forged.apex를 실행합니다.adb reboot && adb logcat -s RTXPoC:D를 실행합니다.RTXPoC 로그 메시지를 관찰합니다.apex-checker/apk-keys.txt 및 apex-checker/avb-keys.txt의 해시는 다음 APEX의 외부 및 내부 테스트 키에 해당합니다. 또한 초기 보고 후 Google이 생성한 두 목록의 -goog 변형도 있습니다. 이러한 목록은 일반적으로 더 완전하지만 정확히 어떤 키가 포함되어 있는지는 알 수 없습니다.