
Análisis técnico de CVE-2017-0037, una vulnerabilidad de corrupción de memoria en el navegador de Microsoft que permite la ejecución remota de código mediante confusión de tipos en el manejo de CSS/JS, con detalles del exploit PoC y estrategias de mitigación.
CVE-2017-0037 (Vulnerabilidad de Corrupción de Memoria del Navegador Microsoft)
Este documento trata sobre CVE-2017-0037 - Vulnerabilidad de Corrupción de Memoria del Navegador Microsoft. Primero presentará qué es una Ejecución Remota de Código (RCE) y luego repasará algunos detalles técnicos.
¿Qué es la Ejecución Remota de Código?
Un ciberataque en el que un atacante puede ejecutar comandos de forma remota en otra computadora se conoce como ejecución remota de código. Las ejecuciones remotas de código (RCE) son causadas más comúnmente por software dañino descargado por el anfitrión y pueden ocurrir independientemente de la ubicación del sistema.
Para lograr RCE, se pueden utilizar las siguientes formas:
Ataques de Inyección: Aquí, el atacante proporciona entrada errónea con la intención de que una parte de ella sea procesada como parte del comando.
Ataques de Deserialización: El programa de deserialización puede leer entrada de usuario cuidadosamente formulada dentro de los datos serializados como código ejecutable.
Escritura Fuera de Límites: Un atacante puede construir una entrada que exceda el búfer asignado si la asignación de memoria se realiza de manera deficiente. Debido a que el código ejecutable también se almacena en la memoria, el programa podría ejecutar datos proporcionados por el usuario si se escriben en la ubicación correcta.
Ataque de Confusión de Tipo: Existe una amenaza de confusión de tipo cuando un código fuente no toma ninguna medida para verificar la autenticidad de una entidad que se le proporciona. Debido a que la confusión de tipo permite a un hacker introducir código que puede ejecutar instrucciones aleatorias simplemente causando una discrepancia en los tipos de objetos, es arriesgado.
Ejecución de un Ataque RCE
Una secuencia de asalto RCE es simple de llevar a cabo. Primero, el actor de amenazas busca en internet vulnerabilidades comunes que puedan ser explotadas en un asalto efectivo. Después de identificar una vulnerabilidad particular, el hacker usa el exploit para obtener acceso. Una vez que han obtenido acceso, pueden usar el script malicioso para lograr sus objetivos, que incluyen exfiltración de datos, lavado de dinero, vigilancia exhaustiva e interrupción del servicio.
El lenguaje de la aplicación objetivo se usa frecuentemente para inyectar código. Luego, el procesador del lado del servidor ejecuta el lenguaje. Python, Java, Perl, Ruby y PHP son lenguajes de programación comunes. La inyección de código es común en plataformas que analizan inmediatamente la entrada no verificada. Las aplicaciones públicas en línea son, de hecho, un gran foco para los hackers.
El script malicioso normalmente se ejecuta mediante scripts bash. Un script bash es un documento de texto que incluye comandos que normalmente se escribirían en el símbolo del sistema. Los scripts bash permiten que los comandos incluidos funcionen correctamente. Es costumbre agregar un ".sh" a ellos, aunque no es necesario. Después del empaquetado, el hacker coloca el código en una aplicación susceptible, que luego lo ejecuta. La aplicación también podría dar una decisión al kernel para que lo ejecute.
Métricas del Ataque
La siguiente imagen se centra en las métricas de puntuación base de CVE-2017-0037 .

La puntuación de calificación CVSS aquí es 8.1 (alta).
Vector de Ataque- El componente vulnerable aquí está vinculado a la pila de red, y el rango de posibles atacantes incluye cualquier cosa desde las otras alternativas mencionadas hasta todo Internet.
La Complejidad del Ataque de esta vulnerabilidad es alta, es decir, el éxito de un asalto depende de circunstancias fuera del control del atacante. Por lo tanto, un ataque no puede completarse a voluntad, sino que requiere que el atacante invierta un nivel significativo de trabajo en la planificación o implementación contra el elemento susceptible antes de que se pueda anticipar que sea efectivo.
El valor de Confidencialidad aquí es alto, lo que significa una pérdida completa de confidencialidad, resultando en que el atacante tenga acceso a todos los recursos dentro del componente dañado.
Integridad es alta, lo que significa una pérdida severa de integridad y protección.
Disponibilidad es alta, lo que significa una pérdida completa de disponibilidad, permitiendo al atacante prohibir completamente el acceso a los recursos del componente afectado.
Detalles del Ataque
La vulnerabilidad CVE-2017-0037 era una falla de confusión de tipo que residía en Microsoft Edge e Internet Explorer 10 y 11. Permitía a los atacantes ejecutar código remotamente en la máquina objetivo cuando el usuario visitaba un sitio web malicioso.
La falla fue señalada por el investigador de Google Ivan Frantic y los detalles de la vulnerabilidad fueron publicados por Google ya que Microsoft no pudo corregirla dentro de su período de divulgación de 90 días.

El exploit de prueba de concepto (PoC) publicado por el investigador revela que puede bloquear Edge e IE, permitiendo a un atacante ejecutar código remotamente y obtener privilegios de administrador del sistema comprometido. También confirmó que el ataque funcionaba en la versión de 64 bits de Internet Explorer en Windows Server 2012 R2 y afectaba a IE 11 de 32 bits así como a Microsoft Edge.
La confusión de tipo está en la función Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElemnt en mshtml.dll. Al ejecutar código arbitrario remotamente, a través de vectores que involucran una secuencia de tokens de Hojas de Estilo en Cascada (CSS) y código JavaScript manipulado que opera sobre un elemento TH, puede ocurrir el ataque.
El PoC de Ivan Fratric de Google Project Zero

Como indicó el investigador Ivan Frantic, el PoC falla en MSHTML!Layout::MultiColumnBoxBuilder::HandleColumnBreakOnColumnSpanningElement al leer desde la dirección 0000007800000070.


Al analizar el código alrededor del punto del fallo, se puede observar que en la dirección de memoria 00007ffe`8f330a51, el contenido del registro rbp se lee en el registro rcx. Luego, la llamada a MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable asigna un valor a rax (es un registro designado para almacenar valores de retorno de funciones).
Aunque se supone que rcx apunta a otro tipo de objeto, en el PoC como se muestra arriba, apunta a un array de enteros de 32 bits asignado en Array<Math::SLayoutMeasure>::Create. Los desplazamientos de las columnas de la tabla se almacenan en ese array y un atacante puede tomar el control sobre él. El fallo ocurre en 00007ffe`8f330a59 ya que rax apunta a memoria no inicializada. rax almacena el valor de retorno de la función MSHTML!Layout::Patchable<Layout::PatchableArrayData<Layout::MultiColumnBox::SMultiColumnBoxItem> >::Readable que no es una dirección de memoria inicializada. El atacante puede hacer que rax apunte a alguna ubicación de memoria que pueda controlar. El atacante puede modificar propiedades de la tabla como el espacio entre bordes y el ancho del primer elemento TH para obtener control sobre rax.

Si el atacante puede obtener control sobre rax en la línea 00007ffe8f330a59**, la función **MSHTML!Layout::Patchable\<Layout::PatchableArrayData\<Layout::MultiColumnBox::SMultiColumnBoxItem\> \>::Readable** se llama de nuevo en la línea **00007ffe8f330a5d 743d con los mismos argumentos y un salto a una dirección más alta. Después, a través de una serie de diferencias que comienzan desde rax, se podría obtener un puntero a función y almacenarlo en rdi. Si el atacante pudiera pasar una verificación CFG en ese puntero a función, el puntero a función controlado por el atacante se llamaría en la línea 00007ffe`8f330a80.
Posible Parche del Error
Como sugirió Ivan Fratric, primero se debe detectar la razón detrás de la ocurrencia de la confusión de tipo. Según su hipótesis, existen dos tipos de columnas en el DOM: columnas de tabla HTML y columnas CSS, IE/Edge se confundía entre ambas. Entonces, si se agregara una verificación de tipo en algún lugar de la función vulnerable, podría haberlo solucionado.
Enlaces Útiles
Impactos de un Ataque RCE
Acceso Inicial: Los atacantes pueden utilizar esto para afianzarse en un dispositivo e instalar malware o lograr otros objetivos.
Divulgación de Información: Los ataques RCE ayudan a instalar malware que roba información o a ejecutar comandos que recopilan y roban datos del dispositivo afectado.
Denegación de Servicio: Una falla RCE permite a los hackers ejecutar código en la máquina que aloja la aplicación afectada y, por lo tanto, interrumpir su funcionamiento y el de otros programas en el sistema.
Criptominería: El malware de criptominería se despliega y ejecuta frecuentemente en dispositivos susceptibles.
Ransomware: El ransomware es un tipo de software que impide que un usuario acceda a sus archivos a menos que pague dinero.
Formas de Mitigar Ataques RCE
El control de desbordamiento de búfer se puede utilizar para mitigar ataques RCE.
Las listas de control de acceso son útiles para limitar los privilegios de los usuarios y, por lo tanto, limitar las capacidades de un atacante si obtienen control de la cuenta de un usuario.
El tráfico de red debe ser monitoreado en busca de contenido potencialmente malicioso, además de monitorear los puntos finales.
Usar la desinfección de entrada, que es el proceso de limpiar y depurar la entrada del usuario para protegerla de ser utilizada para explotar fallos de seguridad.
Referencias