La vulnerabilidad permite al malware escapar de la máquina virtual al equipo anfitrión.
El descubridor del fallo es el investigador de seguridad Sergey Zelenyuk, el cual, al estar en desacuerdo con la situación actual del mercado de Bug Bounty, decidió publicar el fallo.
Información referente al 0-day:
- Software vulnerable: Todas las versiones de VirtualBox hasta la actualidad (5.2.20)
- Sistema operativo anfitrión: Cualquiera.
- Sistema operativo invitado: Cualquiera.
- Configuración de red: Intel PRO / 1000 MT Desktop (82540EM) en modo NAT. Destacar que esta es la configuración que trae por defecto VirtualBox.
Introducción:
Antes de comenzar con la explicación de la vulnerabilidad, creo que hay que aclarar varios conceptos relacionados con el software vulnerado necesarios para el entendimiento total del fallo.
- E1000: Hace referencia al dispositivo de red virtual Intel PRO / MT Desktop (82540EM).
- LKM: Módulo del kernel de Linux.
- Descriptores Tx: Los descriptores Tx o de transmisión se encargan de almacenar metainformación de los paquetes enviados a través del adaptador. Esta metainformación puede ser: el tamaño del paquete, la etiqueta VLAN, los indicadores habilitados para la segmentación TCP/IP, etc.La configuración de red utilizada en la vulnerabilidad proporciona tres tipos de descriptores Tx:
- Legacy: Ya no se utiliza.
- Contexto: Se encargan de establecer el tamaño máximo de paquete y la segmentación TCP/IP.
- Datos: Contienen direcciones físicas de paquetes de red y sus tamaños.
Un punto a destacar es que, normalmente, los descriptores de contexto se suministran a la tarjeta de red antes que los descriptores de datos, y en estos se debe especificar un tamaño máximo de paquete mayor que el tamaño del descriptor de datos.
Resumen de la vulnerabilidad:
Debido a la configuración de E1000 es posible, mediante el envío de una cadena de descriptores Tx específicos, conseguir un desbordamiento de búfer (comúnmente conocido como buffer overflow), el cual concluye en dos posibilidades (ambas usadas en la explotación):
- Lectura de datos desde el invitado en un búfer de almacenamiento dinámico.
- Copia de datos de una longitud específica al búfer sin ninguna verificación.
Además, el exploit utilizado por Zelenyuk hace uso del LKM para cargar un sistema operativo invitado. Como se requiere escalada de privilegios para conseguir cargar el controlador en ambos sistemas, se usan de cadenas de explotación publicadas en el concurso Pwn2Own.
Estas cadenas explotan un navegador que abre un sitio web malicioso en el sistema operativo invitado, el cual consigue escapar de la sandbox para obtener acceso total al anillo 3 (nivel de aplicación).
Finalmente, y gracias a vulnerabilidades conocidas, consigue la escalada de privilegios para acceder al anillo 0 (nivel de kernel) donde está todo lo necesario para atacar a un hipervisor desde el sistema operativo invitado.
Vídeo de la prueba de concepto:
Recomendaciones:
En primer lugar, estar muy atentos a la espera de una nueva actualización por parte del equipo de VirtualBox que arregle este fallo.
En segundo lugar, se recomienda no utilizar la configuración de red especificada al comienzo del artículo para asegurar la seguridad del equipo anfitrión.
Más información:
Explicación del 0-day por parte de Sergey Zelenyuk:
https://github.com/MorteNoir1/virtualbox_e1000_0day/blob/master/README.md