Seguridad Moderna para Android Developers (parte 5)

Modern Security in Android a fast guide to be safe

Dinorah Tovar
Droid LATAM
3 min readOct 29, 2020

--

Este post está relacionado con mi última plática “Modern Security for Android Developers”.

Esta es la lista de blogs que tendrá el serial:

Modern Security for Android Developers

Una de las cosas que usualmente comentamos sobre Android que sorprende a los demás desarrolladores es que podemos escribir código en C y C++ y usualmente todo mundo cree que es increíble por que el código en Java y Kotlin puede ser decompilado de manera sencilla (si una aplicación tiene ofuscación de código, probablemente esto hará la tarea un poco más complicada) pero en C y C++ no existe la decompilación, al menos no como en Java, sin embargo, el código en C puede ser disassembled

En android, tenemos una parte interesante que maneja el runtime llamado ART (Android Runtime) que es el predecesor de Dalvik, Art usa una forma ejecutable de Dalvik y Dex bytecode, esto está soportado por JNI (Java Native interface) que es la parte que deja de el código de Java interactúa con el código escrito en C/C++, recordemos que Android es un sistema operativo basado en Linux, así que el native code será empacado y compilado en dynamic libraries con ELF (*.so) que será cargado a las aplicaciones Android en runtime usando el sistema de System.load

En el siguiente ejemplo:

init {
try {
System.loadLibrary("someKeyWeWantSafe")
} catch (e: UnsatisfiedLinkError) {
Log.e(TAG, "Error loading library " + e.toString());
}
}

Este load sucede usando System.loadLibrary que es la librería que esta escrita en C/C++ si navegamos un poco dentro del código de loadLibrary nos daremos cuenta que una Security Exception sera lanzada si el security manager indica que ha habido una violación de seguridad, sin embargo, esta excepción no es lanzada cuando se hace un dissamble del código.

Podemos crear un módulo y agregar una llave que queremos mantener segura dentro de un módulo en C usando algo similar a esto:

#include <jni.h>
JNIEXPORT jstring JNICALL
Java_com_secure_project_keymodule_NdkKeys_getKey(JNIEnv *env, jobject instance) {
return (*env)->NewStringUTF(env, "someCoolKey");
}

Sin embargo cuando se haga reverse engineering dentro de la aplicación que contiene código nativo, necesitamos entender un par de estructuras de datos relacionadas al bridge de JNI llamadas JavaVM y JNIEnv estas estructuras son pointers a pointes a funciones dentro de nuestro código:

  • JavaVM Provee una interfaz para invocar las funciones, Android solo permite una JavaVM por proceso, y realmente no es relevante, para este caso, pero es necesario saberlo.
  • JNIEnv Provee un access point para casi todas las funciones en JNI que son accesibles a través del fixed offset de un JNIEnv pointer. Este pointer es el primer parámetro pasado en cada JNI function, también es usado como thread-local para storage, por esta razón, no podemos compartirnos JNIEnv dentro de los threads.

Incluso cuando en código, podríamos acceder a los offset, es importante entender, que si se desea tener una llave “segura” usando este approach, podría ser contraproducente, el código puede ser disassembled y si este ataque viene de alguien que pueda ser interno y sepa que está buscando, podría encontrarlo de una manera muy sencilla, incluso cuando es posible mantener almacenas keys en el NDK y esto lo hace más difícil para atacantes principiantes, puede volverse un proceso preocupante tener llaves en texto plano dentro de una aplicación, hay que ser muy conscientes de estos procesos, mi recomendación, es que no tengamos ninguna key en texto plano

Esto es todo por este post, si requieres ayuda:

Siempre estoy feliz de ayudar y puedes encontrarme en:
Medium: https://medium.com/@dinorahto
Twitter: https://twitter.com/DDinorahtovar
StackOverflow: https://stackoverflow.com/users/4613259/dinorah-tovar

Happy Coding! 👩🏻‍💻

--

--

Dinorah Tovar
Droid LATAM

Google Developer Expert on Android | Doing Kotlin | Making Software 24/7 | Kotlin Multiplatform | She/Her | Opinions are my own, and not my employer