CORE SECURITY 2 threads, 1 app (Inyección en Dalvik VM) Martín Balao | mbalao@coresecurity.com Martín Fernández | mfernandez@coresecurity.com 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