Download - CORE SECURITY
P A G E
CORE SECURITY 2 threads, 1 app (Inyección en Dalvik VM)
Martín Balao | [email protected]
Martín Fernández | [email protected]
Octubre 2014
P A G E
Introducción
2
P A G E
¿Qué es un Web View?
3
Aplication View
HTML + JS
WebView
P A G E
WebView + addJavascriptInterface
4
HTML + JS Objeto Java
Expuesto
Puente
P A G E
addJavascriptInterface exploit – Java Reflection
5
getClass()
forName(Clase B)
Objeto Java expuesto
Clase A Clase B
…
Método_Estático_B
Invocación de métodos estáticos en clases Java
JS
Puente
P A G E
addJavascriptInterface exploit – OS commands
6
getClass()
forName(Java Runtime)
Objeto Java expuesto
Clase A Java
Runtime
…
Inyección de OS Commands
JS
Puente
exec
P A G E
Limitaciones del exploit – Java Reflection
• Desde Javascript, sólo se pueden invocar métodos Java que tengan como argumento tipos nativos o String
• Por lo anterior:
• No se pueden instanciar objetos
• No se puede interactuar con otras aplicaciones del ecosistema Android
7
P A G E
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?
8
P A G E
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
9
process_id_500 user_id_1234 app_vulnerable
process_id_432 user_id_1234 app_maliciosa
P A G E 1 0
Comunicación en Android • Context.ContentResolver
.query(URI(content://SMS))
P A G E
Objetivo
Usar los permisos de la aplicación vulnerada para interactuar con otras aplicaciones del ecosistema Android.
1 1
P A G E
Inyección en Dalvik VM
1 2
P A G E 1 3
Ejecutables en disco y memoria
P A G E
Mapa de memoria: cat /proc/<PID>/maps
• 00400000-0040b000 r-xp /bin/app
• 00c9a000-00cbb000 rw-p [heap]
• 7fcada45a000-7fcada617000 r-xp /lib/libc-2.17.so
• 7fff9acc0000-7fff9ace1000 rw-p [stack]
1 4
P A G E 1 5
¿Qué entendemos por inyección?
P A G E 1 6
Cambio de contexto
P A G E
Ptrace - Debugging
• Attacharse a un thread de un proceso
• Leer memoria
• Escribir memoria
• Modificar contexto de un thread (leer y escribir)
• Continuar proceso y handlear señales
1 7
P A G E 1 8
Inyección clásica
P A G E
Problemas de la inyección clásica
• Compilar shellcode
• Alocar memoria
• Crear thread
• Resolver símbolos • Para usar funciones de otras libs
1 9
P A G E 2 0
Inyección por dlopen
P A G E 2 1
Encontrar dlopen
P A G E 2 2
#include <stdio.h> #include <binder.h> #include <jni.h>
libAgent.so (C/C++, NDK)
__attribute__((constructor)) init_agent(){ pthread_create(agent_main_loop); raise(SIGINT); }
void agent_main_loop(){ sleep(5); // restauración del thread secuestrado … }
P A G E 2 3
Después de la inyección
P A G E 2 4
#include <jni.h>
libAgent.so (C/C++, NDK)
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
P A G E 2 5
APK Load – Java Agent
P A 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).
P A G E 2 7
Context
• En Java Agent, no podemos heredar de Activity: ¿Quién nos instancia?
P A G E 2 8
Activity Thread
Class ActivityThread(){ static Handler sMainThreadHandler public static Application currentApplication() public static void main(String[] args) }
¿ NULL ?
P A G E 2 9
Ejecución en el Thread Principal
P A G E 3 0
Runnable
P A 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(); } } }
P A 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(…) } }
P A G E
Demo
3 3
P A G E
Ambiente de ataque
3 4
P A G E
Conclusiones
3 5
P A G E
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).
3 6
P A G E
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
3 7
P A G E
Trabajos relacionados y referencias
• WebView addJavascriptInterface Remote Code Execution - MWR Labs https://labs.mwrinfosecurity.com/blog/2013/09/24/webview-addjavascriptinterface-
remote-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
3 8
P A G E
¿Preguntas? Gracias.
3 9