Explotación de CVE-2021-21220
Desde un Comportamiento Incorrecto de JIT hasta la Ejecución Remota de Código
Resumen
Esta presentación explica la explotación de CVE-2021-21220, una vulnerabilidad en el motor JavaScript V8 de Google Chrome causada por suposiciones incorrectas del compilador JIT durante la optimización.
La presentación recorre:
- Cómo V8 realiza la compilación Just-In-Time (JIT)
- Cómo aparece un error de confusión de tipos con signo/sin signo durante la optimización
- Cómo el error conduce a una primitiva de matriz fuera de límites (OOB)
- Cómo los atacantes pueden aprovechar el acceso OOB para filtrar direcciones y lograr escrituras arbitrarias de memoria
- Cómo WebAssembly (Wasm) se convierte en un objetivo para la ejecución de código nativo
- Mitigaciones existentes y defensas modernas de los navegadores
Objetivos de la Presentación
El objetivo de esta presentación es demostrar cómo un sutil error de optimización dentro de un motor JavaScript moderno puede escalar a:
- Corrupción de memoria
- Primitivas de lectura/escritura arbitrarias
- Modificación de código nativo
- Posible Ejecución Remota de Código (RCE)
La cadena de explotación resalta cómo los motores JIT equilibran el rendimiento y la seguridad, y cómo las suposiciones de optimización incorrectas pueden volverse explotables.
Temas Cubiertos
1. Arquitectura de V8
La presentación introduce los principales componentes de V8:
Intérprete Ignition
- Ejecuta bytecode de JavaScript
- Recopila retroalimentación en tiempo de ejecución
- Almacena información de tipos en vectores de retroalimentación
Optimizador TurboFan
- Construye grafos optimizados a partir de la retroalimentación en tiempo de ejecución
- Inserta suposiciones especulativas y protecciones (guards)
- Realiza pases de optimización agresivos
Backend de Código Máquina
- Emite instrucciones nativas de la CPU
- Produce código máquina optimizado para funciones "calientes" (hot)
El diagrama de arquitectura en la presentación ilustra cómo JavaScript se mueve desde:
Parsing → Bytecode → Optimization → Execution
2. Por qué JavaScript es difícil de optimizar
JavaScript es un desafío para la ejecución de alto rendimiento porque:
- Las variables cambian de tipo dinámicamente
- Los arreglos cambian de estructura y tipos de elementos
- Operadores como
+ pueden tener múltiples significados
- Las comprobaciones en tiempo de ejecución son costosas
V8 utiliza la compilación JIT para optimizar patrones de ejecución comunes especulando sobre el comportamiento en tiempo de ejecución.
3. Causa Raíz de CVE-2021-21220
La vulnerabilidad se origina en una discrepancia de enteros con signo y sin signo durante la optimización JIT.
Conceptos clave demostrados:
Uint32Array
Word32Xor
- Propagación de tipos incorrecta
ChangeInt32ToInt64
- Selección incorrecta de instrucciones de ensamblador
El exploit abusa del valor:
4. Desajuste de Optimización
La vulnerabilidad ocurre porque TurboFan optimiza:
por completo.
Durante esta optimización:
- La operación XOR desaparece
- La información de tipo se pierde
- Los valores con signo se interpretan como sin signo
- El comportamiento de JIT diverge del comportamiento del intérprete
Esto resulta en una generación incorrecta de código máquina y valores controlados por el atacante.
5. Construyendo una Primitiva OOB
El exploit convierte el resultado incorrecto de JIT en control sobre el comportamiento del arreglo.
La presentación demuestra:
- Valor entero optimizado incorrecto
- Conversión en la variable de control
i
- Desajuste entre la ejecución de calentamiento (warmup) y la de activación (trigger)
- Subdesbordamiento de longitud con
Array.shift()
- Creación de un arreglo capaz de OOB
Conceptos importantes de explotación mostrados:
- Optimización de calentamiento
- Optimización especulativa
- Confusión de tipos
- Corrupción de la longitud del arreglo
6. Acceso Fuera de Límites
Una vez que la longitud del arreglo se convierte en -1, el atacante obtiene:
- Lecturas fuera de límites
- Escrituras fuera de límites
- Acceso a objetos vecinos del heap de V8
El exploit luego demuestra:
- Filtraciones de punteros
- Descubrimiento de direcciones de objetos
- Arreglos superpuestos
- Extracción de punteros sin procesar de V8
7. Abuso de WebAssembly
La presentación explica cómo los atacantes pueden apuntar a:
- Páginas de código compilado de WebAssembly
- Memoria ejecutable nativa generada por V8
Flujo de ataque:
- Crear una función Wasm
- Localizar memoria ejecutable
- Sobrescribir el código máquina compilado
- Re-ejecutar Wasm
- Lograr ejecución nativa arbitraria
Esto demuestra cómo un error del motor JavaScript puede transicionar a la ejecución de código a nivel de proceso.
Defensas y Mitigaciones
La sección final cubre las defensas modernas de los navegadores:
Punteros Comprimidos
Reducen la exposición directa de punteros y la previsibilidad del heap.
Indirección de Punteros
Previenen el acceso directo a direcciones de memoria sin procesar.
Sandboxing del Heap
Aíslan regiones de memoria y reducen el impacto del exploit.
W^X (Write XOR Execute)
Previenen que las páginas sean escribibles y ejecutables simultáneamente.
La presentación también incluye el diff real del parche de V8 que muestra la corrección del problema de extensión con signo.
Conclusiones Clave
Esta presentación demuestra cómo:
- Pequeños errores de optimización pueden convertirse en vulnerabilidades críticas
- Los compiladores JIT aumentan significativamente la complejidad de la superficie de ataque
- La especulación en tiempo de ejecución puede introducir inconsistencias peligrosas
- WebAssembly cambia el panorama de la explotación
- Los navegadores modernos requieren múltiples defensas en capas
Tecnologías Discutidas
- JavaScript
- Motor Google V8
- TurboFan
- Ignition
- WebAssembly (Wasm)
- Compilación JIT
- Corrupción de memoria
- Acceso fuera de límites
- Explotación de navegadores
Propósito Educativo
Este material está destinado estrictamente para:
- Investigación en seguridad
- Demostraciones educativas
- Aprendizaje de internos del navegador
- Análisis de vulnerabilidades
No utilice esta información contra sistemas que no posea o para los que no tenga permiso de prueba.
Referencia