Malwares dirigidos contra los sistemas Android
Introducción
Se estima que hay más de 7 700 millones de abonados a la telefonía móvil en el mundo. En España, el 96 % de los ciudadanos tiene un teléfono móvil (el 66 % de la población mundial tiene un móvil, datos de 2022 según Forrester). Es natural que esos equipos también sean el objetivo de los programadores de malwares. El mercado se divide principalmente en dos actores: Android, desarrollado por Google y iOS, desarrollado por Apple. Este capítulo está dedicado al sistema operativo Android. Android representa en 2023 casi el 71 % de los teléfonos presentes en el mundo (fuente: StatCounter), lo que hace de este sistema un objetivo prioritario.
Este capítulo presentará rápidamente Android, así como su sistema de aplicaciones. Veremos los principales vectores de infecciones específicas en los terminales móviles. Al igual que en los capítulos anteriores, veremos cómo crear nuestro propio laboratorio de análisis, tanto en una máquina virtual como en un teléfono físico. Para finalizar, veremos cómo analizar una aplicación maliciosa, las técnicas utilizadas por los desarrolladores de malwares y las herramientas que nos ayudarán en esta tarea.
El sistema operativo Android
1. Historia
La primera versión del sistema operativo Android se publicó en 2007. Hasta febrero de 2023, existían catorce versiones de este sistema operativo y muchas otras subversiones. Este sistema operativo está basado en el núcleo (kernel) Linux. Las versiones de Android se pueden identificar gracias a un número de versión, pero también gracias a un nombre en clave proporcionado por Google. He aquí un recapitulativo de las distintas versiones de Android:
Versión |
Fecha de publicación |
Nombre en clave |
Kernel Linux |
1.0 |
Noviembre 2007 |
- |
- |
1.1 |
Octubre 2008 |
Petit Four |
- |
1.5 |
Abril 2009 |
Cupcake |
2.6.27 |
1.6 |
Septiembre 2009 |
Donut |
2.6.29 |
2.1.x |
Octubre 2009 |
Eclair |
2.6.29 |
2.2.x |
Mayo 2010 |
Froyo |
2.6.32 |
2.3.x |
Diciembre 2010 |
Gingerbread |
2.6.35 |
3.x.x |
Febrero 2011 |
Honeycomb |
2.6.36 |
4.0.x |
Octubre 2011 |
Ice Cream Sandwich |
3.0.1 |
4.1.x / 4.2.x /4.3.x |
Julio 2012 |
Jelly Bean |
3.0 - 3.1 |
4.4.x |
Octubre 2013 |
KitKat |
3.4 |
5.x.x |
Noviembre 2014 |
Lollipop |
3.10 |
6.0 |
Octubre 2015 |
Marshmallow |
3.10 - 3.18 |
7.x |
Agosto 2016 |
Nougat |
3.18 - 4.4 |
8.x |
Agosto 2017 |
Oreo |
4.4 - 4.9 |
9.0.x |
Diciembre 2018 |
Pie |
4.14 |
10.x |
Septiembre 2019 |
Quince tart |
|
11.x |
Septiembre 2020 |
Red velvet cake |
|
12.x |
Octubre 2021 |
Snow cone |
|
13.x |
Agosto 2022 |
Tiramisu |
|
14.x |
Febrero 2023 |
Upside down cake |
Las principales versiones que todavía circulan son Oreo y Pie (Android 10.0), así como Android 12.
El sistema operativo permite gestionar el material del teléfono, como la pantalla, teclado (físico o virtual), sensores (acelerómetro, GPS…), conexiones (Wi-Fi, Bluetooth, telefonía…), cámara, puerto USB e incluso la tarjeta de memoria. El sistema operativo ofrece una API a los desarrolladores de aplicaciones para que todos los modelos de dispositivos que usen ese sistema operativo utilicen la misma.
Es interesante recalcar que Android funciona en teléfonos y tabletas, pero también en otros dispositivos más exóticos, como televisiones o incluso frigoríficos. Esto nos lleva a plantearnos interrogantes en lo relativo a la seguridad de los objetos conectados. ¿Habrá frigoríficos infectados en los próximos años?
2. Arquitectura
Android no es una simple distribución Linux, sino un sistema operativo completo. Google ha desarrollado distintas capas aplicativas, desde la capa de abstracción de hardware hasta la interfaz gráfica pasando por las máquinas virtuales Java que permiten que las aplicaciones Android funcionen. He aquí un esquema de la arquitectura de Android:
Detengámonos más de cerca en cada una de las capas de la arquitectura Android de abajo hacia arriba.
Hardware
Esta capa no representa realmente el sistema operativo; sin embargo, todo comienza por el equipo soporte físico (hardware en inglés). Esta capa abarca todos los aspectos físicos del dispositivo móvil: pantalla, sensor, conexiones, etc.
Núcleo de Linux
El kernel (núcleo) de Linux permite establecer el vínculo entre la parte puramente aplicativa y la parte material. A lo largo de los años, Android ha modificado ligeramente el kernel de Linux con el objetivo de optimizar algunas tareas del núcleo. Por ejemplo, se ha implementado ASHMem (Anonymous Shared Memory, Memoria anónima compartida) como mecanismo para compartir la memoria. Binder es una implementación hecha por Android de los IPC (Inter Process Call, llamada interproceso) con el objetivo de permitir una comunicación entre los procesos. Logger es un sistema de registro de eventos a nivel del kernel implementado también por Android. A estas modificaciones del kernel de Linux hechas por Android se las conoce por el término Androidisms.
El kernel lleva también al HAL (Hardware Abstraction Layer, capa de abstracción de hardware). Esta capa permite que una aplicación pueda comunicarse de manera transparente con el hardware...
Vectores de infección
1. Instalar usando Google Store
Las aplicaciones Android se instalan, teóricamente, desde Google Store. Los atacantes intentan utilizar el mismo procedimiento. Los usuarios confían en la Store y los desarrolladores de malwares se aprovechan de ello para infectar el máximo número de usuarios. Por ejemplo, el malware BeiTaAd es un adware que estaba alojado y se expandió por la tienda de Android. En 2019, se identificaron más de 230 aplicaciones que contenían dicho malware. Este se hacía pasar, principalmente, por un paquete de soporte de idiomas y temas.
Es difícil elegir víctimas específicas a través de la store de Google. Generalmente, el objetivo de los malwares que utilizan dicha tienda es infectar un número máximo de víctimas.
En el caso de BeiTaAd, el malware estuvo disponible durante más de siete meses e infectó miles de dispositivos a través de todo el mundo.
2. Instalar usando tiendas alternativas
Existen tiendas (stores) alternativas a la de Google. Samsung, por ejemplo, dispone de un store desde hace años y Huawei ha creado una alternativa desde el veto de E.E. U.U. en 2019. También existen tiendas mantenidas por la comunidad y no por empresas. Al igual que sucede con Google Store, los atacantes pueden utilizarlas con el objetivo de desplegar sus malwares en los dispositivos de los usuarios....
Crear un laboratorio de análisis
1. ¿Máquina virtual o teléfono físico?
Con el fin de poder analizar una aplicación, instalarla y manipularla, necesitamos un laboratorio de análisis. Para esto tenemos dos soluciones: la virtualización o un dispositivo físico. Cada una de estas soluciones tiene sus ventajas e inconvenientes.
Android en una máquina virtual
Existe un Android portado en x86. Este nos permite ejecutar Android en una máquina virtual en un ordenador estándar con VirtualBox (u otra herramienta de virtualización). Este Android portado está disponible en: https://www.fosshub.com/Android-x86.html
He aquí el procedimiento de instalación en VirtualBox.
El primer paso consiste en crear la máquina virtual haciendo clic en Máquinay después en Nueva. Se nos pide el nombre de la máquina virtual, tipo e imagen ISO por usar:
En la pantalla siguiente, se nos solicita la contraseña de usuario, nombre de la máquina y dominio. El siguiente paso consiste en añadir memoria RAM y procesadores. Un valor de 4 GB de RAM es una cifra realista para un dispositivo móvil. Después, VirtualBox nos pide el tamaño del disco duro que se va a crear. Son necesarios 16 GB como mínimo para poder trabajar cómodamente.
La máquina virtual está casi lista. Ya se puede instalar el sistema operativo:
El procedimiento es bastante simple: basta con ir al menú de instalación y seguir los pasos del instalador. Una vez la instalación finalizada, la máquina virtual queda lista para su uso y ya se puede lanzar:
Esta es la configuración de la máquina virtual al final de la operación:
El uso de una máquina virtual es muy práctico y no necesita de ningún equipo particular. Sin embargo, tiene muchas limitaciones. Por ejemplo, Android-x86 solamente puede ejecutar binarios x86 o x64. Si un malware carga un binario para ARM o ARM64, la ejecución será imposible y el binario fallará. Un malware podrá identificar fácilmente que está en una máquina virtual porque no hay servicio GSM, ni tarjeta SIM, etc. Por este motivo, muchos analistas utilizan dispositivos físicos para analizar malwares en Android.
Android en un dispositivo físico
El uso de un dispositivo físico para el análisis de malwares es a menudo la elección más simple. Se puede utilizar cualquier teléfono con Android. Rootearlo puede ser buena idea para facilitar el análisis. No todos los teléfonos se pueden rootear; es conveniente comprobar si el dispositivo en cuestión lo es en foros especializados, como XDA Developers: https://forum.xda-developers.com. Para que el dispositivo parezca un dispositivo estándar, vale la pena añadir algunas aplicaciones, una tarjeta SIM de prepago desechable o incluso tener una cuenta Google dedicada al análisis.
Sin embargo, hay que tener cuidado y no activar el GPS: esto podría dar nuestra geolocalización al atacante que ha desarrollado el malware que estamos analizando si este recupera esta información. En el caso de los análisis en Android, hay que tener mucho cuidado con los datos que se encuentren en el dispositivo de prueba y con los datos a los que el atacante podría tener acceso si el teléfono ejecuta la aplicación maliciosa.
2. Adb (Android Debug Bridge)
Adb es una consola interactiva que permite realizar diferentes acciones en un dispositivo Android usando su puerto USB. Adb forma parte de la suite SDK Platform Tools de Android y puede descargarse en: https://developer.android.com/studio/releases/platform-tools.html
Para activar el depurador en el dispositivo Android, dependiendo de la versión de Android, habrá que mostrar el menú Opciones para desarrolladores. Para activar la depuración por USB se debe acceder a Configuración - Sistema - Avanzado - Opciones para desarrolladores y finalmente Depuración por USB. En la primera conexión a un ordenador, el teléfono...
Análisis estático y descompilación de una aplicación
Para ilustrar esta sección, analizaremos dos malwares diferentes: KevDroid (md5: 56b1f4800fa0e083caf0526c3de26059) y FakeSpy (md5: a5cb6cd85b134a7b5d2f871a0b596d3f). Los analizaremos ambos en función de los mecanismos implementados por los desarrolladores.
1. Analizar un archivo APK
Para empezar, trabajaremos con el malware KevDroid. El primer paso consiste en listar los permisos que necesita esta apk:
paul@lab:~$ aapt dump permissions KevDroid.apk
package: com.cool.pu
uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED'
uses-permission: name='android.permission.READ_CALL_LOG'
uses-permission: name='android.permission.READ_SMS'
uses-permission: name='android.permission.RECEIVE_SMS'
uses-permission: name='android.permission.RECORD_VIDEO'
uses-permission: name='android.permission.RECORD_AUDIO'
uses-permission: name='android.permission.CAMERA'
uses-permission: name='android.permission.READ_PHONE_STATE'
uses-permission: name='android.permission.PROCESS_OUTGOING_CALLS'
uses-permission: name='android.permission.ACCESS_FINE_LOCATION'
uses-permission: name='android.permission.ACCESS_COARSE_LOCATION'
uses-permission: name='android.permission.GET_ACCOUNTS'
uses-permission: name='android.permission.READ_CONTACTS'
uses-permission: name='android.permission.READ_EXTERNAL_STORAGE'
uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.READ_FRAME_BUFFER'
uses-permission: name='android.permission.ACCESS_SUPERUSER'
uses-permission: name='com.google.android.c2dm.permission.RECEIVE'
uses-permission: name='android.permission.WAKE_LOCK'
permission: com.cool.pu.permission.C2D_MESSAGE
uses-permission: name='com.cool.pu.permission.C2D_MESSAGE'
La lista de los permisos nos permite ver rápidamente las probables funcionalidades de KevDroid :
-
RECEIVE_BOOT_COMPLETED: esta aplicación tiene el permiso de iniciarse al arrancar el dispositivo;
-
READ_CALL_LOG: esta aplicación puede leer el historial de llamadas;
-
READ_SMS: esta aplicación puede leer los SMS almacenados;
-
RECEIVE_SMS: esta aplicación puede leer los SMS recibidos;
-
RECORD_VIDEO: esta aplicación puede grabar vídeos usando la cámara;
-
RECORD_AUDIO: esta aplicación puede grabar a través del micrófono (sonido, voz);
-
CAMERA: esta aplicación puede grabar usando la cámara (imágenes, vídeos);
-
READ_PHONE_STATE: esta aplicación puede obtener información del dispositivo como su ID o el IMEI del proveedor de telefonía;
-
PROCESS_OUTGOING_CALLS: esta aplicación puede realizar llamadas telefónicas;
-
ACCESS_FINE_LOCATION: esta aplicación puede recuperar la geolocalización exacta del dispositivo;
-
ACCESS_COARSE_LOCATION: esta aplicación puede recuperar la geolocalización aproximada del dispositivo;
-
GET_ACCOUNTS: esta aplicación puede recuperar la información sobre las cuentas guardadas en el dispositivo;
-
READ_CONTACTS: esta aplicación puede leer la información de los contactos que se encuentren en el dispositivo (apellido, nombre, número, fotografía, etc.);
-
READ_EXTERNAL_STORAGE: esta aplicación puede leer lo que esté guardado en el almacenamiento externo;
-
WRITE_EXTERNAL_STORAGE: esta aplicación puede escribir en el almacenamiento externo;
-
ACCESS_NETWORK_STATE: esta aplicación puede comprobar el estado de la red;
-
INTERNET: esta aplicación puede usar Internet;
-
READ_FRAME_BUFFER: este derecho le permite, por ejemplo, hacer capturas de pantalla del dispositivo;
-
ACCESS_SUPERUSER: le permite obtener los derechos de root (superuser) si el teléfono esta rooteado;
-
WAKE_LOCK: esta aplicación puede bloquear el estado...
Análisis dinámico
1. Usar Frida
Al igual que para Windows, el código en ejecución se puede analizar dinámicamente. Una de las herramientas más populares es Frida, que está disponible en: https://www.frida.re/
Frida permite rastrear la ejecución de una aplicación Android. Permite, por ejemplo, leer los valores que se utilizan en distintas funciones; leer los valores a la salida o, incluso, modificarlos con el objetivo de cambiar la ejecución de la aplicación.
Para usar Frida en Android, primero hay que instalar Frida-server en el dispositivo. Está disponible en: https://github.com/frida/frida/releases (atención, elija la arquitectura de CPU correcta que corresponda al dispositivo):
C:\Users\paul> adb.exe root
C:\Users\paul> adb.exe push frida-server-12.6.10-android-arm /data/
local/tmp/
C:\Users\paul> adb.exe shell "chmod 755 /data/local/tmp/frida-server"
C:\Users\paul> adb.exe shell "/data/local/tmp/ frida-server-12.6.10-
android-arm &"
Probaremos la instalación desde la máquina Windows:
C:\Program Files\Python3\Scripts>frida-ps.exe -U
PID Name
----- --------------------------------------------------
14118 -
3605 .dataservices
1965 ATFWD-daemon
5990 adbd
1945 adspd ...
Resumen
En este capítulo, hemos visto cómo analizar un dispositivo y una aplicación en formato APK. A diferencia de los malwares que se ejecutan en los sistemas Windows, casi nunca es necesario depurar las aplicaciones. Los descompiladores hacen un trabajo de buena calidad combinando la depuración con scripts para descifrar las cadenas de caracteres. De esta manera, se puede analizar cualquier archivo .apk.
El número de dispositivos con Android aumenta cada año y estos contienen un número increíble de datos personales o profesionales. Esto hace de Android un objetivo prioritario para los desarrolladores de malwares, cuyo objetivo es infectar el máximo de dispositivos, sin atacar a una persona en concreto, así como lanzar campañas de espionaje dirigidas a individuos específicos. Por este motivo, el número de operaciones dirigidas contra plataformas Android debería aumentar en los próximos años.