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.
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.
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.
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á.
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.