Los dispositivos móviles modernos constituyen un conjunto de equipos eficientes que operan bajo sistemas operativos con complejas capacidades de almacenamiento de datos. Para realizar un análisis forense completo de estos terminales, se torna necesario abarcar tanto la recolección de datos no volátiles almacenados en medios removibles, como también información volátil presente mayormente en la memoria RAM del dispositivo.
A lo largo de esta publicación nos dedicaremos a conocer algunas herramientas para el análisis de memoria volátil.
¿Por qué analizar la memoria volátil?
La memoria RAM resulta un recurso crítico ya que contiene piezas de datos que se perderán tan pronto como el teléfono sea apagado. Los datos volátiles deben ser recolectados mientras el dispositivo aún está en ejecución y, por tanto, esto representa un ambiente donde el analista posee mucho menos control sobre las variables influyentes.
En compensación, la información que puede obtenerse es altamente preciada: datos de aplicación; fragmentos de comunicaciones; claves de cifrado; procesos; archivos abiertos; estructuras de red, de aplicación y del sistema operativo, entre otros. Estos elementos abren las puertas a nuevos escenarios de análisis en situaciones de respuesta a incidentes y estudio de códigos maliciosos avanzados que no interactúan con medios de almacenamiento no volátiles.
Volcando la memoria del sistema
Para capturar correctamente todos los contenidos de la memoria RAM del equipo podemos acudir a la utilización de LiME Forensics: una herramienta capaz de extraer la memoria de un sistema basado en Linux. Este utilitario es un Loadable Kernel Module (LKM) capaz de volcar el contenido directamente a la tarjeta SD o a través de la red mediante Android Debug Bridge (adb). Por ser un LKM, debe ser compilado para el kernel específico del dispositivo que constituirá la estación forense.
LiME (del inglés, Linux Memory Extractor) reduce al mínimo la interacción entre el espacio de usuario y el kernel del sistema. Permite conocer los rangos de direcciones de memoria física para la RAM del sistema, traducirlos a direcciones virtuales, y leer todas las páginas en cada rango para escribirlas en un fichero en la tarjeta SD o socket TCP.
Este módulo brinda tres modalidades para almacenar las capturas de la imagen de memoria en el disco:
El formato raw concatena los rangos de memoria RAM del sistema.
El formato padded incluye además rangos de direcciones no pertenecientes al sistema, comenzando por la dirección física cero y reemplazando el contenido de esos rangos por valores nulos.
Por último, el formato lime; este ha sido diseñado para trabajar sinérgicamente con el entorno de trabajo Volatility.
Una vez que se ha producido exitosamente el volcado de memoria, a través de Volatility podremos realizar consultas como si se tratase de un sistema Linux de escritorio. Para ver los diferentes aplicativos que pueden utilizarse sobre el archivo podemos invocar el comando que se ilustra en la siguiente figura.
Para esta redacción se utilizó el kernel del emulador provisto con el Android SDK, conocido bajo la denominación de “Golfish”. Por ello, para emitir comandos con Volatility deberemos utilizar la siguiente sintaxis desde la carpeta donde tenemos la herramienta instalada:
python vol.py –profile=LinuxGolfish-2_6_29ARM -f <ruta_dump> <nombre_complemento>
Algunas de las opciones de complementos que están a nuestro alcance incluyen:
linux_pslist: listado de procesos;
linux_netstat: listado de conexiones de red;
linux_ifconfig: listado de interfaces del dispositivo que permite ver si el equipo ha sido conectado a través de WiFi (eth0, eth1, …), 3G/4G (rmnet0, …), USB, etcétera;
linux_route_cache: tabla de enrutamiento con la lista de direcciones IP consultadas;
linux_arp: tabla ARP con las direcciones MAC;
linux_proc_maps: listado de correlaciones entre procesos y direcciones de memoria;
linux_mount: listado de los sistemas de archivos montados en el dispositivo incluyendo permisos (lo que puede servir para determinar si el equipo está rooteado examinando si /system es o no una ubicación de sólo lectura);
linux_tmpfs: listado de sistemas de archivos temporales o “tmpfs” (almacenados solo en memoria);
linux_find_file: recupera archivos tmpfs desde su ruta;
linux_lsof: listado de archivos abiertos;
linux_pstree: imprime el árbol jerárquico entre procesos padres e hijos desde la inicialización del sistema;
linux_psaux: permite conocer el comando que inició el proceso y la fecha en que esto ocurrió;
linux_psxview: permite comparar listas de procesos del kernel, de la tabla hash de PID y de la estructura de sistema kmem_cache, para encontrar así irregularidades que podrían denotar procesos escondidos por un rootkit;
linux_check_afinfo: evalúa estructuras de datos dinámicos de red que puedan presentar hooks por rootkits;
linux_check_fop: evalúa las estructuras de operaciones con archivos para hallar posible malware escondido por técnicas de hooking;
linux_lsmod: listado de módulos cargados en el kernel;
linux_check_modules: examina la lista de módulos listados en el sistema de archivos del sistema y en el kernel para hallar irregularidades;
linux_yarascan: soporte para la ejecución de reglas de Yara;
Muchos otros complementos.
En las siguientes imágenes veremos el resultado de ejecutar alguno de estos comandos.
En la siguiente captura podemos ver fragmentos de algunos mensajes SMS que han sido enviados con el móvil y el número telefónico al que fueron enviados. En particular, fueron el resultado de ejecutar la siguiente regla de Yara:
python vol.py –profile=LinuxGolfish-2_6_29ARM -f ~/lime.dump linux_yarascan –yara-rules=”mensaje”
Para visualizar mejor estos resultados podemos utilizar YaVol, una herramienta que funciona como un interfaz para el análisis de datos producidos por Volatility y Yara.
Estos complementos permiten recuperar archivos y sistemas de archivos desde la memoria, datos en texto plano que son el resultado de descifrar datos en memoria no volátil, historial de la navegación web y otros archivos que por deber ser accedidos rápidamente deben permanecer en memoria, mensajes SMS, correos electrónicos, contactos, archivos APK y DEX instalados en el sistema, y un gran número de otros elementos.
La capacidad de obtener archivos binarios desde memoria crea la posibilidad de analizar cómo cambian muestras de malware capaz de mutar dinámicamente.
En resumen…
Las técnicas de recolección de datos en memoria que hemos visto a lo largo de este artículo sirven a la identificación de comportamientos maliciosos en dispositivos móviles, pero también nos permiten prever riesgos para la confidencialidad de nuestros datos mientras estos son procesados.
Como medida de protección, el cifrado de los datos que se encuentran en la memoria RAM (ya sea por hardware o software) y la utilización de sistemas de cifrado ligados a la CPU (que cifren los datos sin que estos deban ser previamente almacenados en la memoria RAM) constituyen dos medidas preventivas para reducir la superficie de ataque.
Créditos imagen: © Maria Elena/Flickr