Howto: Cómo escribir reglas de Yara en Koodous

La entrada de hoy, una traducción de este post con algunos elementos extra, va a cargo de Antonio Sanchez, un analista de seguridad (y autor del post en inglés) que forma parte de Hispasec y del proyecto Koodous, basado en inteligencia colectiva para proteger tu Android y dirigido tanto a usuarios finales como a investigadores de seguridad. Esperemos que les resulte interesante.

 

En esta entrada del blog nos gustaría enseñar cómo escribir reglas Yara en Koodous. Koodous tiene una forma un poco especial de funcionar con los APKs y la intención de este artículo es dejarla clara, además de explicar la estructura básica de una regla Yara. Nótese que el objetivo de este post no es cómo analizar malware para Android, sino cómo crear reglas Yara en Koodous, así que suponemos que el usuario tiene nociones de análisis y será capaz de extraer las cualidades que definan una aplicación.

Todas las intrucciones que se van a utilizar en esta entrada han sido probadas en sistemas Linux, aunque son fácilmente extrapolables a Windows y MacOs.

¿Qué debes conocer de Yara?

Yara es “The pattern matching swiss knife for malware researchers (and everyone else)” según su autor, Víctor M. Álvarez de VirusTotal. Este software es libre y gratis, bajo licencia Apache 2.0 y cualquiera puede colaborar a mejorar el proyecto. En Security Art Work ya os hemos hablado de esta herramienta y sus utilidades en diferentes artículos anteriores.

Yara se basa en búsqueda de patrones y al hablar de patrones nos referimos a:

  • Cadenas
  • Expresiones regulares
  • Patrones binarios (hexadecimal)

Ésto se utiliza para clasificar el malware acorde a los patrones definidos. Empecemos con una regla básica para empezar a comprender el lenguaje Yara:

rule silent_banker : banker
{
meta:
description = "This is just an example"
thread_level = 3
in_the_wild = true

strings:
$a = {6A 40 68 00 30 00 00 6A 14 8D 91}
$b =  /[0-9a-f]{32}/
$c = "UVODFRYSIHLNWPEJXQZAKCBGMT"

condition:
$a or $b or $c
}

En primer lugar definimos el nombre de la regla junto al tag o tags que nos gustaría asignarle.

En segundo lugar tenemos el bloque “meta”. En él podemos poner información acerca de las muestras que detecta la regla, el autor de la regla, la fuente, hashes de muestras analizadas o cualquier otra información relacionada con la regla. Este bloque no tiene nombres definidos, por lo que te puedes sentir libre de borrar o añadir los que necesites.

Después de esto tenemos la definición de cadenas o expresiones. Cada patrón va asignado a una variable que comienza por $. En el ejemplo anterior la variable $a almacena esa cadena en hexadecimal, la variable $b la expresión regular perteneciente a un hash md5 y la variable $c una cadena de texto literal.

Para finalizar la regla nos encontramos las condiciones. En este caso, la regla produciría una salida positiva en el caso de encontrar cualquiera de los patrones anteriormente definidos. Aquí se pueden poner condiciones más complejas basándose en prioridades con paréntesis y utilizando los operadores “and” y “not” además del “or

¿Cómo está formado un APK?

Para entender cómo funciona Koodous con Yara y los APKs vamos a explicar cómo está formada una aplicación de Android o APK. Básicamente un APK es un archivo ZIP que en su interior contiene diferentes archivos comprimidos y en formato binario.

yara0

Imagen 1: Estructura de un APK comprimido

Para que sea más fácil y útil la búsqueda de cadenas y expresiones dentro de un APK en Koodous, descomprimimos el archivo y posteriormente buscamos las distintas reglas Yara sobre él.

¿Cómo se utiliza Yara en Koodous?

En primer lugar se descomprime el APK y junto con los reportes de los análisis y las reglas Yara definidas por los usuarios se ejecuta en el motor de Yara.

yara1

El APK que vamos a utilizar de ejemplo durante el proceso es el siguiente: https://analyst.koodous.com/apks/30c6298101d971360250378a0b5ede7b3a4b77db1c556877e7db2442cc917428

Para poder descargar el archivo es necesario registrarse en la plataforma a través de https://koodous.com/register

Para tener el APK descomprimido en un solo archivo hemos generado un script muy básico que se puede descargar de Github para probar tú mismo las reglas en tu sistema: https://raw.githubusercontent.com/Koodous/Scripts/master/unpack_apk.py

Vamos a empezar a trabajar con el APK descomprimiéndolo usando el script anterior:

$ ./unpack_apk.py sample.apk

Esto nos generará el archivo sample.apk.unpacked

Este archivo es todo el APK descomprimido y concatenado en un sólo archivo, para hacer más fácil su manipulación con Yara si quieres probarlo en tu máquina antes de subirlo al sistema.

A continuación vamos a extraer las cadenas interesantes, volvemos al APK original y lo descomprimimos con un simple unzip:

$ unzip sample.apk

El archivo APK en su interior contiene, además de otros archivos de recursos, el archivo de código compilado classes.dex, así que al descomprimirlo lo encontraremos ahí. En este ejemplo suponemos que sabemos que este malware tiene su comportamiento malicioso en el archivo de classes.dex, así que lo abrimos con un editor binario, por ejemplo bless:

$ bless classes.dex

Vemos que empieza por la cadena “dex 035”, en hexadecimal: { 64 65 78 0A 30 33 35 }. Esta secuencia de bytes en la cabecera de un archivo es la que lo identifica como un archivo dex. Ahora vamos a buscar cadenas que sepamos que son únicas del malware, como por ejemplo, nombres de clases.

Siguiendo nuestro ejemplo encontramos las siguientes cadenas:

“Androrat.Client.storage” { 41 6E 64 72 6F 72 61 74 2E 43 6C 69 65 6E 74 2E 73 74 6F 72 61 67 65 }

También podemos hacerlo de una forma más sencilla, utilizando la utilidad strings

$ strings -n 6 classes.dex

Este comando nos muestra las cadenas imprimibles con un tamaño mayor o igual a 6, con eso nos quitamos mucha basura que el propio dex puede generar en su compilación. Se extraen muchas cadenas, pero debemos quedarnos con algunas interesantes como la siguientes:

  • <clinit>
  • setImei
  • MONITOR_CALL
  • MONITOR_SMS
  • MONITOR_SMS
  • java
  • *Androrat.Client.storage : pas une commande getPhoneNumberSMS

Underfitting y Overfitting

Estos dos términos son utilizados en “machine learning” para nombrar funciones que no definen correctamente la solución al problema. Veamos cómo se aplican a las reglas Yara.

Se produce overfitting cuando una regla Yara se ajusta demasiado a una muestra. Por ejemplo, si hiciéramos una regla Yara que contuviera todas las cadenas del malware, esa regla sólo detectaría esa muestra y no sería útil para detectar nuevos ejemplares.

El underfitting es justo lo contrario. Imaginad que creamos una regla que busque la cadena “a”. Esta regla produciría mucho ruido, detectaría prácticamente el 100% de aplicaciones Android, por lo que no sería nada útil y estaría generando falsos positivos.

Lo correcto y útil es buscar una solución de compromiso, es decir, buscar los patrones relevantes de la muestra o muestras de malware para caracterizarlo correctamente con Yara.

Volviendo al ejemplo del punto anterior, si conocemos un poquito el formato dex, deberemos descartar la cadena <clinit> porque sabemos que aparece en los archivos dex de aplicaciones legítimas.

Las otras 7 cadenas son válidas para detectar el malware, porque no son típicas de aplicaciones normales, pero podemos observar cómo la cadena “Androrat” se repite más de una vez y puede ser un claro indicador del malware. Procedemos a hacer un grep sobre las cadenas del classes.dex para comprobarlo:

$ strings -n 6 classes.dex | grep -i androrat

Esto nos devuelve estas cadenas:

Lmy/app/client/AndroratActivity;
AndroratActivity.java
*Androrat.Client.storage : pas une commande

Todo indica que son las más adecuadas para crear una regla consistente. A continuación, vamos a generar la regla:

//En primer lugar, ponemos un nombre identificativo a la regla
rule androrat
{
meta:
description = “Este malware es un bot que permite hookear sms, llamadas y otra información”
source = “Fuente de donde hemos extraído la información, en caso de que no sea propia”
author = “asanchez@koodous.com”

strings:
// A continuación vamos a definir las strings que vamos a utilizar en la regla
$activity = “AndroratActivity.java”
$classPath = “my/app/client/AndroratActivity”
$method = “Androrat.Client.storage”

condition:
// La condición para que la regla genere un positivo, en este caso queremos que se encuentren todas las cadenas porque sabemos que son lo suficientemente identificativas
all of them
// Pero también podemos decir que se encuentre alguna de ellas
// any of them
// o 2 de ellas
// 2 of them
}

Ahora guardamos la regla, nos dirigimos al APK que estamos analizando en Koodous y pulsamos “Reanalyze”. Esto hará que se compruebe este APK contra todas las reglas que existen en el sistema nuevamente.

Cuando el sistema termine de analizarlo nos lo comunicará en la zona de notificaciones y podremos ver si nuestra regla ha funcionado para este APK. Para ello vamos a detecciones, en la parte superior de la regla y nos debe aparecer el APK detectado.

Configurando una regla

Las reglas Yara en Koodous pueden tener varios estados:

  • Public/Private: Una regla pública puede ser vista por todos los usuarios de la plataforma. La privada sólo puede verlas tú mismo.
  • Active/Disabled: Cuando una regla está activa se utiliza para buscar nuevas muestras. Si está desactivada no se utilizará.
  • “Notify me”/”Do not notify”: Este estado está relacionado con las notificaciones de la regla, es decir, cuando se encuentra un nuevo APK que concuerda con la regla se notificará al usuario a través de las notificaciones del sistema.
  • Social environment: Una regla social es la que contribuye al antivirus colaborativo. Por supuesto, antes de hacer una regla social en el sistema debemos mantenerla unos días y comprobar si lo que detecta es malware o si incluye algún falso positivo. Si se detectan falsos positivos debemos modificar la regla añadiendo más cadenas identificativas o eliminando las que generan ese falso positivo.

Cromosome

En Koodous desarrollamos un pequeño script para hacer esta tarea algo menos tediosa, basándola en 2 grupos, goodware y malware.

En primer lugar debemos generar un grupo_good de aplicaciones buenas. Esto es, podemos descargar aplicaciones como Twitter, Telegram, WhatsApp o cualquier otra que sepamos con certeza que es goodware. Estas las podemos encontrar en Koodous buscando rating:+2+ y descargamos unas 10 lo más representativas posible.

En segundo lugar debemos buscar varias muestras de malware que pertenezcan a la misma familia, esto es, que tengan un comportamiento similar. Para este ejemplo hemos descargado 13 aplicaciones goodware y las hemos guardado en la carpeta grupo_good.

Para la búsqueda de malware hemos encontrado la siguiente muestra fraudulenta: https://analyst.koodous.com/apks/96d449f5073bd7aaf50e06a6ed1eb2ed0afaca3ed60581c5c838aa7119fb0e97

No es parte de esta guía explicar el análisis de aplicaciones, pero se ha analizado y se trata de un SMSSender, o lo que es lo mismo, una aplicación que envía SMSs (normalmente premium) sin consentimiento del usuario.

Ahora tenemos que buscar muestras similares. Para ello podemos buscar, por ejemplo, el nombre de paquete en Koodous, aunque se podrían buscar otras muchas características, como nombre de aplicación, certificado de desarrollador, etc.

Vamos a Koodous y buscamos:

Esto nos mostrará bastantes aplicaciones con el mismo icono, nombre, desarrollador, e incluso tamaño. Perfecto, tenemos suficiente información para hacer una firma consistente, así que procedemos a descargar 10 o 15 de ellas en la carpeta “group_mal”.

Ahora, vamos a ejecutar el script cromosome con los dos conjuntos de aplicaciones:

$ ./cromosome.py -a group_mal/* -b group_good/*

Este comando extraerá las cadenas de todos los APKs y generará la intersección entre los grupos de goodware y malware, obteniendo el siguiente resumen:

“””
7952     common string found between all files in A group
1044287  union strings found in B group
5226     string from A group not present in B group
“””

Esto quiere decir que tenemos 5226 potenciales cadenas para clasificar este tipo de malware. Si nos devolviera 0 cadenas significaría que las aplicaciones del grupo de malware no tienen nada en común, esto es, no hemos realizado una correcta selección.

Viendo las cadenas que genera el script podríamos seleccionar estas como las más identificaticas:

  • http://117.79.227.178:9991
  • "tn":"%s","user":"%s","locale":"%s","terminal_version":"%s","terminal_resolution":"%s","os_name":"%s","os_version":"%s","device_model":"%s","terminal_type":"%s","appId":"%s","uid":"%s","mac":"%s","time_zone":"%s","network_mode":"%s","imsi":"%s","baseband_version":"%s","kernel_version":"%s","support_map":"%s","se_map":"%s"
  • http://172.17.236.157:8082/app/mobile/json
  • Fail to construct message

La regla sería algo como lo siguiente:

yara2

Pero en realidad, 2 de ellas no son correctas: las IP. No es correcto utilizar las IP porque podrían generar “overfitting” de la regla y no serían útiles, así que seguimos buscando cadenas y nos encontramos con estas:

  • 9AEKIJM?
  • setDiscount
  • {"v":"%s","cmd":"sms","params":{"first_pay_flag":"%s",%s}}
  • "IsFetchSms":"1","SoundTime":"10","LbsTime":"3000","SmsPattern":"

A continuación volvemos a Koodous para escribir la siguiente regla completa utilizando las cadenas anteriores:

yara11

Vamos a probarla con los APKs que hemos buscado previamente mediante nombre de paquete pulsando el “Reanalyze” en cada uno de ellos.

Nos llegarán las notificaciones y además, en la parte superior de la zona de edición de la regla nos saldrá un mensaje como este:

yara3

Ahora, si queremos compartir la regla con compañeros o con usuarios de otras redes, podemos acceder a la parte pública de la regla pulsando en enlace “Public page” en la parte superior.

Finalmente, cuando comprobemos que la regla funciona correctamente, es hora de hacerla SOCIAL, esto es, hacer que forme parte del gran antivirus colaborativo que es Koodous. Para ello sólo debemos pulsar en el enlace, que nos pedirá confirmación. Tras esto, se comprobará automágicamente que la regla cumple las condiciones para ser social y recibiremos una notificación como esta cuando termine el proceso:

yara4

¡Bienvenido! ¡Ahora estás colaborando un poco más en la comunidad de Koodous!

Por último, comentar para los que soléis usar Yara en vuestro día a día que existe un proyecto, www.yararules.com, en el que como podéis ver en su repo de Github van recopilando y clasificando firmas open-source de Yara. En dicho repositorio incluyen una categoría denominada “Mobile_Malware” en el que desde Koodous vamos aportando y colaborando añadiendo las firmas más relevantes.

Antonio Sánchez · asanchez@koodous.com · @plutec_net

(Algunas de las imágenes de esta entrada están cogidas del post original de Antonio)