Seguridad Moderna para Android Developers (parte 5)

Modern Security in Android a fast guide to be safe

Dinorah Tovar
Oct 29, 2020 · 3 min read

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

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

Image for post
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! 👩🏻‍💻

Droid LATAM

Posts en nuestro idioma por #AndroidDevs de nuestra región.

Dinorah Tovar

Written by

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

Droid LATAM

Los mejores artículos de Android en español escritos por devs de América Latina.

Dinorah Tovar

Written by

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

Droid LATAM

Los mejores artículos de Android en español escritos por devs de América Latina.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store