Eludir HardenProtect de Chrome V8 a través de la filtración del Valor Sentinel
El valor centinela es un valor especial en algoritmos, comúnmente utilizado como condición de terminación en algoritmos de bucle o recursión. En el código fuente de Chrome existen múltiples valores centinela. Investigaciones anteriores han señalado cómo utilizar el objeto TheHole para filtrar la ejecución de código arbitrario dentro de la sandbox. Este artículo discutirá otro objeto nativo de V8 - Uninitialized Oddball, que actualmente todavía se puede utilizar en la última versión de V8.
Este método tiene universalidad:
En el Issue1216437 se introdujo primero el concepto de filtración de oddball interno no inicializado.
En el Issue1314616 también se filtró directamente UninitializedOddball, aunque el método de explotación no estaba claro en ese momento.
El Issue1352549 merece atención por su impacto potencial.
Actualmente, algunos software aún no han solucionado esta vulnerabilidad.
La mayoría de los objetos nativos en V8 están definidos en el archivo v8/src/roots/roots.h, y estos objetos están dispuestos adyacentes en la memoria. Una vez que se exponen objetos nativos que no deberían ser divulgados a JavaScript, se puede lograr la ejecución de cualquier código dentro de la sandbox.
Para validar este método, se puede modificar la función nativa de V8 para filtrar el Oddball no inicializado en JavaScript. En concreto, se puede modificar el desplazamiento relativo al isolate en la función %TheHole().
El código central del método que se debe evitar es el siguiente:
javascript
function read(obj, prop) {
return obj[prop];
}
let uninitialized_oddball = %TheHole();
let arr = [1.1, 2.2, 3.3];
for (let i = 0; i < 100000; i++) {
read(arr, 0);
}
let val = read(uninitialized_oddball, 0);
console.log(val);
En la prueba de V8 11.0.0, cuando %TheHole() devuelve UninitializedOddball, se puede lograr una lectura relativamente arbitraria.
La clave de la función read optimizada es la siguiente:
Cuando se pasa un uninitialized_oddball, se calcula desde el obj comenzando en 0x558b20004086, y finalmente se completa una lectura arbitraria en la instrucción vmovsd, con los datos almacenados en el registro xmm0.
Se sugiere que la solución sea agregar una verificación de map de arreglo al devolver elementos del arreglo en la función optimizada, para evitar el cálculo directo del desplazamiento al devolver valores del arreglo.
Es importante señalar que algunos softwares aún no han corregido esta vulnerabilidad. La forma de explotación en la plataforma x86 es ligeramente diferente; debido a la falta de compresión de direcciones, la lectura y escritura arbitrarias se realizan en relación con todo el proceso. Incluso si ASLR está habilitado, debido al gran tamaño del archivo, todavía hay una alta probabilidad de leer y escribir el contenido objetivo.
Este nuevo método de evasión ha reducido significativamente la dificultad de explotación de vulnerabilidades similares anteriores. Se recomienda revisar todas las vulnerabilidades que filtran uninitialized_oddball.
En V8 también existen otros valores Sentinel, que igualmente pueden causar problemas similares. Esto nos da la siguiente revelación:
¿Es fácil implementar RCE de V8 en otras filtraciones de uninitialized_Oddball?
Existe controversia sobre si este tipo de problemas debe considerarse formalmente como un problema de seguridad.
¿Debería incluirse el valor centinela como variable en Fuzzer para descubrir nuevos primitivos de explotación?
De todos modos, este tipo de problemas acortará significativamente el ciclo en el que los hackers pueden lograr una explotación completa.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
10 me gusta
Recompensa
10
5
Compartir
Comentar
0/400
ZKProofEnthusiast
· 07-09 11:53
Como todos saben, V8 impulsa al mundo.
Ver originalesResponder0
SleepyValidator
· 07-06 23:01
Chrome realmente no es una broma, es estable.
Ver originalesResponder0
FlashLoanLord
· 07-06 17:06
¿Cómo es posible que un agujero tan grande aún no se haya reparado?
Ver originalesResponder0
ForkItAll
· 07-06 17:00
v8 esta vulnerabilidad es realmente ybb.
Ver originalesResponder0
FudVaccinator
· 07-06 16:51
Otra vulnerabilidad importante. Siempre es un placer usar Firefox.
El motor Chrome V8 vuelve a presentar una vulnerabilidad de seguridad: la filtración de Sentinel Value puede eludir la sandbox.
Eludir HardenProtect de Chrome V8 a través de la filtración del Valor Sentinel
El valor centinela es un valor especial en algoritmos, comúnmente utilizado como condición de terminación en algoritmos de bucle o recursión. En el código fuente de Chrome existen múltiples valores centinela. Investigaciones anteriores han señalado cómo utilizar el objeto TheHole para filtrar la ejecución de código arbitrario dentro de la sandbox. Este artículo discutirá otro objeto nativo de V8 - Uninitialized Oddball, que actualmente todavía se puede utilizar en la última versión de V8.
Este método tiene universalidad:
En el Issue1216437 se introdujo primero el concepto de filtración de oddball interno no inicializado.
En el Issue1314616 también se filtró directamente UninitializedOddball, aunque el método de explotación no estaba claro en ese momento.
El Issue1352549 merece atención por su impacto potencial.
Actualmente, algunos software aún no han solucionado esta vulnerabilidad.
La mayoría de los objetos nativos en V8 están definidos en el archivo v8/src/roots/roots.h, y estos objetos están dispuestos adyacentes en la memoria. Una vez que se exponen objetos nativos que no deberían ser divulgados a JavaScript, se puede lograr la ejecución de cualquier código dentro de la sandbox.
Para validar este método, se puede modificar la función nativa de V8 para filtrar el Oddball no inicializado en JavaScript. En concreto, se puede modificar el desplazamiento relativo al isolate en la función %TheHole().
El código central del método que se debe evitar es el siguiente:
javascript function read(obj, prop) { return obj[prop]; }
let uninitialized_oddball = %TheHole(); let arr = [1.1, 2.2, 3.3];
for (let i = 0; i < 100000; i++) { read(arr, 0);
}
let val = read(uninitialized_oddball, 0); console.log(val);
En la prueba de V8 11.0.0, cuando %TheHole() devuelve UninitializedOddball, se puede lograr una lectura relativamente arbitraria.
La clave de la función read optimizada es la siguiente:
0x558b20004086 mov r11,rdi 0x558b20004089 movzx edi,byte ptr [r11+0xb] 0x558b2000408d cmp edi,0x81 0x558b20004093 jnz 0x558b200040d8 0x558b20004095 mov r9,qword ptr [r11+0xf] 0x558b20004099 prueba esi,esi 0x558b2000409b js 0x558b200040d8 0x558b2000409d movsxd r11,esi 0x558b200040a0 cmp r11,qword ptr [r9+0xf] 0x558b200040a4 jae 0x558b200040d8 0x558b200040a6 vmovsd xmm0,[r9+r11*8+0x7]
Cuando se pasa un uninitialized_oddball, se calcula desde el obj comenzando en 0x558b20004086, y finalmente se completa una lectura arbitraria en la instrucción vmovsd, con los datos almacenados en el registro xmm0.
Se sugiere que la solución sea agregar una verificación de map de arreglo al devolver elementos del arreglo en la función optimizada, para evitar el cálculo directo del desplazamiento al devolver valores del arreglo.
Es importante señalar que algunos softwares aún no han corregido esta vulnerabilidad. La forma de explotación en la plataforma x86 es ligeramente diferente; debido a la falta de compresión de direcciones, la lectura y escritura arbitrarias se realizan en relación con todo el proceso. Incluso si ASLR está habilitado, debido al gran tamaño del archivo, todavía hay una alta probabilidad de leer y escribir el contenido objetivo.
Este nuevo método de evasión ha reducido significativamente la dificultad de explotación de vulnerabilidades similares anteriores. Se recomienda revisar todas las vulnerabilidades que filtran uninitialized_oddball.
En V8 también existen otros valores Sentinel, que igualmente pueden causar problemas similares. Esto nos da la siguiente revelación:
¿Es fácil implementar RCE de V8 en otras filtraciones de uninitialized_Oddball?
Existe controversia sobre si este tipo de problemas debe considerarse formalmente como un problema de seguridad.
¿Debería incluirse el valor centinela como variable en Fuzzer para descubrir nuevos primitivos de explotación?
De todos modos, este tipo de problemas acortará significativamente el ciclo en el que los hackers pueden lograr una explotación completa.