Hace algún tiempo se analizó en este blog Yara, una herramienta para la identificación y clasificación de malware. En esta oportunidad, sin embargo, se pretende un enfoque que vaya más allá de las aplicaciones en el análisis de códigos maliciosos. Después de todo, cualquier archivo es una secuencia de bytes, y Yara nos permitirá encontrar patrones entre estas secuencias. Luego, bajo esta premisa, presentaremos un ejemplo práctico para distinguir imágenes que tienen disponible información de GPS entre sus datos.
Antes de ir al ejemplo práctico propuesto, debería responderse la siguiente pregunta: ¿Por qué Yara? Esta herramienta encuentra mayor utilidad cuando se aplica al análisis de malware, ya que permite la definición de reglas que determinan si una aplicación realiza acciones potencialmente maliciosas o no.
Para hacer una analogía, si una persona lleva consigo un cuchillo, podríamos pensar que es un agresor o un carnicero que se dirige a su trabajo. En todo caso, debería indagarse más para determinar las intenciones de la persona que porta el cuchillo, pero el tiempo que se ahorra descartando a aquellos que no poseen armas no es menor.
Volviendo a lo que nos concierne, una aplicación que se conecte a una dirección IP y descargue algún archivo .exe podría ser maliciosa o no, pero de por sí ya resulta sospechosa: tiene las características de un Trojan Downloader. A partir de esto, y la combinación con otras acciones potencialmente maliciosas, puede identificarse la familia de malware a la que pertenece un archivo, sin ejecutarlo.
Ahora bien, vale la pena destacar que Yara permite aplicar las reglas a una amplia cantidad de archivos muy rápidamente. Además, su utilización y sintaxis es muy sencilla: sólo basta definir las reglas y las condiciones en que esas reglas se combinan. Por último, Yara es una gran opción porque es multiplataforma y permite la integración con lenguajes de programación como Python o Ruby.
Ahora sí, ¿cómo puede aplicarse Yara para determinar en un conjunto de imágenes cuáles tienen información de GPS y cuáles no? Lo primero que debería hacerse es buscar entre los bytes del archivo la secuencia que indica la existencia de este tipo de información. En general, ésta se encuentra disponible en el encabezado Exif, mediante el campo GPSInfo. A continuación se observan los bytes de una imagen que contiene información de GPS, expresados en notación hexadecimal:
A la izquierda está el contenido de la imagen y a la derecha la interpretación de cada uno de los campos del encabezado. Puede verse que, dentro de los campos IFD0, está presente GPSInfo. Cada uno de estos campos consta de 12 bytes, pero lo que realmente nos interesa es la parte invariable de GPSInfo; los primeros 4 bytes. Así, dado que GPSInfo siempre empieza con el valor 0x88250004, podría escribirse la siguiente regla en Yara:
Sin embargo, puede ocurrir que casualmente esa secuencia de bytes se encuentre en cualquier parte del archivo, con otro significado, con lo cual también se detectarían archivos que no tienen datos de GPS, o incluso que no son imágenes. Por ello, agregaremos la condición de que el archivo comience con el encabezado JPEG (0xD8FF) y que contenga el encabezado Exif:
Pero aún no se ha corregido la condición de GPSInfo: esta secuencia de bytes podría repetirse en algún lugar aleatorio dentro del archivo, con otro significado. Por ello, se agregará la condición de que la cantidad de entradas IFD0 (en el campo IFD0 entries) no sea igual a cero (dado que dentro de estas entradas se encuentra GPSInfo), y que los 4 bytes iniciales de GPSInfo se encuentren dentro de la porción de entradas IFD0, saltando de a 12 bytes:
Este sencillo ejemplo podría aplicarse para encontrar rápidamente qué archivos son imágenes JPEG con información disponible de coordenadas GPS, de entre cientos o miles de archivos. Más allá del ejemplo, se debe remarcar la versatilidad de Yara para la clasificación e identificación de archivos, no sólo en el análisis de malware.