YARI: una nueva era de depuración de YARA

YARA es una herramienta muy conocida en la industria de la seguridad que se utiliza para clasificar e identificar muestras de malware. En Avast, hacemos todo lo posible para compartir nuestras mejoras y herramientas con la comunidad de código abierto. Un ejemplo de esto son las dos publicaciones de blog recientes donde publicamos dos herramientas relacionadas con YARA: YARA Language Server y YaraNG .

Escribir reglas YARA puede ser una tarea desafiante, pero depurarlas una vez escritas es aún más desafiante. Imagine que tiene una regla YARA pero no coincide con las muestras que espera. Parece un problema, pero ¿cómo averiguar qué está mal y solucionarlo? ¿Qué parte de la condición está causando el error? ¿Cómo debería usted, como autor, abordar esta situación?

Lo primero que viene a la mente es que puede intentar comentar partes específicas de la condición, reduciendo efectivamente su tamaño y complejidad a una parte más manejable. Ya está familiarizado con esta técnica de otros lenguajes de programación, por lo que comienza a jugar con la condición y, después de un tiempo, finalmente comenta la expresión exacta que causa el error. 

¿Pero a qué precio? Tuviste que hacer muchas conjeturas, crear muchos comentarios, deshacer muchas cosas y ejecutar muchas exploraciones de prueba. Pero, ¿qué sucede si la condición consta de muchas expresiones en la andcadena o si se trata de una cadena de reglas que dependen unas de otras? Este enfoque no escala bien.

Si no quiere seguir esta ruta, la segunda opción es usar la yara -Dopción para volcar las estructuras de datos del módulo. De esta manera obtienes más información. Pero necesita saber lo que está buscando y no hay soporte para llamadas a funciones, por lo que si está buscando el resultado de pe.imphash(), no tiene suerte. Tiene que construir el comando a mano, lo que también incluye encontrar la ruta a la muestra y la regla en sí. 

Luego se entera de que la salida no incluye la información sobre las cadenas. Entonces, debe ejecutar otro comando con -sinterruptor, que le muestra la información sobre las cadenas. Luego regresa a su editor y necesita buscar manualmente el valor de un símbolo en particular en el desplazamiento hacia atrás de su terminal. De esta manera, puede obtener una idea sólida de lo que equivalen algunos de los símbolos utilizados, pero necesita hacer el resto de la lógica (por ejemplo, comparaciones, operaciones lógicas, llamadas a funciones, referencias a otras reglas) usted mismo. Finalmente, la mayoría de los usuarios ni siquiera conocen esas funciones. Aunque he trabajado con YARA durante algunos años, me enteré de ellos recientemente.

Al final, aprende sobre el módulo de consola agregado recientemente, lo cual es excelente. Ahora puede usar impresiones de depuración para investigar las expresiones. Sin embargo, aún debe editar/cambiar su condición con el riesgo de olvidarse de las impresiones de depuración y mantenerlas en la regla final. También debe evitar el cortocircuito de las expresiones para asegurarse de que se puedan alcanzar sus declaraciones de registro en primer lugar. Además, todas las funciones de registro devuelven un Truevalor codificado, por lo que debe ser más creativo donde las coloca; no puede simplemente envolver sus expresiones existentes.

Como puede ver, depurar las reglas de YARA es notablemente difícil, especialmente para los nuevos usuarios. No hay herramientas dedicadas para esta tarea, solo unas pocas guías, y la mayor parte del tiempo estás solo. ¿Y si podemos mejorar esto? 

Presentamos YARI – YARA Interactivo . La nueva incorporación a nuestra familia de código abierto le permite evaluar expresiones YARA y proporciona integración con YLS para la mejor experiencia de usuario. Puede encontrar el código fuente en el repositorio avast/yari publicado bajo la licencia MIT.

Básicamente, YARI puede tomar una expresión YARA genérica como entrada y devolver el resultado de la evaluación. Por ejemplo, pasar la cadena time.now()devolverá Integer(1663178204), que es lo que ve YARA cuando se evalúa la condición. Sin embargo, no estamos limitados a consultas tan simples. YARI es compatible con todos los módulos integrados, incluidas constantes, matrices, diccionarios e incluso puede llamar a funciones con parámetros personalizados. Además, puede verificar cadenas y evaluar algunas expresiones más complejas que involucran, por ejemplo, operaciones binarias.

Internamente, YARI usa el concepto de Contextpara realizar un seguimiento del estado inicial para evaluar expresiones. El contexto contiene información sobre la muestra de entrada, la regla actual o los datos del módulo suministrados: la mayoría de las cosas que puede proporcionar a YARA como argumentos. Antes de evaluar, se junta toda esta información y de ella se deriva el resultado final. 

Diseñar un flujo de trabajo para un depurador YARA no fue una tarea fácil. Al final, decidimos no seguir la ruta del depurador convencional (p. ej gdb.), debido a la naturaleza declarativa de YARA. Queríamos proporcionar una experiencia de nivel mucho más alto para el usuario. Los usuarios tendrán la capacidad de seleccionar expresiones de la regla y evaluarlas en el contexto de la regla (explorar el estilo más convencional de depuración donde los usuarios tienen la capacidad de recorrer la condición podría ser un tema interesante para el futuro). Los objetivos de este proyecto son los siguientes:

  • Proporcione resultados realmente precisos, sin emulación, sin reimplementación de YARA, y use lo que ya está disponible.
  • No es necesario cambiar la condición de ninguna manera. Esto significa que no hay declaraciones de depuración olvidadas.
  • Facilidad de uso.

Integración YLS

YARA Language Server (YLS) es una herramienta que presentamos en una de nuestras publicaciones de blog recientes . Para que la depuración sea más accesible, hemos preparado la integración con YLS. Tu editor puede convertirse en una herramienta que te ayudará. No hay necesidad de cambiar de ventana. Primero, echa un vistazo a este sencillo ejemplo:

Muestra del flujo de trabajo de depuración.

Las reglas en el clip usan hashmeta para documentar qué muestras deberían generar aciertos o para la documentación mejorada. Esta es una buena práctica para aplicar a sus reglas y también se utiliza como punto de partida para la depuración. Para iniciar la sesión de depuración, haga clic en “Seleccionar hash para contexto” sobre el meta del hash, que inicializará el contexto de depuración. 

Hash metaentradas de la regla con botones para inicializar una sesión de depuración en particular.

Una vez que el contexto esté listo, puede pasar el cursor sobre las expresiones en la sección de condiciones y la ventana emergente contendrá el resultado de la evaluación. YLS intentará adivinar la mejor expresión para la evaluación, pero si desea tener más control, simplemente seleccione la parte exacta de la expresión y coloque el cursor sobre ella.

 Ventana emergente que contiene el resultado de la evaluación. 
El tipo Integerde resultado es y el valor se muestra en la base dechex
Finalmente, las expresiones actualmente seleccionadas (en este caso pe.overlay.size) se evalúan como True.

Ahora puede que se pregunte cómo le dice a YLS dónde buscar artefactos (muestras o datos de módulos) para usar. Puede configurar un directorio para su proyecto con todos esos archivos en la configuración del editor para YLS. YLS buscará recursivamente esta carpeta y todas sus subcarpetas, tratando de encontrar un archivo con el nombre del hash. Las muestras deben nombrarse con el hash del archivo. También puede tener un sufijo con el nombre del módulo YARA, que le indicará a YLS que use este archivo como datos del módulo. Por ejemplo, un archivo llamado <hash>.cuckoose usará como un módulo de datos de cuco ( ref. ).

Captura de pantalla de la configuración de VsCode que muestra cómo configurar el directorio base (opción inferior) para el descubrimiento de muestras y datos del módulo.

La instalación es bastante sencilla. Lo que necesita es actualizar su complemento YLS VsCode y su instalación de YLS. VsCode debería poder actualizar el complemento automáticamente, en caso de cualquier problema, debería poder hacerlo manualmente desde la Extensionspestaña. Para actualizar YLS, ejecute el siguiente comando pip install -U yls-yarao, para obtener pasos más detallados, consulte la documentación de YLS .

Paquete Python

En caso de que también quieras usar el depurador mediante programación, hemos preparado enlaces de Python para YARI . Actualmente admitimos la plataforma Linux y Windows, pero es posible agregar una nueva. Esos enlaces también son el núcleo de la integración de YLS. Para usarlos, simplemente instale yari-pyel paquete usando pip, que también contiene compilado y vinculado libyara:

          
          pip install yari-py

Una vez que todo esté instalado, podrá usar el siguiente código para evaluar expresiones (más información en la definición lib.rs del módulo Python):

          import yari

try:
    context = yari.Context(“/bin/sh”)
    print(context.eval(“elf.number_of_sections”))
except yari.YariError as e:
    print(str(e))

Los resultados de la expresión se convierten en tipos nativos de Python. Por ejemplo, las matrices de YARA se convierten en listas de Python para que pueda verificar la longitud utilizando las funciones integradas de Python. Lo mismo se aplica a las estructuras y diccionarios. Si desea obtener un booleano que represente si YARA considera la expresión como True, use la Context.eval_bool(‘expression’)función.

shell de línea de comandos

Para los usuarios avanzados, existe una aplicación de línea de comandos que genera un shell interactivo (inspirado en el shell de Python). Los usuarios pueden ingresar expresiones YARA y se muestran los resultados. El binario del depurador acepta parámetros similares a los del yarabinario original.

Sesión de depuración binaria de Yari-cli /bin/shcargada como muestra.

Arquitectura

Hemos decidido implementar el depurador en el lenguaje Rust . La implementación actual consta de tres cajas:

  • yari-sys: El núcleo y el puente a libyara. Las evalfunciones implementadas y las Contextestán aquí.
  • yari-cli: interfaz de línea de comandos para YARI.
  • yari-py: Enlaces de Python.

Yari-sys es un contenedor alrededor de libyara que agrega la funcionalidad del depurador encima. Los enlaces FFI se generan utilizando bindgen . También creamos un pequeño analizador para el subconjunto de expresiones YARA usando nom . Esta funcionalidad principal se expone luego mediante diferentes interfaces. Yari-cli usa rustyline para crear un shell interactivo donde los usuarios pueden evaluar varias expresiones. De manera similar, yari-py crea definiciones para un nuevo módulo de python utilizando maturin y pyo3 .

Conclusión

En esta publicación de blog, presentamos una nueva herramienta llamada YARI que se puede usar para depurar las reglas de YARA de manera efectiva. Las fuentes están disponibles en el repositorio de avast/yari. Nos encantaría escuchar los comentarios de la comunidad. Si tiene alguna idea o encuentra algún problema, no dude en contactarnos. Siéntase libre de abrir incidencias o extraer solicitudes, realmente lo apreciamos.

Fuente: https://engineering.avast.io/yari-a-new-era-of-yara-debugging/