Saltar al contenido

Cómo atrapar el malware usando la chispa – Hadoop en el mundo real

19 de julio de 2020

Quienes trabajan en la industria saben que una de las mejores técnicas para atrapar el malware mediante el aprendizaje automático (ML) sólo es posible con la informática distribuida. Antes de mostrarles las matemáticas de por qué requiere la computación distribuida, déjenme decirles qué es esta técnica y por qué es la mejor.

La mejor técnica en el negocio

Esta técnica, que será nombrada en un momento, es una de las mejores extracciones de características técnicas porque

  1. Funciona con todo tipo de muestras
  2. No depende de características hechas a mano, es automático.

Si estás familiarizado con el ML, te preguntarás, ¿por qué no confiar en los rasgos hechos a mano marca la diferencia?

La detección de malware es un dominio de adversarios, donde los hackers encuentran constantemente maneras de evadir los detectores de malware. Pueden «rellenar» el malware con características benignas, ocultar el malware dentro de archivos benignos («troyanos») y tener una miríada de otras formas de evitar ser detectados. En particular, las características diseñadas a mano son demasiado fáciles de diseñar en forma inversa para que los hackers puedan evadirlas.

Entonces, ¿qué es esta técnica? Es… caracterizando las muestras a través de N-gramas de su secuencia de código de bytes. Esta técnica es más o menos la columna vertebral estándar de la industria para un detector de malware ML. Antes de mostrarte cómo implementarlo en código, vamos a entender cómo funciona y mirar las matemáticas para ver por qué necesitas la informática distribuida para ejecutarlo.

Cómo funciona

Tome un archivo de muestra, digamos el instalador de python 3.7.7, disponible en https://www.python.org/ftp/python/3.7.7/python-3.7.7-amd64.exe

Podemos usar la herramienta xxd en bash para echar un vistazo a los primeros bytes de este archivo

La salida es una secuencia truncada de bytes:

Hay muchos más bytes de donde vinieron esos. El archivo es de aproximadamente 25.5mb. ¿Puedes decir cuántos bytes son?

Hagamos un cálculo rápido. 1mb es 1024 kb y 1kb es 1024 bytes, por lo que el número de bytes es aproximadamente

En otras palabras, un archivo típico es una secuencia de unos 27 millones de bytes. La técnica requiere «N-Gramas» en esta secuencia de bytes, así que entendamos lo que eso significa.

En términos generales, un «N-Gram» es una secuencia de «N» gramos consecutivos. La «N» es un marcador de posición para un número. Por ejemplo, hay «1-Gramos», «2-Gramos», «3-Gramos», y así sucesivamente.

El «Gram» en nuestro contexto es un byte. Así que en nuestro archivo de muestra,

Estos N-Gramas contienen en ellos información estadística local sobre la muestra que se está examinando. Por esa razón los clasificadores ML son capaces de aprovechar estos N-Grams para obtener predicciones precisas sobre si un archivo es malicioso o benigno, ¡incluso antes de que se ejecute!

Recomendado:  ¿Cómo funciona la fusión de clasificación barajada en la Chispa? - Hadoop en el mundo real

El desafío computacional

Ahora, para introducir los N-Gramas en un clasificador, hay que seguir varios pasos, como seleccionar el N óptimo en N-Gramas, seleccionar los N-Gramas más significativos estadísticamente y producir vectores de características para las muestras a partir de los recuentos de estos «mejores» N-Gramas seleccionados. Para nuestra discusión, el problema más importante es contar los N-Gramas en todos los archivos. Este problema es un Everest computacional.

Hagamos las cuentas a un nivel alto. Queremos un diccionario de cuentas para cada N-Gram sobre todos los archivos. Una empresa de ciberseguridad tendrá literalmente millones de muestras en su conjunto de datos. Cada muestra es típicamente varios millones de bytes. Esto significa que tendrá varios millones de N-Grams. Dado que hay 256 bytes, hay 256^N tipos de N-Grams. Esto significa que el diccionario tendrá hasta 256^N claves. Para tener una idea de la magnitud, note que

– Para N=2: 256^N = 65.536,

– Para N=3: 256^N = ~16,7 millones,

– Para N=4: 256^N = ~4 mil millones

Los requisitos de tiempo y espacio son gigantescos. Afortunadamente, es posible (y necesario) distribuir la tarea, que es donde el Hadoop y Spark entran en juego.

Tómese un momento para pensar en este problema en términos de Map-Reduce. Cuando esté listo, siga leyendo.

Solución de reducción de mapas

En un paradigma de Mapa-Reducción, nuestros mapeadores tomarán grupos de archivos, y para cada archivo, producirán un diccionario de recuentos de N-Gram. Nuestros reductores añadirán estos diccionarios. Nuestro resultado final será la suma de todos estos diccionarios, es decir, todos los recuentos de N-Gram. Así que ahora veamos cómo codificar realmente este problema en PySpark.

Implementación de PySpark

Para el resto, el código y el conjunto de datos están disponibles en https://github.com/hadoopinrealworld/how-to-catch-malware-using-spark. Tenga en cuenta que el conjunto de datos contiene muestras vivas, por lo que sólo debe ejecutarse en un entorno seguro, como una máquina virtual (VM).

  1. Empieza por clonar los datos:

  1. Descomprimir y crear directorios para los datos. La contraseña es «infectada». De nuevo, sólo hazlo en un entorno seguro o salta las muestras maliciosas.

  1. Instala PySpark si no lo tienes ya.
Recomendado:  ¿Cómo funciona el Shuffle Hash Join en Spark? - Hadoop en el mundo real

  1. Inicie su sesión de Spark

  1. Vamos a crear una tubería para contar los N-Grams y luego los caracterizaremos.

Terminaremos con los más frecuentes NUM_NGRAMS=100 N-grams, que también son generalmente los más significativos estadísticamente. A continuación, entrenaremos un clasificador utilizando estos como características.

 

  1. Leído en los archivos binarios en RDDs:

Echemos un vistazo a lo que tenemos hasta ahora:

Recomendado:  Rakuten se libera de la inversión en Hadoop en dos años

Está viendo el nombre de la muestra y su secuencia de bytes.

  1. Convertiremos estos RDD en marcos de datos para facilitar su uso. También limitaremos el número de bytes que tomamos de cada muestra a BYTES_UPPER_LIMIT = 5000 para hacer el cálculo más fácil para este tutorial.

  1. Etiquetar las muestras benignas con 0 y las malignas con 1

Los marcos de datos ahora se ven así:

  1. Combine los marcos de datos en uno solo, ya que vamos a ejecutar la tubería en todos los archivos a la vez.

  1. Crear una división de pruebas de entrenamiento

  1. Encajar la tubería en los datos.

Nótese que en el paso 5, hemos especificado en nuestro CountVectorizer que construyamos un vocabulario que sólo considere los NUM_NGRAMS superiores = 100 N-Gramos ordenados por frecuencia de término a través del corpus. Se pueden utilizar implementaciones más avanzadas, como la extracción de características basadas en información mutua o la selección de características de Bosque al azar. Sin embargo, a pesar de la aparente simplicidad del enfoque de la frecuencia, se ha demostrado que es el método más exitoso para seleccionar N-Gramas, tanto en la literatura (ver, por ejemplo «Una investigación de las características del Byte N-Gram para el malware Clasificación»(Raff et al.) y en la industria.

  1. Caracterizar y clasificar el conjunto de datos de las pruebas.

Vean que hemos logrado que nuestras muestras

  1. Por último, podemos calcular la precisión de nuestro clasificador en los datos de las pruebas

Nuestra precisión es

que es espectacular para un conjunto de datos de este tamaño!

Hemos logrado perfeccionar nuestras muestras y entrenar un prototipo de clasificador que podrá decirnos cuándo un nuevo archivo es un malware, protegiéndonos a nosotros y a nuestros datos de cualquier daño.