En publicaciones pasadas hemos visto algunas maneras en las que podemos aplicar Pin al análisis de malware, interceptando la ejecución de un binario y facilitando así la tarea de determinar si su comportamiento resulta malicioso. En esta oportunidad, observaremos cómo esta misma herramienta puede ser empleada también en el estudio de muestras potencialmente maliciosas en plataformas Android, mediante la creación de herramientas denominadas Pindroids.

¿Por qué usar Pin con Android?

Como hemos mencionado, la comprensión y utilización de APIs como Pin es de real importancia frente a situaciones en las cuales no podemos acceder al código fuente de la aplicación. Si nos detenemos a pensarlo, los archivos apk no clasifican dentro de esta categoría puesto que, a pesar de poder encontrarse ofuscados, existen numerosas herramientas para decompilarlos y llegar así a la codificación inicial. Entonces, ¿qué beneficios nos brinda construir Pindroids?

Claro está que, si queremos profundizar nuestra investigación, siempre será una buena idea complementar el examen estático con la depuración de la muestra y la recolección de información en tiempo de ejecución. Luego, podremos utilizar esta última tanto para el estudio del rendimiento de la aplicación, rutinas de ejecución y potenciales vulnerabilidades, como para el análisis de los componentes estructurales, como perfilar el uso del procesador y la memoria.

Dependiendo de la relevancia que tenga la muestra en particular, y su impacto en los mercados actuales, deberá decidirse la profundidad que se espera del análisis y la cantidad de recursos empleada – tiempo, esfuerzo, y consecuentemente, dinero– que se está dispuesto a dedicar.

Aproximándonos al análisis de muestras con Pindroids

Para poder realizar un análisis con Pin, necesitaremos un dispositivo rooteado con BusyBox instalado. Además, una máquina con Android SDK, Android NDK, y por supuesto, la correspondiente versión de Pin para Android. El tutorial completo para realizar la correcta instalación de estos paquetes puede encontrarse en el manual para la creación de Pindroids.

Una vez que hemos logrado montar de manera exitosa el entorno de análisis, deberemos diseñar y programar las Pindroids que sean requeridas para atender a los diferentes aspectos que esperamos comprender del contexto de ejecución. La utilización de Pin en Android, gracias a BusyBox, no difiere en gran medida de los procedimientos expuestos anteriormente para la creación de estas herramientas.

En una primera instancia de familiarización con la plataforma, podemos acudir a algunos ejemplos publicados en la web. Como objeto de estudio tomaremos, una muestra de un troyano bancario descubierto en la Google Play Store, perteneciente a la familia Android\Spy.Banker, y sobre ella aplicaremos la tool antes provista, syscalltrace: una Pindroid que nos permite hacer la traza de todas las llamadas que se realizan al sistema. En la imagen siguiente, podemos observar una sección de los resultados arrojados.

resultados_pindroid

Adaptando las herramientas disponibles

Analizando el código de manera estática, es posible notar que la aplicación maliciosa ha sido programada utilizando un sitio Web que ofrece este tipo de servicios, con lo que posee mucho código basura. Por ello, es fácil inferir que nuestra traza de llamadas al sistema podría ser más limpia, acotando el ámbito de análisis al momento en que se ejecutan las verdaderas acciones maliciosas.

Habiendo identificado los métodos críticos, podemos modificar la Pindroid syscalltrace para registrar sólo las llamadas acontecidas luego de dispararse cierto evento malicioso específico. En este caso, la aplicación solicitaba una conexión remota a una página de phishing.

Si revemos la traza, distinguiremos la llamada socketcall, la cual podemos intuir relacionada a la carga de la página fraudulenta. El primer argumento de esta llamada es el identificador de la función a ejecutar, y el segundo es un puntero al bloque que contiene los argumentos para dicha función. Revisando las llamadas y comparando los identificadores con la documentación presente en el código fuente del sistema, identificaremos funciones para el envío y recepción de datagramas.

datagramas_pindroid

Con base en estos hechos, podemos modificar el código de la herramienta para lograr mayor detalle sobre las instrucciones ejecutadas por el procesador luego de socketcall, añadiendo una función INS_AddInstrumentFunction. Parte de la salida obtenida puede apreciarse a continuación.

syscall

Dependiendo de la unicidad de esta combinación secuencial de llamadas, podemos pensar en utilizarla a modo de comparación entre familias de malware, o como una manera para la detección futura de muestras de comportamiento similar.

Pindroids: un aliado en la lucha anti malware

La instrumentación de código dentro de ejecutables es un recurso que nos ofrece increíble versatilidad para el análisis de archivos en tiempo de ejecución. La utilización de herramientas como Pin en plataformas móviles nos permite profundizar aún más el estudio de muestras maliciosas, ganando información que de otro modo no estaría a nuestro alcance.

La flexibilidad de entornos de este estilo deja lugar a la exploración de nuevos escenarios mediante la programación de propias herramientas, expandiendo los límites de la investigación hasta los mismos límites de la creatividad del analista.