Revelando cómo el Valor Centinela elude el mecanismo de protección de seguridad de Chrome v8
El valor centinela es un valor especial en algoritmos, que generalmente se utiliza como condición de terminación en algoritmos de bucle o recursivos. En el código fuente de Chrome existen múltiples valores centinela. Investigaciones anteriores han demostrado que la filtración del objeto TheHole puede permitir la ejecución de código arbitrario dentro de la sandbox. El equipo de Google posteriormente corrigió estas dos vulnerabilidades.
Sin embargo, además del objeto TheHole, hay otros objetos nativos en V8 que no deberían filtrarse a JS. Este artículo discutirá el objeto Uninitialized Oddball, que actualmente todavía se puede utilizar en la última versión de V8, y Google aún no lo ha corregido.
Cabe destacar que este método tiene cierta universalidad:
El problema 1216437 menciona primero la filtración de internal uninitialized oddball.
El poc del Issue1314616 también filtró directamente UninitializedOddball.
El Issue1352549 detalla el método de uso.
Estos casos indican que es necesario revisar el software que podría verse afectado. Actualmente, algunas aplicaciones aún no han corregido la vulnerabilidad.
Valor centinela en V8
En el archivo v8/src/roots/roots.h se enumeran la mayoría de los objetos nativos de v8, que están dispuestos de manera adyacente en la memoria. Una vez que estos objetos se filtran a Javascript, puede ser posible ejecutar cualquier código dentro de la sandbox.
Podemos filtrar Uninitialized Oddball en JavaScript modificando la función nativa de v8. En concreto, se puede modificar el desplazamiento relativo al isolate en la función %TheHole() para que devuelva Uninitialized Oddball.
para (let i = 0; i < 100000; i++) {
read(obj, 0);
}
%OptimizeFunctionOnNextCall(leer);
const value = read(obj, 0x12345);
En la prueba de v8-11.0.0, cuando %TheHole() devuelve UninitializedOddball, aún se puede lograr una lectura relativamente arbitraria.
El código de ensamblaje del función read optimizada muestra que se revisó la propiedad prop del objeto, pero no se verificó el valor de obj.prop que es key, lo que llevó a calcular el desplazamiento directamente según la semántica de JavaScript, causando confusión de tipos que permite lecturas arbitrarias.
La sugerencia de solución es agregar una verificación de map del arreglo al devolver elementos del arreglo en la función optimizada, para evitar el cálculo directo del desplazamiento que devuelve los valores del arreglo.
Aviso de riesgo de PatchGap
No solo necesitamos prestar atención a las vulnerabilidades históricas, sino también a las vulnerabilidades que los fabricantes están arreglando silenciosamente en los componentes básicos. Después de una revisión, se ha descubierto que cierto software aún no ha solucionado esta vulnerabilidad.
En la arquitectura x86, debido a la falta de compresión de direcciones, la lectura y escritura arbitrarias son directas en relación con todo el proceso. Aunque ASLR está habilitado, cuando el archivo es grande, un hacker solo necesita leer y escribir en direcciones fijas, lo que tiene una gran probabilidad de acceder al contenido del archivo. Combinando con el análisis de PE y otros enfoques tradicionales, no es difícil completar toda la cadena de explotación de vulnerabilidades.
Esta vez, PatchGap no solo involucra el Issue1352549, sino que también ha reducido significativamente la dificultad de explotación de problemas similares como el Issue1314616 y el Issue1216437. Los hackers casi no necesitan costos de investigación para llevar a cabo una explotación completa de cualquier vulnerabilidad de uninitialized_oddball que se haya filtrado anteriormente.
Resumen
Este artículo presenta brevemente cómo lograr una lectura arbitraria a través de la filtración de uninitialized_Oddball en el valor Sentinel. En v8 hay muchos otros valores Sentinel, y es muy probable que existan problemas similares. Esto nos da algunas reflexiones:
¿Se puede lograr fácilmente RCE de v8 con otras filtraciones de uninitialized_Oddball?
¿Se deberían tratar problemas similares oficialmente como problemas de seguridad?
¿Es necesario incluir valores centinela como %TheHole/uninitialized_Oddball como variables en el fuzzer para descubrir otros usos de primitivas?
De todos modos, este tipo de problemas acortará significativamente el período en que los hackers pueden lograr una explotación completa.
Esta página puede contener contenido de terceros, que se proporciona únicamente con fines informativos (sin garantías ni declaraciones) y no debe considerarse como un respaldo por parte de Gate a las opiniones expresadas ni como asesoramiento financiero o profesional. Consulte el Descargo de responsabilidad para obtener más detalles.
22 me gusta
Recompensa
22
5
Republicar
Compartir
Comentar
0/400
UnluckyValidator
· 07-10 22:09
¿Qué? v8 tiene una vulnerabilidad tan grande.
Ver originalesResponder0
ShibaMillionairen't
· 07-09 05:56
Otra vez un bug de v8, me voy, me voy.
Ver originalesResponder0
UncommonNPC
· 07-09 05:54
Hacker juega tan hábilmente, no es de extrañar que sea v8
Revelación de la vulnerabilidad de Chrome v8: cómo utilizar el Valor Centinela para lograr la evasión de la sandbox
Revelando cómo el Valor Centinela elude el mecanismo de protección de seguridad de Chrome v8
El valor centinela es un valor especial en algoritmos, que generalmente se utiliza como condición de terminación en algoritmos de bucle o recursivos. En el código fuente de Chrome existen múltiples valores centinela. Investigaciones anteriores han demostrado que la filtración del objeto TheHole puede permitir la ejecución de código arbitrario dentro de la sandbox. El equipo de Google posteriormente corrigió estas dos vulnerabilidades.
Sin embargo, además del objeto TheHole, hay otros objetos nativos en V8 que no deberían filtrarse a JS. Este artículo discutirá el objeto Uninitialized Oddball, que actualmente todavía se puede utilizar en la última versión de V8, y Google aún no lo ha corregido.
Cabe destacar que este método tiene cierta universalidad:
El problema 1216437 menciona primero la filtración de internal uninitialized oddball.
El poc del Issue1314616 también filtró directamente UninitializedOddball.
El Issue1352549 detalla el método de uso.
Estos casos indican que es necesario revisar el software que podría verse afectado. Actualmente, algunas aplicaciones aún no han corregido la vulnerabilidad.
Valor centinela en V8
En el archivo v8/src/roots/roots.h se enumeran la mayoría de los objetos nativos de v8, que están dispuestos de manera adyacente en la memoria. Una vez que estos objetos se filtran a Javascript, puede ser posible ejecutar cualquier código dentro de la sandbox.
Podemos filtrar Uninitialized Oddball en JavaScript modificando la función nativa de v8. En concreto, se puede modificar el desplazamiento relativo al isolate en la función %TheHole() para que devuelva Uninitialized Oddball.
Eludir la protección HardenType
El método de uso es el siguiente:
javascript const uninitialized = %TheHole(); const float_array = new Float64Array(1); float_array[0] = 1.1;
función read(obj, desplazamiento) { return float_array[obj.prop]; }
const obj = {prop: no inicializado};
para (let i = 0; i < 100000; i++) { read(obj, 0);
}
%OptimizeFunctionOnNextCall(leer); const value = read(obj, 0x12345);
En la prueba de v8-11.0.0, cuando %TheHole() devuelve UninitializedOddball, aún se puede lograr una lectura relativamente arbitraria.
El código de ensamblaje del función read optimizada muestra que se revisó la propiedad prop del objeto, pero no se verificó el valor de obj.prop que es key, lo que llevó a calcular el desplazamiento directamente según la semántica de JavaScript, causando confusión de tipos que permite lecturas arbitrarias.
La sugerencia de solución es agregar una verificación de map del arreglo al devolver elementos del arreglo en la función optimizada, para evitar el cálculo directo del desplazamiento que devuelve los valores del arreglo.
Aviso de riesgo de PatchGap
No solo necesitamos prestar atención a las vulnerabilidades históricas, sino también a las vulnerabilidades que los fabricantes están arreglando silenciosamente en los componentes básicos. Después de una revisión, se ha descubierto que cierto software aún no ha solucionado esta vulnerabilidad.
En la arquitectura x86, debido a la falta de compresión de direcciones, la lectura y escritura arbitrarias son directas en relación con todo el proceso. Aunque ASLR está habilitado, cuando el archivo es grande, un hacker solo necesita leer y escribir en direcciones fijas, lo que tiene una gran probabilidad de acceder al contenido del archivo. Combinando con el análisis de PE y otros enfoques tradicionales, no es difícil completar toda la cadena de explotación de vulnerabilidades.
Esta vez, PatchGap no solo involucra el Issue1352549, sino que también ha reducido significativamente la dificultad de explotación de problemas similares como el Issue1314616 y el Issue1216437. Los hackers casi no necesitan costos de investigación para llevar a cabo una explotación completa de cualquier vulnerabilidad de uninitialized_oddball que se haya filtrado anteriormente.
Resumen
Este artículo presenta brevemente cómo lograr una lectura arbitraria a través de la filtración de uninitialized_Oddball en el valor Sentinel. En v8 hay muchos otros valores Sentinel, y es muy probable que existan problemas similares. Esto nos da algunas reflexiones:
¿Se puede lograr fácilmente RCE de v8 con otras filtraciones de uninitialized_Oddball?
¿Se deberían tratar problemas similares oficialmente como problemas de seguridad?
¿Es necesario incluir valores centinela como %TheHole/uninitialized_Oddball como variables en el fuzzer para descubrir otros usos de primitivas?
De todos modos, este tipo de problemas acortará significativamente el período en que los hackers pueden lograr una explotación completa.