Voltar para todas as publicações
Publicado em · por Renaud Deraison

Como o Bromure bloqueia anúncios antes que a página os veja

A maioria dos bloqueadores de anúncios são extensões de navegador, e a maioria das extensões de navegador roda dentro do mesmo processo que a página da qual estão tentando te proteger. O Bromure faz diferente. Veja como, e por que isso importa.

Um bloqueador de anúncios que vive dentro do navegador é como um árbitro tentando apitar uma luta de dentro do ringue. O Bromure move o árbitro para a própria rede, onde nenhuma página alcança, nenhum script toca e nenhum banner "anti-bloqueador de anúncios" consegue discutir com ele.

O bloqueio de anúncios é, de longe, o recurso de navegador mais popular que não vem embutido no navegador. Centenas de milhões de pessoas instalam uma extensão de terceiros logo no primeiro dia porque a web moderna é genuinamente inutilizável sem uma. Isso, por si só, já é um sinal de que o projeto está errado. Mas a forma como quase todo bloqueador de anúncios funciona merece atenção, porque a arquitetura acaba importando muito — tanto para o quão bem funciona quanto para o que acontece quando a página começa a brigar de volta.

Este post percorre como um bloqueador de anúncios costuma funcionar, por que esse formato tem limites reais, e como o Bromure segue um caminho diferente que toma emprestada sua ideia central de uma ferramenta da qual você talvez já tenha ouvido falar, rodando em um Raspberry Pi no porão de alguém.

Anúncios não são só irritantes. São um problema de carregamento, um problema

de privacidade e um vetor de ataque.

É fácil esquecer, depois de alguns anos de bloqueio de anúncios, como a web crua realmente é. Uma matéria popular de jornal, carregada sem qualquer filtragem, normalmente busca recursos de 30 a 80 domínios de terceiros. A maioria é composta por analytics, pixels de rastreamento e endpoints de leilão em tempo real. Eles aumentam o peso, adicionam latência, deixam cookies em nome de empresas que você nunca ouviu falar e — como discutido no post sobre ransomware do início deste mês — são um dos veículos silenciosos de distribuição de malware, porque redes de anúncios de vez em quando são enganadas e acabam servindo criativos maliciosos em sites legítimos.

news.example.comuma matériadoubleclick.netgoogletagmanager.comfacebook.netadnxs.comscorecardresearch.comcriteo.nethotjar.comsegment.comchartbeat.compubmatic.comrubiconproject.comliveramp.comtaboola.comoutbrain.comnewrelic.comamplitude.commixpanel.com… mais 40Cada logo é um novo domínio, novo DNS, novo TLS, novo conjunto de cookies. Nada que você tenha pedido.
O que uma única visita a uma página realmente puxa, em 2026, sem nenhuma filtragem. A matéria que você está lendo costuma ser a menor requisição da página. Todo o resto é a engrenagem em que a matéria foi embrulhada.

Bloquear essas requisições, portanto, não é um problema cosmético. É um ganho de desempenho, um ganho de privacidade e — porque redes de anúncios são um canal regular de distribuição de malware — um ganho real de segurança. A única pergunta é como bloqueá-las.

Como uma extensão de navegador típica bloqueia anúncios.

Quase todo bloqueador de anúncios convencional, incluindo os populares que você provavelmente já instalou, é uma extensão de navegador. O que significa que, arquiteturalmente, ele vive dentro do navegador — executa JavaScript dentro do processo do navegador, registra callbacks nas APIs de rede do navegador (webRequest, declarativeNetRequest) e inspeciona cada requisição que o navegador está prestes a fazer.

PROCESSO DO NAVEGADORPáginacarrega, executa scripts,solicita recursosExtensão de bloqueioinspeciona cada requisição,permite ou bloqueiaRedeTCP / TLSaté o site(bloqueado)A extensão é código carregado pelo navegador.Um renderer comprometido ou uma permissão revogada pode derrubá-la.Uma página hostil consegue ver se ela está instalada e se recusar a carregar.Internetservidor de anúncios · rastreador · analytics
Como um bloqueador de anúncios baseado em extensão costuma operar. A extensão vive dentro do navegador. Cada requisição de saída é entregue a ela para aprovação; ela bloqueia aquelas cujas URLs batem com suas regras. A página e a extensão compartilham o mesmo processo e, na maioria dos casos, as mesmas permissões.

Esse formato funciona — afinal, é o que a maior parte das pessoas usa todos os dias —, mas tem limites estruturais reais:

A página percebe

Como a extensão vive no mesmo processo que a página, o JavaScript da própria página consegue sondá-la: "minha requisição realmente saiu? essa variável foi definida?" Sites inteiros (e a maioria dos jornais com paywall) detectam requisições ausentes e se recusam a carregar sem elas, exigindo que o usuário "desative o bloqueador de anúncios".

A página está na mesma zona de confiança

A extensão e a página hostil que ela está tentando filtrar compartilham um processo de navegador, um renderer e, às vezes, um conjunto de permissões. Uma falha grave o suficiente no navegador, dentro da página, desativa a extensão junto com tudo o mais. Extensões são código; também são superfície de ataque.

A requisição já nasceu

Quando a extensão vê uma requisição, o navegador já decidiu fazê-la, já analisou a URL e (dependendo da API) já executou a consulta de DNS. Bloquear nesse estágio é filtragem, não prevenção.

A API de filtragem fica cada vez mais fraca

A reescrita do Chrome com Manifest v3 restringiu o que extensões de filtragem podem fazer, principalmente limitando a quantidade de regras e substituindo o webRequest dinâmico pelo declarativeNetRequest. A arquitetura da API de extensões é definida pelo fornecedor do navegador, não por você.

Como o Bromure faz: a parede não é a extensão.

O bloqueador de anúncios do Bromure não é uma extensão. O próprio navegador não tem nenhum código de bloqueio de anúncios. Em vez disso, a pilha de rede da VM Linux descartável em que o navegador roda é o bloqueador de anúncios — e, do ponto de vista do navegador, os domínios de anúncios simplesmente não resolvem.

VM CONVIDADA · rede do perfilNavegadorsem extensão debloqueio instaladaProxy Squid:3128 · HTTP/HTTPSresolve via DNS localdnsmasqresolvedor DNS localenvia matches para o sinkholeLISTA DE BLOQUEIOgravity.listmais de 100 mil domíniosredireciona para 0.0.0.0Internetnews.example.comdoubleclick.netadnxs.comBLOQUEADONem a página nem seus scripts enxergam além do proxy. De dentro do navegador, domínios de anúncios simplesmente não existem.
Dentro da VM de um perfil Bromure, cada conexão de saída do navegador é roteada por um proxy HTTP local. Esse proxy resolve todo domínio por um servidor DNS local cuja lista de 'não' é uma lista de bloqueio. Se o domínio estiver na lista, o navegador recebe um endereço inalcançável e nunca faz a conexão — nem mesmo os scripts da própria página.

Mecanicamente, duas peças de software pequenas e sem graça fazem o trabalho:

Um proxy HTTP local (Squid)

Toda requisição de saída do navegador é roteada de forma transparente por um proxy Squid rodando em localhost:3128 dentro da VM. O Squid é o encanamento: ele não decide o que é anúncio, só faz resolução de DNS e encaminhamento para o navegador.

Um resolvedor DNS local (dnsmasq)

O Squid é configurado para resolver todo domínio por uma instância local do dnsmasq em 127.0.0.1. A configuração do dnsmasq inclui uma lista de bloqueio de cerca de 100 mil domínios — redes de anúncios, rastreadores, analytics, hosts sabidamente maliciosos. Qualquer coisa na lista resolve para 0.0.0.0, que não leva a lugar nenhum.

O resultado é uma rede que, do ponto de vista do navegador, tem formato de internet, só que os domínios de anúncios e rastreamento não têm nenhum registro DNS. O navegador pede doubleclick.net, recebe de volta "sem rota" e segue em frente. Nenhuma conexão é aberta. Nenhum handshake TLS é tentado. Nenhum cookie vai a lugar nenhum, porque não existe lugar nenhum para onde mandá-lo.

A mesma ideia que roda em porões há anos.

Se você já configurou o pi-hole, o pequeno sinkhole DNS que muita gente roda num Raspberry Pi para filtrar anúncios de toda a rede doméstica, a arquitetura do Bromure vai parecer profundamente familiar. A lista de bloqueio subjacente é o arquivo unificado de hosts do Steven Black, o mesmo que essas instalações caseiras usam há anos. O movimento conceitual é idêntico: não tente remover anúncios da página, apenas se recuse a dizer ao navegador como encontrar o servidor do anúncio em primeiro lugar.

A diferença importante é onde o sinkhole vive. Um buraco DNS do tamanho de uma casa protege cada dispositivo da rede doméstica; um sinkhole do Bromure protege exatamente um perfil de navegador. Ligue-o no perfil que você usa para ler notícias; deixe-o desligado no perfil em que seu banco prefere que você não passe por nenhum middleware incomum.

O que isso de fato te dá.

A extensão bloqueiaO navegador analisa a URL do anúncio.A consulta DNS do domínio do anúncio é feita.Uma tentativa de conexão pode começar.A extensão veta no último momento.A página consegue detectar a requisição ausente.O SERVIDOR DE ANÚNCIOS FICA SABENDO"alguém tentou nos alcançar,do IP X, e desistiu."O Bromure nunca perguntaO navegador pergunta o domínio ao DNS local.O dnsmasq responde 0.0.0.0.Nenhuma conexão de rede é aberta.Nenhum TLS, nenhum SNI, nenhuma requisição HTTP.A página não consegue distinguir isso de uma falha de DNS.O SERVIDOR DE ANÚNCIOS FICA SABENDOnada.Não há conexão para observar.
Mesma visita à página, arquiteturas diferentes. A extensão deixa a requisição começar e a filtra no último momento possível. O Bromure se recusa a fazer a pergunta antes mesmo de ela ser feita. O servidor de anúncios não fica sabendo nada sobre o usuário do Bromure — nem mesmo que ele tentou.

Os ganhos práticos se acumulam:

Não pode ser desativado por uma página comprometida

A lista de bloqueio não é código carregado pelo navegador; é a rede do navegador. Uma exploração de renderer, um script hostil, uma biblioteca de terceiros mal comportada — nenhum deles consegue alcançar a configuração do dnsmasq, porque nenhum consegue sair do processo do navegador até a pilha de rede da VM.

Páginas não conseguem dar a volta

O JavaScript da página pode checar propriedades de navigator o dia inteiro; ele não consegue enxergar a configuração DNS da rede em que está, porque isso não é algo que o JavaScript tem permissão para saber. Para a página, um anúncio bloqueado parece exatamente um domínio de anúncio que caiu por um minuto.

Sem superfície de ataque de extensão

Extensões bloqueadoras de anúncios, em mais de uma ocasião, já foram comprometidas — seja pela loja de extensões, por uma aquisição, ou por uma atualização maliciosa. Não existe tal extensão no Bromure para ser comprometida, porque não há extensão.

Por perfil, ligado como qualquer outra capacidade

O bloqueio de anúncios é uma configuração por perfil ("Bloquear anúncios" em Privacidade e Segurança), desligado por padrão, ligado nos perfis que você escolher. Seu perfil de banco fica sem filtragem; seu perfil do dia a dia fica limpo.

Os limites, de forma honesta.

Nada nesse espaço sai de graça. Algumas coisas que a abordagem na camada de rede deliberadamente não faz, e que você deve saber de antemão:

Sem filtragem cosmética

Uma extensão clássica consegue esconder a caixa vazia onde um banner costumava ficar. O Bromure não reescreve a página, então, se o site reservou um bloco 728×90, o bloco continua lá, em branco. É um pequeno incômodo cosmético em alguns sites, e a contrapartida é que não há nada na página para um script notar.

Anúncios de primeira parte sobrevivem

Se um site serve seus próprios anúncios a partir do próprio domínio (como fazem algumas grandes plataformas de tecnologia hoje), o bloqueio por domínio não consegue distinguir "matéria" de "anúncio" — ambos vivem no mesmo hostname. Essa é uma lacuna real; a resposta, onde importa, é uma camada de content-script por cima, algo que estamos avaliando.

Paredes anti-bloqueador de anúncios ainda detectam a ausência

Alguns sites não precisam encontrar o bloqueador de anúncios. Eles só checam se um script específico carregou e se recusam a mostrar a matéria se ele não carregou. Para esses sites, qualquer bloqueador — extensão ou rede — será pego. Isso é uma discussão de política com o site, não uma discussão técnica com o bloqueador.

A lista de bloqueio vem com o Bromure

A gravity.list é incorporada na imagem em tempo de build e é atualizada quando você atualiza o Bromure. Ela não puxa as regras mais novas toda hora, como um sinkhole doméstico dedicado e sempre ligado consegue. Para uma lista baseada em hostnames, isso costuma bastar — domínios de anúncios não viram de mão tão rápido quanto, digamos, domínios de malware —, mas vale saber.

O formato da coisa.

O ponto mais amplo não é que o bloqueador de anúncios do Bromure seja magicamente melhor em casar regras que o uBlock Origin. O motor de regras do uBlock é, na verdade, mais sofisticado. O ponto é sobre onde o bloqueio acontece. Uma extensão é um árbitro educado pedindo ao navegador, por favor, que não carregue aquela coisa. O Bromure é a estrada que a requisição teria percorrido, silenciosamente fechada na entrada da rodovia, antes de o motorista sequer entrar no carro.

Bloqueio de anúncios em uma VM lacrada não é um novo recurso do Bromure; é uma consequência da arquitetura que estava lá desde o primeiro dia. A camada de rede de cada perfil é seu próprio pequeno mundo. Esse mundo pode ter o WARP. Pode ter uma VPN paga. Pode ter um transporte Tor. E pode ter, de graça, o mesmo sinkhole DNS que vem silenciosamente filtrando anúncios em porões há anos — instalado, configurado e limitado exatamente à sessão de navegador em que você o quer.

Se quiser a versão longa, a lista de bloqueio é um arquivo de texto simples embarcado na imagem da VM — você pode inspecioná-lo diretamente na próxima release e ler cada um dos cem mil domínios que vão silenciosamente deixar de existir para o seu navegador. Se quiser só a curta, abra Privacidade e Segurança em qualquer perfil do Bromure e ative "Bloquear anúncios". A estrada já está fechada. Você só precisa dirigir.