Android Malware II.
Android Basics

En este entrada se verán algunos conceptos básicos sobre Android de forma resumida antes de ponernos a analizar ficheros maliciosos.

Arquitectura de Android

Android está basado en Linux con la siguiente arquitectura (a muy grandes rasgos):

Compilación/Reversing en Android

Cuando hacemos frente al reversing en aplicaciones Android hay que tener en mente este pequeño mapa. Partiendo desde el código compilado de Java/Kotlin tendremos del archivo .dex, archivo que contiene el código compilado (Dalvik Bytecodes) listo para ser ejecutado en la máquina virtual de Android (ART). Luego, mediante herramientas como apktool, obtendremos un código «casi» parecido al original. Existen métodos para los desarrolladores que les permiten ofuscar el código, de manera que dificultan el decompilado del fichero .dex.

Ficheros APK

Los ficheros APK no son más que un zip con la siguiente estructura (no siempre es exactamente igual):

  • META-INF/: Donde se alojan certificados.
  • lib/: Donde se encuentras librerías compiladas en C/C++ en distintas arquitecturas.
  • res/: Contiene recursos no compilados como imágenes, musica, «raw binary»…
  • assets/: (Opcional) Aquí se alojan ficheros extras, que se pueden cargar desde código Java.
  • AndroidManifest.xml: Fichero que describe la aplicación, sus permisos, componentes, etc.
  • classes.dex: Este ficheros son las clases Java compiladas para ser ejecutadas en la máquina virtual de Android, también llamados Dalvik Bytecodes.
  • resources.arsc: Fichero que contiene fichero XML precompilados.

Componentes de Android

Activity

Las Actividades no son más que las pantallas que vemos los usuarios cuando interactuamos con el teléfono. Este componente tiene un comportamiento concreto según muestra Google en la siguiente imagen:

En la imagen se observa que el primer método por el que pasa una actividad al iniciarse es el método onCreate(). El código que contenga este método será el primero en ejecutarse.

Service

Los servicios son procesos parecidos a una Actividad pero que se ejecutan en segundo plano, es decir, el usuario no observa que este proceso se ejecuta. Google también nos ofrece un diagrama con el ciclo de vida de un servicio:

Se puede ver en la imagen que se puede llamar a un servicio mediante dos métodos: startService() y bindService(). En cualquiera de los dos casos, el primero código que se ejecuta es el del método onCreate(), igual que en una Actividad.

Broadcast Receiver

Es parte de una aplicación que está a la escucha de un evento. Cuando este evento ocurre, su código se ejecuta. Se pueden declarar tanto en el AndroidManifest como dinámicamente usando registerReceiver() en el código de la aplicación.

Content Provider

Este último componente no es más que un mecanismo/interfaz, que propociona Android, para acceder a datos que almacena una aplicación. Los datos pueden estar almacenado es una base SQLite o una carpeta del sistema, etc.

Intents / Intents filters

Nos conviene comentar también en que consisten estos dos elementos en el entorno Android:

Un intent no es más que un mensaje que se intercambia entre los componentes de Android que hemos hablado anteriormente. Un intent filter es la declaración de una aplicación (normalmente en el AndroidManifest) para poder administrar los intents. Los intents sirven para iniciar una actividad, un servicio o mandar un broadcast. Existen dos tipos de intents:

  • Implicit Intents: son intents que no especifican quién se hará cargo de ellos, como por ejemplo un intent con la localización GPS, cuando es lanzado, el sistema busca entre todas las aplicaciones cual ha declarado en sus intent filters que tiene la capacidad para administrar localizaciones GPS. Si se encuentra a varias con el mismo intent filter, muestra un diálogo con las opciones para que el usuario elija la que deseé.
  • Explicit Intents: estos intent si que indican la aplicación que se hará carga de este mensaje.

Puntos de entrada a un APK

A la hora de realizar el análisis estático, tal y como se haría en un binario compilado, será necesario buscar los entry points. En Android, nos encontramos con bastantes entry points:º

  • Launcher Activity: Es la Activity principal y es la que se lanza cuando pulsamos el icono de la aplicación.
  • Componentes exportados: cuando alguno de los componentes de Android están exportados quiere decir que pueden ser accesibles desde cualquier otra aplicación o evento.
  • Broadcast Receiver: El código del Broadcast Receiver será ejecutado cuando el evento al que está escuchando sea lanzado.
  • Services: Al igual que lo anterior, el Servicio puede tener definido un «intent filter» que lance el servicio. Un ejemplo de un evento sería: cuando se ha iniciado el sistema.
  • Application Subclass: si el método attachBaseContext está definido, éste es llamado antes que el método OnCreate().
  • URL schemes / Deeplinks: Este entry point estaría más orientado al pentesting, aunque siempre es bueno saber que existe. Consiste en que lo desarrolladores declaran un esquema de url como por ejemplo app:// para sus aplicaciones. Cuando se accede o se pulsa un link que tenga ese formato, se ejecutará código de la aplicación.

Metodología

En estas entradas sobre Android Malware seguiremos la misma metodología:

  1. Muestra: Hablaremos un poco de la muestra, repercusión mediática, origen, de donde la hemos obtenido.
  2. Información pública: Como buen reversing hay que empaparse de toda la información posible antes de empezar.
  3. Análisis estático: Decompilaremos la aplicación e intentaremos obtener toda la información posible.
  4. Análisis dinámico: Instalaremos la aplicación, analizaremos el comportamiento, el trafico generado, etc…
  5. Conclusiones.

 

Con esta introducción teórica tenemos las nociones básicas para hacer reversing a un APK.

 

FUENTES:

Android Developer – Intents and Intent Filters

Android Developer – Service

Android Developer – Activity

Android Reversing 101

Android Checklist