Cómo crear una firma FLIRT utilizando las reglas de Yara para el análisis estático de malware ELF – JPCERT/CC Eyes
Se ha observado que el malware ELF elimina la información de los símbolos durante su compilación. Esto crea trabajo adicional en el análisis de malware para identificar el nombre de cada función porque no los conoce. Además, en IDA, una herramienta de análisis, las firmas FLIRT existentes [1] (en adelante abreviadas como firmas FLIRT en este artículo) a menudo no son aplicables a las funciones del malware ELF, lo que dificulta el análisis cuando no se encuentran las firmas correctas.
Este artículo de blog describe cómo identificar nombres de funciones utilizando las reglas de Yara. También explica cómo utilizar “AutoYara4FLIRT”, un script IDA que genera automáticamente reglas de Yara para este método. La herramienta está disponible en GitHub y puede descargarla y utilizarla desde la siguiente página web.
JPCERTCC/AutoYara4FLIRT – GitHub
https://github.com/JPCERTCC/AutoYara4FLIRT
Problemas en el análisis estático del malware ELF
Cuando se crea un programa de Linux, cada biblioteca está vinculada y se genera un único binario ELF, como se muestra en la Figura 1. La información, como los nombres de las funciones, generalmente se almacena en secciones como .symtab o .strtab. En el caso del malware ELF, esta sección se elimina utilizando la opción de eliminación en el momento de su compilación. En el malware ELF, al eliminar los símbolos, los nombres de las funciones originales también se pierden para cada biblioteca vinculada estáticamente. Esto es problemático porque lleva mucho más tiempo analizarlo.
Figura 1: Enlaces estáticos e información de símbolos en binario ELF
Dificultad para encontrar las firmas FLIRT adecuadas
La firma FLIRT es una característica que permite a IDA identificar automáticamente bibliotecas y nombres de funciones existentes. Sin las firmas FLIRT, cuando los analistas de malware encuentran una función compleja como la que se muestra en la Figura 2, les resultaría difícil comprender su comportamiento. Sin embargo, si saben que la función es memcpy De antemano, dicho análisis no es necesario. Con una firma FLIRT que incluye el memcpy función, IDA puede identificar el nombre de la función, lo que ahorra tiempo en el análisis.
Figura 2: función memcpy
Las firmas FLIRT que IDA incluye por defecto no coinciden en la mayoría de los casos. Por lo tanto, se debe encontrar o crear una firma FLIRT adecuada. Sin embargo, encontrar una firma adecuada es muy difícil porque las firmas FLIRT no coinciden incluso cuando la condición de compilación o la versión de la biblioteca son diferentes. En el método tradicional de creación de firmas FLIRT, que se muestra en la Figura 3, las diferencias en las bibliotecas y sus versiones, las versiones del compilador y las condiciones de compilación afectan el binario ELF que se generará. Por esta razón, es difícil encontrar la firma FLIRT adecuada sin tener aquellas para diversas condiciones.
Figura 3: Método tradicional de creación de firmas FLIRT en IDA
Cómo crear firmas FLIRT usando las reglas de Yara
La Figura 1 muestra la descripción general de este método. Primero, se crea una regla Yara a partir del malware ELF. La regla está diseñada para buscar binarios ELF que todavía contienen información de símbolos. A continuación, utilice Retrohunt[2] en Virus Total con la regla Yara anterior para crear una firma FLIRT (.sig) a partir del binario ELF obtenido. La firma FLIRT se crea a partir del archivo Retrohunt basado en el malware ELF, que es más probable que coincida con el malware ELF objetivo.
Figura 4: Descripción general del método de creación de firmas de IDA utilizando las reglas de Yara
Además, para buscar binarios ELF con información de símbolos restante, se debe agregar la siguiente condición a la regla de Yara.
import "elf" rule Template{ condition: for 2 i in (0 .. elf.number_of_sections) : ( ((elf.sections[i].name == ".symtab") and (elf.sections[i].type == elf.SHT_SYMTAB)) or ((elf.sections[i].name == ".strtab") and (elf.sections[i].type == elf.SHT_STRTAB)) ) and not ( for 1 i in (0 .. elf.number_of_sections) : ( ((elf.sections[i].name == ".dynamic") and (elf.sections[i].type == elf.SHT_DYNAMIC)) ) ) }
Resultados de evaluación
Aplicamos este método a 50 malware ELF tanto en x86 como en ARM y utilizamos las firmas FLIRT creadas para resolver el nombre de cada función. El resultado mostró que, en promedio, se pueden crear firmas FLIRT para aproximadamente el 60% de las funciones del malware ELF x86 y aproximadamente el 30% de las del malware ARM ELF. Aunque descubrimos que hubo algunos casos excepcionales en el malware ELF x86 en los que este método no se puede utilizar bien, la tasa de coincidencia fue de alrededor del 60 % para la mayoría de las muestras, y para algunas de ellas, la tasa de coincidencia fue incluso superior al 90 %. Por otro lado, la tasa de coincidencia para el malware ARM ELF fue menor, lo que indica que es necesario mejorar este método. Consulte las Tablas 1 y 2 en el Apéndice para obtener detalles de los resultados. El número de todas las funciones en las muestras de destino se define como Funciones totalesy el número de funciones que coinciden con las firmas FLIRT creadas a partir del binario Retrohunt ELF se define como Funciones coincidentes.
Para la selección de muestras, obtuvimos 300 muestras de malware ELF cargadas más recientemente en MalwareBazaar. [3] a noviembre de 2022. Luego, se seleccionaron 50 muestras relevantes para arquitecturas x86 y ARM. Por lo tanto, no se consideró el tipo de malware, pero se incluyeron como objetivos cuando se evaluó el método mirai, gafgyt, TSCookie, Coinminer y otros. Tenga en cuenta también que el resultado son valores de referencia, ya que varían dependiendo de si los archivos binarios ELF que contienen las bibliotecas de destino están en Virus Total o no.
AutoYara4FLIRT, un generador automático de reglas de Yara para crear firmas FLIRT
En este método, las reglas de Yara deben crearse a partir del malware ELF, y AutoYara4FLIRT es un generador automático de reglas de Yara. La herramienta fue creada como un complemento para IDA. Para usar AutoYara4FLIRT, mueva AutoYara4FLIRT.py a la carpeta de complementos de IDA, seleccione AutoYara4FLIRT en el menú de complementos de IDA. Se genera un archivo Yara en la misma carpeta y los resultados del archivo Yara se pueden ver en IDA. En la Figura 5 se muestra un ejemplo de ejecución de AutoYara4FLIRT.
Figura 5: Resultado de ejecutar AutoYara4FLIRT
Normalmente, las reglas de Yara se crean descifrando cadenas y secuencias de instrucciones del desensamblador contenidas en el malware. AutoYara4FLIRT genera automáticamente reglas de Yara utilizando las cadenas de desensamblador necesarias para la creación de reglas de Yara. Dado que la secuencia de instrucciones del desensamblador extraída cubre múltiples bibliotecas vinculadas estáticamente, se extrae de múltiples bloques separados y, para capturar diferencias como las condiciones del compilador, se utiliza la secuencia más larga entre ellas. Al realizar Retrohunting utilizando las reglas de Yara generadas, se pueden buscar los binarios ELF con información de símbolos, lo que ahorra tiempo y esfuerzo al crear firmas FLIRT.
Herramienta de automatización CLI para aplicar este método a múltiples tipos de malware
Para utilizar este método para varios tipos de malware, puede utilizar la siguiente herramienta CLI en la línea de comando para generar automáticamente reglas de Yara a la vez. También es posible generar firmas FLIRT (.sig) a la vez para múltiples binarios ELF que han sido editados en Retrohunt según las reglas de Yara. Consulte el siguiente enlace para obtener más información.
JPCERTCC/AutoYara4FLIRT#CLI_AutoYara – GitHub
https://github.com/JPCERTCC/AutoYara4FLIRT#CLI_AutoYara
En el caso de utilizar otros servicios distintos a Virus Total
Este método supone que se puede utilizar Retrohunt y requiere una cuenta paga de Virus Total. Sin embargo, al utilizar los siguientes servicios, puede buscar archivos según las reglas de Yara de forma gratuita.
Para concluir
Este método se puede utilizar para crear firmas FLIRT para malware ELF que es difícil de analizar estáticamente porque las firmas FLIRT existentes no son aplicables. Además de x86 y ARM, el método también se puede utilizar para x86-64 y MIPS, por lo que recomendamos probarlo en una variedad de malware ELF que ha sido difícil de analizar.
Yuma Masubuchi
Traducido por Takumi Nakano.
Referencias
[1] COQUETEAR
https://hex-rays.com/products/ida/tech/flirt/
[2] ellos regresaron
https://support.virustotal.com/hc/en-us/articles/360001293377-Retrohunt
[3] Bazar de malware
https://bazar.abuse.ch/
Apéndice
Tabla 1: Resultados de verificación del método (x86)
No | Funciones coincidentes / Funciones totales (x86) | Proporción de coincidencia (x86) [%] |
---|---|---|
1 | 82 / 141 | 58.2 |
2 | 193 / 3267 | 5.9 |
3 | 87 / 152 | 57.2 |
4 | 79 / 138 | 57.2 |
5 | 87 / 145 | 60.0 |
6 | 84 / 148 | 56,8 |
7 | 93 / 201 | 46.3 |
8 | 168 / 273 | 61,5 |
9 | 85 / 153 | 55,6 |
10 | 82 / 155 | 52,9 |
11 | 83 / 147 | 56,5 |
12 | 1 / 183 | 0,5 |
13 | 923 / 1006 | 91,7 |
14 | 87 / 146 | 59,6 |
15 | 85 / 153 | 55,6 |
dieciséis | 93 / 176 | 52,8 |
17 | 83 / 149 | 55,7 |
18 | 83 / 149 | 55,7 |
19 | 1 / 161 | 0,6 |
20 | 96 / 175 | 54,9 |
21 | 1 / 162 | 0,6 |
22 | 82 / 147 | 55,8 |
23 | 1 / 163 | 0,6 |
24 | 86 / 157 | 54,8 |
25 | 95 / 154 | 61,7 |
26 | 93 / 205 | 45,4 |
27 | 132 / 204 | 64,7 |
28 | 89 / 152 | 58,6 |
29 | 85 / 153 | 55,6 |
30 | 83 / 159 | 52.2 |
31 | 82 / 151 | 54.3 |
32 | 87 / 146 | 59,6 |
33 | 84 / 145 | 57,9 |
34 | 96 / 161 | 59,6 |
35 | 81 / 142 | 57.0 |
36 | 129 / 197 | 65,5 |
37 | 82 / 147 | 55,8 |
38 | 85 / 151 | 56.3 |
39 | 128 / 214 | 59,8 |
40 | 136 / 214 | 63,6 |
41 | 1 / 162 | 0,6 |
42 | 168 / 271 | 62.0 |
43 | 82 / 139 | 59.0 |
44 | 128 / 207 | 61,8 |
45 | 84 / 142 | 59.2 |
46 | 78 / 148 | 52,7 |
47 | 133 / 204 | 65.2 |
48 | 1010/1342 | 75,3 |
49 | 1009/1336 | 75,5 |
50 | 1010/1336 | 75,6 |
– | Promedio | 62,5 |
Tabla 2: Resultados de validación del método (ARM)
No | Funciones coincidentes / Funciones totales (ARM) | Relación de coincidencia (ARM) [%] |
---|---|---|
1 | 78 / 196 | 39,8 |
2 | 70 / 223 | 31.4 |
3 | 35 / 186 | 18.8 |
4 | 103 / 299 | 34.4 |
5 | 121 / 266 | 45,5 |
6 | 38 / 170 | 22.4 |
7 | 26 / 153 | 17.0 |
8 | 70 / 186 | 37,6 |
9 | 31 / 158 | 19.6 |
10 | 75 / 237 | 31,6 |
11 | 26 / 156 | 16.7 |
12 | 75 / 236 | 31,8 |
13 | 56 / 253 | 22.1 |
14 | 76 / 236 | 32.2 |
15 | 55 / 255 | 21.6 |
dieciséis | 106 / 252 | 42.1 |
17 | 31 / 163 | 19.0 |
18 | 68 / 192 | 35.4 |
19 | 79 / 225 | 35.1 |
20 | 26 / 153 | 17.0 |
21 | 31 / 163 | 19.0 |
22 | 70 / 233 | 30.0 |
23 | 74 / 237 | 31.2 |
24 | 69 / 190 | 36.3 |
25 | 47 / 272 | 17.3 |
26 | 77 / 200 | 38,5 |
27 | 75 / 200 | 37,5 |
28 | 50 / 211 | 23.7 |
29 | 32 / 160 | 20.0 |
30 | 111 / 264 | 42.0 |
31 | 76 / 209 | 36.4 |
32 | 31 / 163 | 19.0 |
33 | 152 / 255 | 59,6 |
34 | 33 / 180 | 18.3 |
35 | 70 / 282 | 24.8 |
36 | 31 / 170 | 18.2 |
37 | 28 / 145 | 19.3 |
38 | 31 / 159 | 19.5 |
39 | 36 / 171 | 21.1 |
40 | 97 / 244 | 39,8 |
41 | 27 / 154 | 17,5 |
42 | 78 / 207 | 37,7 |
43 | 71 / 280 | 25.4 |
44 | 73 / 196 | 37.2 |
45 | 72 / 194 | 37.1 |
46 | 36 / 171 | 21.1 |
47 | 73 / 196 | 37.2 |
48 | 31 / 163 | 19.0 |
49 | 76 / 275 | 27,6 |
50 | 31 / 159 | 19.5 |
– | Promedio | 28.4 |