martes, 4 de febrero de 2014

Generador de firmas para YARA

Nos gustaría presentaros un generador de firmas para la herramienta YARA. Este generador permite modelar una familia de malware para, por ejemplo, producir una firma que las caracterice. YARA es una herramienta de licencia libre que permite a los analistas de malware identificar y clasificar malware. Con YARA es posible crear un conjunto de reglas que modelen a una familiar de malware en particular. Una firma simple consistiría en detectar las cadenas de texto que se encuentran codificadas en el archivo binario y que son características de esa familia. Por ejemplo, la presencia de la cadena "PiceBOT" dentro de un binario podría ser característico de la familia PiceBOT. No obstante, esta firma tan sencilla puede ser evadida por un creador de malware simplemente ofuscando la cadena.

Otro generador de firma, como el PIC (Position Independent Code), permite modelar parte de un programa, por ejemplo, realizando un modelo de cada instrucción correspondiente a la parte del programa a modelar a excepción de las redirecciones internas como está descrito aquí. No obstante modelar cada una de estas instrucciones generaría una firma YARA excesivamente grande. Nuestra propuesta consiste en un generador de firma que modele una parte amplia de instrucciones mientras que mantiene la misma huella de firma y el mismo rendimiento.


Gráfico del flujo de ejecución de la función de comprobación de integridad.

El gráfico del flujo de ejecución de un programa representa una ruta que podría ser atravesada por un programa durante su ejecución. El gráfico de flujo modela el bloque de código que representan las instrucciones terminando con una redirección interna, por ejemplo saltos, llamadas, etc, que redirijen el flujo de ejecución a otra parte de la función.

El algoritmo PIC modela una zona contigua de instrucciones sin la redirección. Sin esta parte el código modelado es independiente de la posición, sin embargo, modelando las instrucciones dentro de cada bloque permite obtener un tamaño de regla YARA adecuado. De hecho el tamaño de la regla será proporcional al número de instrucciones modeladas.

En oposición al algoritmo anterior, proponemos otro tipo de generador basado en las redirecciones internas e independiente del código entre cada redirección. Las redirecciones pueden variar de intervalo. Por supuesto, incrementando el intervalo incrementa a su vez la complejidad pero esto no influencia en el tamaño de la firma.

En orden de comparar ambos generadores de firma hemos modelado la función responsable de la comprobación de integridad de un archivo encapsulado por el software NSIS 2.46. El flujo de control de esta función esta representado en la imagen superior. Cada bloque, representado por un rectángulo negro, modela una zona contigua de instrucciones terminando con una redirección interna. Las redirecciones internas están representadas por flechas en rojo, azul y verde.

Abajo vemos la firma que modela la parte de la función que comprueba la integridad del binario (mostrado con el rectángulo de aristas compuestas por puntos negros en la imagen) generado por el algoritmo Position Independent Code (tomado del blog de D. French)


rule NSIS_246
{
strings:
$NSIS_246_CheckIntegrity = { 57 53 E8 ?? ?? ?? ?? 85 C0 0F 84 ?? ?? ?? ?? 83 3D ?? ?? ?? ?? 00 75 ?? 6A 1C 8D 45 D8 53 50 E8 ?? ?? ?? ?? 8B 45 D8 A9 F0 FF FF FF 75 ?? 81 7D DC EF BE AD DE 75 ?? 81 7D E8 49 6E 73 74 75 ?? 81 7D E4 73 6F 66 74 75 ?? 81 7D E0 4E 75 6C 6C 75 ?? 09 45 08 8B 45 08 8B 0D ?? ?? ?? ?? 83 E0 02 09 05 ?? ?? ?? ?? 8B 45 F0 3B C6 89 0D ?? ?? ?? ?? 0F 8F ?? ?? ?? ?? F6 45 08 08 75 ?? F6 45 08 04 75 ?? }
condition:
$NSIS_246_CheckIntegrity
}

Abajo vemos la firma generada que modela la función de comprobación de integridad completa usando nuestro algoritmo con un intervalo de 1.

rule NSIS_246_v2
{
strings:
$sub_402C74 = {75 ?? [4-6] E9 ?? 01 00 00 [45-47] 0F 8E ?? 00 00 00 [27-29] 7C ?? [10-12] 0F 84 ?? 01 00 00 [6-8] 75 ?? [19-21] 75 ?? [6-8] 75 ?? [6-8] 75 ?? [6-8] 75 ?? [6-8] 75 ?? [31-33] 0F 8F ?? 00 00 00 [3-5] 75 ?? [3-5] 75 ?? [7-9] 76 ?? [1-3] EB ?? [3-5] 75 ?? [13-15] 7D ?? [22-24] 0F 8F ?? FF FF FF [15-17] 74 ?? [2-4] 74 ?? [23-25] 74 ?? [5-7] 75 ?? [41-43] 74 ?? [4-6] EB ?? [7-9] EB ?? [16-18] 74 ??}
condition:
$sub_402C74
}

Podemos observar lo siguiente:

- El tamaño de firma es el mismo para ambos mientras que la firma generada por nuestro algoritmo modela la función completa. En otras palabras, podemos modelar funciones más grandes manteniendo el mismo tamaño de la firma YARA generada.

- La complejidad no es diferente a la primera firma (el tiempo para escanear un archivo de 20Mb es prácticamente el mismo en ambos algoritmos)

En la siguiente imagen, podemos observar el número de bytes cubiertos por la firma PIC y los cubiertos por nuestra firma generada por nuestro algoritmo. Obsérvese como la firma generada por nuestro algoritmo cubre hasta tres veces más instrucciones que la firma generada por PIC mientras que el tamaño de la firma, como hemos comentado, sigue siendo similar al de la firma generada por YARA.


Bytes correspondientes a las firmas YARA
(arriba la firma generada por el algoritmo PIC, abajo la firma de nuestro algoritmo propuesto)


La calidad de un generador de firmas está relacionada con la tasa de falsos positivos y éxito en la detección. Un buen generador tendrá un ratio bajo de falsos positivos y un amplio porcentaje de detección mientras que un mal generador, al contrario, generará muchos falsos positivos y mantendrá una tasa de detección baja. 

En la medida de valorar la calidad de nuestro generador, hemos actualizado dos firmas en VirusTotal. Cuando una firma se corresponde con un archivo (genera un positivo) se produce una notificación. Después de un día, tras evaluar las firmas con un conjunto de datos conteniendo 300.000 muestras hemos alcanzado la misma tasa de detección que el algoritmo PIC a la vez que hemos logrado una tasa nula de falsos positivos.

Merece la pena mencionar que nuestro generador de firmas no está restringido a los binarios del sistema operativo Windows sino que puede ser usado para otras plataformas como Android, iOS o Windows Phone.





Laurent Delosières
ldelosieres@hispasec.com

6 comentarios: