CORE SECURITY

Anuncio
CORE SECURITY
2 threads, 1 app (Inyección en Dalvik VM)
Martín Balao | [email protected]
Martín Fernández | [email protected]
Octubre 2014
PA G E
Introducción
PA G E 2
¿Qué es un Web View?
Aplication
View
WebView
HTML + JS
PA G E 3
WebView + addJavascriptInterface
Puente
HTML + JS
PA G E 4
Objeto Java
Expuesto
addJavascriptInterface exploit – Java Reflection
Clase A
forName(Clase B)
getClass()
Objeto Java
expuesto
Puente
JS
PA G E 5
Clase B
…
Método_Estático_B
Invocación de métodos
estáticos en clases Java
addJavascriptInterface exploit – OS commands
Clase A
forName(Java Runtime)
getClass()
Objeto Java
expuesto
Puente
JS
PA G E 6
Java
Runtime
…
exec
Inyección de OS
Commands
Vectores de ataque
Exploit (JS)
Client Side
Android
Browser
MitM
HTML + JS
HTML + JS
PA G E 7
Limitaciones del exploit – Java Reflection
• No se puede invocar métodos Java con tipos nonativos o String desde Javascript
• Por lo anterior:
• No se pueden instanciar objetos
• No se puede interactuar con otras aplicaciones
del ecosistema Android
PA G E 8
Limitaciones del exploit – OS Commands
• Hay un sand-boxing fuerte a nivel del sistema
operativo
• Permisos RWX en el sistema de archivos
• No se pueden instalar nuevas aplicaciones desde el
usuario de la aplicación vulnerada
• ¿Cómo interactuar con otras aplicaciones del
ecosistema Android?
PA G E 9
Limitaciones del exploit – OS Commands
• Es posible levantar una segunda Dalvik VM pero no
va a tener los permisos de la aplicación vulnerada:
UID + PID
process_id_500 user_id_1234 com.app.vulnerable
process_id_432 user_id_1234 com.app.maliciosa
PA G E 1 0
Comunicación en Android
• Context.ContentResolver
.query(URI(content://SMS))
PA G E 1 1
Objetivo
Usar los permisos de la aplicación
vulnerada para interactuar con otras
aplicaciones del ecosistema Android.
PA G E 1 2
Inyección en Dalvik VM
PA G E 1 3
Ejecutables en disco y memoria
PA G E 1 4
Mapa de memoria: cat /proc/<PID>/maps
• 00400000-0040b000 r-xp /bin/cat
• 00c9a000-00cbb000 rw-p [heap]
• 7fcada45a000-7fcada617000 r-xp /lib/libc-2.17.so
• 7fff9acc0000-7fff9ace1000 rw-p [stack]
PA G E 1 5
¿Qué entendemos por inyección?
PA G E 1 6
Cambio de contexto
PA G E 1 7
Ptrace - Debugging
• Attacharse a un thread de un proceso
• Leer memoria
• Escribir memoria
• Modificar contexto (leer y escribir)
• Continuar proceso y handlear señales
PA G E 1 8
Inyección clásica
PA G E 1 9
Problemas de la inyección clásica
• Compilar shellcode
• Alocar memoria
• Crear thread
• Resolver símbolos
• Para usar funciones de otras libs
PA G E 2 0
Inyección por dlopen
PA G E 2 1
Encontrar dlopen
PA G E 2 2
libAgent.so (C/C++, NDK)
#include <stdio.h>
#include <binder.h>
#include <jni.h>
__attribute__((constructor)) init_agent(){
pthread_create(agent_main_loop);
raise(SIGINT);
}
void agent_main_loop(){
sleep(5);
…
}
PA G E 2 3
Después de la inyección
PA G E 2 4
libAgent.so (C/C++, NDK)
#include <jni.h>
JavaVM* java_vm = AndroidRuntime::getJavaVM();
java_vm->AttachCurrentThread(…);
java_vm->GetEnv(…);
•
•
•
•
Instanciar objetos Java
Invocar métodos de objetos Java
Invocar métodos estáticos de clases Java
Acceder a variables estáticas de clases Java
PA G E 2 5
APK Load – Java Agent
PA G E 2 6
libAgent – Java Agent
• Desde libAgent puedo acceder a todas las clases Java
cargadas (ver métodos, atributos, instanciar)
• Desde Java Agent solo las de la SDK
• Pasar referencias a objetos desde libAgent a Java
Agent (ej. Activity Thread).
PA G E 2 7
Context
• En Java Agent, no podemos heredar de Activity:
¿Quién nos instancia?
PA G E 2 8
Activity Thread
Class ActivityThread(){
static Handler sMainThreadHandler
public static Application currentApplication()
¿ NULL ?
public static void main(String[] args)
}
PA G E 2 9
Ejecución en el Thread Principal
PA G E 3 0
Runnable
PA G E 3 1
Java Agent - Runnable
Class JavaAgent{
public static Context app_context;
public native Context get_context();
Class JavaAgentRunnable implements Runnable{
public void run(){
JavaAgent.app_context = get_context();
}
}
}
PA G E 3 2
Java Agent – Main loop
Class JavaAgent{
public static Context app_context;
public native Context get_context();
public void main_loop(){
JavaAgent.app_context.getContentResolver().
query(…)
}
}
PA G E 3 3
Demo
PA G E 3 4
Conclusiones
PA G E 3 5
Conclusiones
• Si podemos debuggear, el PID como parte de la autenticación
de una app puede ser bypasseado.
• APKs buildeados durante el desarrollo pueden terminar en
producción (“Skip packaging and dexing…”).
• Una vulnerabilidad (ejecución sandboxeada) + una debilidad
(privilege-escalation) pueden configurar un vector de ataque
exitoso.
• No se limita a addJavascriptInterface: aplica para cualquier OS
command injection.
• Target posible: apps a medida (ej. ambiente enterprise).
PA G E 3 6
Trabajo futuro
• Sniffear comunicaciones a través de Binder de la
aplicación vulnerada
• Instrumentar dinámicamente libs cargadas en la
memoria del proceso (ej. librerías criptográficas y
libdvm.so)
• Fuzzear driver de Binder
PA G E 3 7
Trabajos relacionados y referencias
• WebView addJavascriptInterface Remote Code Execution MWR Labs https://labs.mwrinfosecurity.com/blog/2013/09/24/webview-addjavascriptinterfaceremote-code-execution/
• Putting JavaScript Bridges into (Android) Context - MWR Labs
https://labs.mwrinfosecurity.com/blog/2014/06/12/putting-javascript-bridges-into-android-context/
• Introduction to Dynamic Dalvik Instrumentation - Collin
Mulliner
http://www.mulliner.org/android/feed/mulliner_ddi_summercon2013.pdf
• Android Binder – Android Interprocess Communication Thorsten Schreiber
http://www.nds.rub.de/media/attachments/files/2012/03/binder.pdf
PA G E 3 8
¿Preguntas?
Gracias.
PA G E 3 9
Descargar