Es cierto que a nivel de JavaScript, los navegadores están diseñados para proteger el código en ejecución (principalmente al no exponer ninguna API peligrosa), pero JavaScript es un lenguaje muy complejo para analizar y ejecutar .
ECMAScript es el estándar detrás de JavaScript, debido a la gran inflación de marketing en torno a los lenguajes de programación amigables para principiantes que estamos experimentando en la actualidad, el ECMAScript se está actualizando rápidamente e introduce funcionalidades cada vez más complejas para implementar en tiempo de ejecución.
Esto, a su vez, amplía la superficie de ataque y permite que los errores se introduzcan .
Un ejemplo de
maravilloso es el trabajo reciente de Patrick Biernat , Markus Gaasedelen , Amy Burnett para el pwn2own 2018.
enlace
El blog describe el descubrimiento de un 0day que permite ejecución de código arbitrario en WebKit y cómo se usa para explotar otro 0day en el administrador de ventanas de macOS para escapar del sanbox en el que Safari se está ejecutando (eso es un macOS Sandbox, no uno de Safari) para escalar a "root" y ser dueño del sistema.
En pocas palabras, simplemente visitando un enlace mientras se habilita JavaScript, un sistema macOS se puede comprometer totalmente sin un solo fallo visible para el usuario.
Así de seguro puede ser JavaScript: tan seguro como una pieza compleja de software como puede ser el JSCore de WebKit.
Es por eso que a los usuarios que requieren alta seguridad se les recomienda desactivar JavaScript (ese es un requisito bastante común en DarkWeb, por ejemplo).
La vulnerabilidad en WebKit descubierta por los autores arriba es una condición de carrera entre el recolector de basura recién introducido y la función array.reverse
: si el GC comienza a marcar una matriz mientras se está invirtiendo, podría llevar a un UAF (Usar después Libre) explotar.
La marca se realiza secuencialmente en la matriz, supongamos que el GC está justo en el centro de la matriz cuando se invierte, la segunda mitad nunca se marca y, por lo tanto, se elige para la recopilación, lo que resulta en una UAF (el objeto de la matriz en sí no se recopila, solo su elemento).
La forma en que se usa una UAF para hacer primitivas de explotación más potentes que pueden conducir a la ejecución de código arbitrario es más o menos una variación de las mismas técnicas: primero se asigna un objeto interesante en el espacio recién liberado (por ejemplo, una matriz) y luego Se crea la primitiva RW (por ejemplo, modificando el límite de la matriz) y, finalmente, los códigos de operación arbitrarios se escriben en la memoria (por ejemplo, en una página JIT).
Los detalles para este día en particular están en el blog vinculado.
La parte interesante es la forma en que se encontró este día: ya que WebKit es tan grande, es imposible realizar una revisión exhaustiva del código sin una gran cantidad de esfuerzo, por lo que se creó una fluctuación de fase automática.
Esto debe hacernos reflexionar sobre el hecho de que cuando tenemos cientos de miles o millones de líneas de código, es muy difícil hacer que cada una se comporte bien con respecto a las demás.