xlera8

Chrome día cero: "Este exploit está en la naturaleza", así que verifique su versión ahora

Ya salió la última actualización de Chrome de Google, y esta vez la empresa no se ha cortado las palabras sobre uno de los dos parches de seguridad que incluye:

Google es consciente de que un exploit para CVE-2023-3079 existe en la naturaleza.

No hay verborrea de dos grados de separación, como hemos visto a menudo en Google antes, para decir que la empresa "está al tanto de los informes" de un exploit.

Esta vez, es "somos conscientes de todo por nosotros mismos", lo que se traduce aún más sin rodeos en "sabemos que los delincuentes están abusando de esto mientras hablamos", dado que el informe de error provino directamente del propio Grupo de Investigación de Amenazas de Google.

Como de costumbre, esto implica que Google estaba investigando un ataque activo (ya sea contra Google mismo o contra alguna organización externa, no lo sabemos) en el que Chrome había sido atacado por un agujero de seguridad previamente desconocido.

El error se describe simplemente como: Escriba Confusión en V8. (Es comprensible que Google no diga más que eso en esta etapa).

Como hemos explicado antes, un confusión de tipo El error ocurre cuando proporciona a un programa una porción de datos que se supone que debe analizar, validar, procesar y actuar de una manera...

…pero luego logra engañar al programa para que interprete los datos de una manera diferente, no autorizada, no validada y potencialmente peligrosa.

Explicación de los peligros de la confusión de tipos

Imagina que estás escribiendo un programa en C. (No importa si conoces C o no, puedes seguirlo de todos modos).

En C, normalmente se declaran las variables individualmente, por lo que no solo se reserva memoria donde se pueden almacenar, sino que también se indica al programa cómo se supone que se deben usar esas variables.

Por ejemplo:

 long long int JulianDayNumber; carácter firmado* CustomerName;

La primera declaración de variable reserva 64 bits para almacenar un valor entero simple y antiguo que representa el número del día astronómico. (En caso de que se lo pregunte, esta tarde es JDN 23157: los días julianos comienzan al mediodía, no a la medianoche, porque los astrónomos suelen trabajar de noche, siendo la medianoche la mitad de su jornada laboral).

El segundo reserva 64 bits para almacenar una dirección de memoria donde se puede encontrar la cadena de texto del nombre de un cliente.

Como puede imaginar, es mejor que no mezcle estos dos valores, porque un número que tiene sentido y es seguro para usar como un número de día, como 23157, casi con certeza no sería seguro para usar como una dirección de memoria.

Como puede ver en este volcado de memoria de un programa de Windows en ejecución, la dirección de memoria más baja asignada para su uso comienza en 0x00370000, que es 3,604,480 en decimal, mucho más grande que cualquier número de día sensato.

Las direcciones de memoria reales utilizadas por Windows varían aleatoriamente con el tiempo, para que el diseño de su memoria sea más difícil de adivinar para los delincuentes, por lo que si ejecutara el mismo programa, obtendría valores, pero de todos modos serían similares:

Y (aunque está fuera de la parte inferior de la imagen de arriba) las direcciones de memoria de la sección de datos de usuario en tiempo de ejecución cuando este programa se ejecutó desde 0x01130000 a 0x01134FFF, que representa el improbable intervalo de fechas del 22 de julio de 44631 al 16 de agosto de 44687.

De hecho, si intenta mezclar esas dos variables, el compilador debería intentar advertirle, por ejemplo, así:

 JulianDayNumber = CustomerName; CustomerName = JulianDayNumber; advertencia: la asignación hace que el puntero sea un número entero sin conversión advertencia: la asignación hace que el puntero sea un número entero sin conversión

Ahora, si alguna vez ha programado en C, sabrá que, por conveniencia, puede declarar variables con múltiples interpretaciones diferentes usando el union palabra clave, como esta:

 union { long long int JulianDayNumer; carácter firmado* CustomerName; } datos;

Ahora puede hacer referencia exactamente a la misma variable en la memoria de dos maneras diferentes.

Si tú escribes data.JulianDayNumber, interpreta mágicamente los datos almacenados como un número entero, pero escribiendo data.CustomerName le dice al compilador que está haciendo referencia a una dirección de memoria, aunque esté accediendo a los mismos datos almacenados.

Lo que está haciendo, más o menos, es admitir al compilador que a veces tratará los datos que tiene como una fecha y otras veces como una dirección de memoria, y que estás asumiendo la responsabilidad de recordar qué interpretación se aplica en qué momento en el código.

Puede decidir tener una segunda variable, conocida como tag (típicamente un número entero) para ir junto con su union para realizar un seguimiento del tipo de datos con los que está trabajando en este momento, por ejemplo:

 estructura { int etiqueta; union { long long int JulianDayNumer; carácter firmado* CustomerName; } datos; } valor;

Usted puede decidir que cuando value.tag se establece a 0, los datos aún no están inicializados para su uso, 1 significa que está almacenando una fecha, 2 significa que es una dirección de memoria, y cualquier otra cosa denota un error.

Bueno, será mejor que no dejes que nadie más se meta con eso. value.tag configuración, o su programa podría terminar comportándose mal dramáticamente.

Un ejemplo más preocupante podría ser algo como esto:

 estructura { int etiqueta; // 1 = hash, 2 = unión de punteros de función { hash de caracteres sin firmar [16]; // almacenar una estructura hash aleatoria { void* openfunc; // o dos void* closefunc cuidadosamente validados; // punteros de código para ejecutar más tarde } validar; } } valor;

Ahora, estamos sobrecargando el mismo bloque de memoria, por lo que a veces podemos usarlo para almacenar un hash de 16 bytes y, a veces, para almacenar dos punteros de 8 bytes a funciones que nuestro programa llamará más adelante.

Claramente, cuando value.tag == 1, estaríamos encantados de dejar que nuestro software almacene cualquier cadena de 16 bytes en la memoria asignada para la unión, porque los hashes son pseudoaleatorios, por lo que cualquier colección de bytes es igualmente probable.

Pero cuando value.tag == 2, nuestro código tendría que ser extremadamente cuidadoso para no permitir que el usuario proporcione direcciones de funciones desconocidas, no validadas y no confiables para ejecutarlas más tarde.

Ahora imagine que podría enviar un valor a este código mientras la etiqueta estaba configurada en 1, por lo que no se verificó ni validó...

…pero más tarde, justo antes de que el programa usara el valor almacenado, pudo engañar al código para que cambiara la etiqueta a 2.

El código entonces aceptaría sus direcciones de función no validadas como "seguras conocidas y ya verificadas" (aunque no lo fueran), y enviaría con confianza la ejecución del programa a una ubicación no autorizada en la memoria que usted había elegido furtivamente de antemano.

Y eso es lo que sucede en un error de confusión de tipos, aunque usando un ejemplo artificial y simplificado,

La memoria que sería segura de consumir si se manejara de una manera se entrega maliciosamente al programa para que la procese de una manera alternativa e insegura.

¿Qué hacer?

Asegúrate de tener la última versión de Chrome o Chromium.

quieres cromo 114.0.5735.106 o posterior en Mac y Linux, y 114.0.5735.110 o posterior en Windows.

Microsoft Edge, que se basa en Chromium, también se ve afectado por este error.

Microsoft tiene hasta ahora [2023-06-06T16:25:00Z] observado que

Microsoft es consciente de los exploits recientes que existen en la naturaleza. Estamos trabajando activamente para lanzar un parche de seguridad.

Edge se encuentra actualmente en la versión 114.0.1823.37, por lo que cualquier cosa numerada más tarde que eso debe incluir los parches CVE-2023-3079 de Microsoft.

Para verificar su versión y forzar una actualización si hay una que aún no ha recibido:

  • Google Chrome. Menú de tres puntos (⋮) > Ayuda > Acerca de cromo.
  • Microsoft Edge. Configuraciones y más (…) > Ayuda y comentarios > Acerca de Microsoft Edge.

De nada.


Habla con nosotros!

¡Hola! ¿Le puedo ayudar en algo?