core security

39
PAGE CORE SECURITY 2 threads, 1 app (Inyección en Dalvik VM) Martín Balao | [email protected] Martín Fernández | [email protected] Octubre 2014

Upload: others

Post on 15-Nov-2021

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 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

Page 2: CORE SECURITY

P A G E

Introducción

2

Page 3: CORE SECURITY

P A G E

¿Qué es un Web View?

3

Aplication View

HTML + JS

WebView

Page 4: CORE SECURITY

P A G E

WebView + addJavascriptInterface

4

HTML + JS Objeto Java

Expuesto

Puente

Page 5: CORE SECURITY

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

Page 6: CORE SECURITY

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

Page 7: CORE SECURITY

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

Page 8: CORE SECURITY

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

Page 9: CORE SECURITY

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

Page 10: CORE SECURITY

P A G E 1 0

Comunicación en Android • Context.ContentResolver

.query(URI(content://SMS))

Page 11: CORE SECURITY

P A G E

Objetivo

Usar los permisos de la aplicación vulnerada para interactuar con otras aplicaciones del ecosistema Android.

1 1

Page 12: CORE SECURITY

P A G E

Inyección en Dalvik VM

1 2

Page 13: CORE SECURITY

P A G E 1 3

Ejecutables en disco y memoria

Page 14: CORE SECURITY

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

Page 15: CORE SECURITY

P A G E 1 5

¿Qué entendemos por inyección?

Page 16: CORE SECURITY

P A G E 1 6

Cambio de contexto

Page 17: CORE SECURITY

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

Page 18: CORE SECURITY

P A G E 1 8

Inyección clásica

Page 19: CORE SECURITY

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

Page 20: CORE SECURITY

P A G E 2 0

Inyección por dlopen

Page 21: CORE SECURITY

P A G E 2 1

Encontrar dlopen

Page 22: CORE SECURITY

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 … }

Page 23: CORE SECURITY

P A G E 2 3

Después de la inyección

Page 24: CORE SECURITY

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

Page 25: CORE SECURITY

P A G E 2 5

APK Load – Java Agent

Page 26: CORE SECURITY

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).

Page 27: CORE SECURITY

P A G E 2 7

Context

• En Java Agent, no podemos heredar de Activity: ¿Quién nos instancia?

Page 28: CORE SECURITY

P A G E 2 8

Activity Thread

Class ActivityThread(){ static Handler sMainThreadHandler public static Application currentApplication() public static void main(String[] args) }

¿ NULL ?

Page 29: CORE SECURITY

P A G E 2 9

Ejecución en el Thread Principal

Page 30: CORE SECURITY

P A G E 3 0

Runnable

Page 31: CORE SECURITY

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(); } } }

Page 32: CORE SECURITY

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(…) } }

Page 33: CORE SECURITY

P A G E

Demo

3 3

Page 34: CORE SECURITY

P A G E

Ambiente de ataque

3 4

Page 35: CORE SECURITY

P A G E

Conclusiones

3 5

Page 36: CORE SECURITY

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

Page 37: CORE SECURITY

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

Page 38: CORE SECURITY

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

Page 39: CORE SECURITY

P A G E

¿Preguntas? Gracias.

3 9