
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).