jueves, abril 12, 2018

Machine Learning vs Machine Learning: Aprendiendo a engañar antivirus con Inteligencia Artificial

Hoy día no cabe duda de la necesidad de utilizar técnicas de Machine Learning o Aprendizaje Automático para poder proteger todo tipo sistemas. Prácticamente todos los nuevos antivirus y motores de detección de malware se están adaptando poco a poco a técnicas de Inteligencia Artificial de cara a su automatización. Con la aplicación de estos algoritmos, la efectividad en la detección, así como la predicción mejoran notablemente.

Figura 1: Machine Learning vs Machine Learning.
Aprendiendo a engañar antivirus con Inteligencia Artificial

Pero, por otro lado, estas mismas técnicas y algoritmos se aplican a su vez desde el lado opuesto, es decir, para crear malware capaz de aprender y hacer creer a un antivirus que realmente su código es benigno. El año pasado en las conferencias BlackHat y DEFCON, Hyrum Anderson explicó en su charla una forma de poner en práctica este escenario.

Figura 2: Evading Machine Learning Malware Detection

Lo hizo utilizando OpenAI y en concreto un módulo llamado Gym, herramienta creada inicialmente para entrenar un agente de IA para que aprenda a jugar videojuegos clásicos (sobre todo de Atari) utilizando la técnica de Aprendizaje Reforzado (Reinforcement Learning o RL). Nosotros ya hemos trabajado (y lo seguimos haciendo) con OpenAI y Gym.

Figura 3: Ejemplo de ejecución del entorno para el juego Taxi en OpenAI/Gym

En nuestro blog de LUCA hemos publicado varios artículos donde explicamos desde cómo configurar el entorno hasta algunas pruebas básicas realizadas con juegos sencillos. Esta es la serie que tenemos publicada hasta ahora:
Parte 1. Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos, preparando la “rejilla de juegos” 
● Parte 2. Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos, observando el entorno. 
● Parte 3. Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos, resolviendo CartPole con Random Search. 
● Parte 4. Cómo entrenar a tu Inteligencia Artificial jugando a videojuegos. Aprende Q-Learning con el juego “Taxi”, parte 1 de 2. 
● Parte 5. Cómo entrenar a tu Inteligencia Artificial jugando videojuegos. Aprende Q-Learning con el juego “Taxi”, parte 2 de 2.
El Aprendizaje Reforzado es una disciplina de Machine Learning la cual se fundamenta en dos elementos principalmente: el entorno (environment) y el agente (agent), que es quien toma la decisión de aplicar una determinada acción que conducirá a un nuevo estado en el entorno. En este caso de análisis de malware, el entorno esta vez sustituye a los videojuegos por una muestra de código malicioso, siendo el agente el encargado de modificar dicho entorno para obtener nuevos resultados en cada iteración.

Esta modificación se realiza tomando determinadas acciones, de las cuales se obtienen como resultado unos valores llamados recompensas (rewards) que definen el grado de optimización de la acción realizada. Inicialmente en OpenAI y Gym esta recompensa suele ser la puntuación obtenida en el videojuego.


Figura 4: Evading Modern AV with AI

A lo largo del entrenamiento, el agente aprende qué operaciones y en qué secuencia deben aplicarse sobre muestras de malware para evitar que puedan ser detectados por un determinado motor anti-malware. Como resultado final del aprendizaje, se consiguen muestras de virus que no pueden ser reconocidas por un detector, permitiendo ataques tipo black-box contra motores de detección de malware (en este caso, para ficheros PE Windows, Portable Executable). Para comprender mejor el funcionamiento de este interesante escenario, vamos a analizarlo un poco más profundidad.

El primer paso será realizar la instalación del entorno OpenAI y todas las herramientas necesarias. Posteriormente, procederemos a instalar el entorno de malware sobre el que entrenaremos al agente. Las instrucciones para realizar la instalación de todos los componentes están incluidas en este enlace de Github.

Figura 5: Malware Env for OpenAI Gym

El siguiente paso consistirá en instalar un entorno para la manipulación de ficheros PE con la intención de obtener recompensas si se consigue realizar un bypass a un motor anti-malware, el cual se puede encontrar en el mismo repositorio de GitHub.

A continuación, instalaremos una serie de componentes y librerías imprescindibles para el correcto funcionamiento del entorno. Estos componentes necesarios se encuentran indicados en el fichero requirements.txt. Durante el proceso de instalación pudimos comprobar que la versión recomendada de pylief-0.7.0 daba problemas a la hora de ejecutar las principales rutinas de entrenamiento y testeo. Esto se resolvió siguiendo las instrucciones de instalación de LIEF Quarkslab, migrando la librería pylief a la versión 0.8.3. Recomendamos, por lo tanto, sustituir en el fichero requirements.txt la sexta línea por: https://github.com/lief-project/packages/raw/lief-master-latest/pylief-0.8.3.dev.zip

Figura 6: Pasos para la instalación de gym-malware

Por otro lado, necesitamos obtener muestras de malware de cara al entrenamiento y prueba de los modelos de Deep Learning destinados a enseñar y testear al agente. Para ello nos tendremos que crear una cuenta en VirusTotal, para poder obtener una VirusTotal API key de la que deberemos hacer uso al ejecutar la rutina download_samples.py.

Como podemos observar, la estructura del repositorio es sencilla. En él están incluidos todos aquellos scripts necesarios para entrenar y probar el agente haciendo uso bien de las librerías chainer o keras-rl. En la carpeta gym_malware/ podemos encontrar tanto los scripts que definen el entorno como aquellos que permiten procesar y aplicar las modificaciones a las muestras de malware descargadas.

De todos estos componentes utilizados tenemos que destacar LIEF (Library to Instrument Executable Formats). Esta librería básicamente nos permite realizar la parte de la modificación de la muestra del malware, es decir, realizar cambios en parte de su código fuente. La PoC se ha realizado para ficheros tipo PE de Windows, aunque LIEF es multiplataforma y también permite modificar ficheros tipo ELF (Linux) y Mach-0 (macOS). En este enlace puedes encontrar toda la documentación completa referente a LIEF.

Figura 7: Esquema de funcionamiento de LIEF

En el entorno final que se ha definido, el espacio de acciones que el agente puede realizar consiste principalmente en una serie de modificaciones aplicadas los ficheros PE que (a) eviten alguna corrupción del formato PE y (b) no alteren el funcionamiento original del malware.

El proceso de entrenamiento comienza con una muestra inicial del programa malicioso (malware sample) y un motor anti-malware el cual será el objetivo del ataque. La recompensa es calculada por el analizador anti-malware (una especie de antivirus desarrollado en base a scikit-learn), el cual devolverá como recompensa un 0 en el caso que la muestra modificada se clasifique como maliciosa o diferente de 0 en el caso de que consiga evadir el anti-malware y sea clasificada como no maliciosa.

Figura 8: Ciclo de ejecución del entorno RL para el análisis de malware.

El segundo feedback que recibe el agente, además de la recompensa obtenida en la anterior iteración, es un vector que se ha generado analizando las características del fichero PE partiendo de su formato raw. Dicho vector contendrá información relativa al fichero PE, como por ejemplo los metadatos de la cabecera, el número de caracteres interpretables (identificables por el ser humano como por ejemplo rutas de ficheros) o claves del Registro de Windows entre otros.

Las acciones que se aplicarán sobre el fichero PE, partiendo de la información obtenida por el vector, tienen como objetivo alterar o mutar el contenido del mismo haciendo uso de la librería LIEF que hemos comentado anteriormente. Estas modificaciones deben ser lo suficientemente sutiles como para no modificar el formato original del fichero ni su ejecución y de esa forma evitar dañarlo o alterarlo demasiado.

Algunas de las acciones a realizar por el agente pueden ser las funciones de packing y unpacking del fichero (UPX), la creación secciones nuevas dentro del programa, la adición de bytes en los espacios extra o al final de las secciones del código o la inclusión de basura al final del fichero.

Figura 9: Representación detallada del entorno y el análisis utilizando RL

El ciclo completo (tanto el análisis como el proceso de mutación del código) consta de varias rondas, las cuales comienzan con una muestra original de un malware conocido (obtenido principalmente desde VirusTotal) que es modificado para su posterior análisis por el motor anti-malware. Este ciclo se va repitiendo con cada muestra hasta llegar a 10 mutaciones. Si se llega a este número el ciclo termina pasando a otra muestra y dando como no satisfactorio el intento de bypass del motor anti-malware. El análisis realizado es de tipo estático, es decir, en ningún momento se ejecuta el fichero, simplemente se analiza su código fuente.

Figura 10: Evasión automática de malware usando Machine Learning

El entorno de pruebas que nos ofrece esa PoC es realmente interesante ya que supone un nuevo punto de vista, esta vez orientado a la seguridad, de la conocida herramienta Gym de OpenAI. Aunque los resultados obtenidos son todavía modestos en comparación con los ataques white-box y gradient-based, es indudable que esta aproximación abre una nueva línea de investigación en la evasión automática de malware haciendo uso de técnicas de Aprendizaje Reforzado. Seguiremos jugando con OpenAI y el análisis del malware, os mantendremos informados.

Autores: Fran Ramírez (@cyberhadesblog) es Investigador de Seguridad Informática en el departamento de Ideas Locas CDO de Telefónica y co-fundador del blog www.cyberhades.com  y Enrique Blanco (@eblanco_h) es Investigador en el departamento de Ideas Locas CDO de Telefónica

No hay comentarios:

Entrada destacada

Docker: SecDevOps. El nuevo libro de @0xWord

Hoy sábado tenemos una nueva sorpresa en la colección de libros de 0xWord , en este caso un libro de Fran Ramírez , Rafael Troncoso y Elia...

Entradas populares