- A atualização MV3 do Chrome removeu a permissão
webRequestBlockingpara enfraquecer os recursos dos bloqueadores de anúncios existentes - O autor descobriu em 2023 um bug que permitia contornar o
webRequestBlockingmesmo no ambiente MV3 - Esse bug ocorria por causa da estrutura frágil dos bindings em JavaScript e porque código antigo ainda permanecia no sistema
- Ao manipular o ID da instância do WebView, era possível contornar a verificação de permissões e usar a funcionalidade de bloqueio mesmo no ambiente MV3
- Atualmente, o patch já foi aplicado e esse método de contorno não funciona mais
MV3 e as mudanças nos adblockers
- O Chrome está descontinuando gradualmente as extensões MV2 e fazendo a transição para o MV3
- O MV3 remove a permissão
webRequestBlocking, impedindo que bloqueadores de anúncios bloqueiem dinamicamente requisições de rede por script - No lugar dessa permissão, foi adicionada a API
declarativeNetRequest, mas ela não oferece o mesmo nível de flexibilidade - Por causa dessa mudança, houve uma grande redução na capacidade dos adblockers
Limites da estrutura de bindings em JavaScript
- O núcleo do Chrome é desenvolvido em C++, mas as extensões funcionam em JavaScript, e as APIs de extensão também são acessadas por meio de bindings em JS
- Até 2015~2016, a API era inicializada e validada inserindo arquivos JS (módulos de binding de extensões) no site
- Esse método era vulnerável a sobrescrita de funções globais e protótipos em JS, o que levou a vários bugs de Universal XSS
- Depois disso, o Google migrou os principais bindings para C++, mas alguns arquivos de bindings em JS ainda permanecem
- Até hoje, certas APIs como
chrome.webRequestainda usam essa estrutura de bindings em JS
Contorno usando a classe de eventos de requisição web
-
No MV2, era possível implementar o bloqueio de requisições web com o código abaixo
chrome.webRequest.onBeforeRequest.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
No MV3, a opção
blockingé proibida, então o bloqueio normal não é possível -
No entanto, é possível criar um objeto de evento arbitrário por meio de
.constructordo eventowebRequest -
Internamente, uma classe wrapper especial dos bindings em JS gerencia esse objeto de evento
-
Se você definir
opt_webViewInstanceId, um dos parâmetros do construtor, é possível contornar a lógica de permissão exclusiva para apps de plataforma e escapar da verificação da permissão de bloqueiolet WebRequestEvent = chrome.webRequest.onBeforeRequest.constructor let fakeEvent = new WebRequestEvent("webRequest.onBeforeRequest", 0, 0, 0, 1337) fakeEvent.addListener(() => { return { cancel: true } }, { urls: ['*://*.example.com/*'] }, ['blocking']) -
Embora tenha sido projetado para uso apenas por apps de plataforma, a validação insuficiente do ID do WebView permitia abuso por extensões comuns
Resultado e patch de segurança
- Com essa vulnerabilidade, era de fato possível desenvolver um adblocker completo mesmo no ambiente MV3
- O autor reportou esse bug ao Google em 2023, e ele foi corrigido no Chrome 118 com uma verificação adequada da posse da permissão do WebView
- Não houve pagamento de recompensa, por causa da característica estrutural do problema, que permitia apenas contorno de permissão sem exposição adicional de dados
- Este caso mostra que algumas dezenas de linhas de código podem neutralizar uma atualização de segurança de uma grande empresa
Conclusão e referência
- O bug já foi corrigido e não funciona mais
- Como caso semelhante e interessante de vulnerabilidade relacionada a extensões do Chrome, também existe um problema que recebeu número CVE e recompensa de US$ 10.000 (ver post separado no blog)
4 comentários
Provavelmente, depois daquela atualização, as empresas de adblock até aumentaram a receita.
Apps independentes que bloqueiam tudo diretamente no nível da rede só podem ser usados na versão paga, então devem ter vendido bastante.
Ficar dizendo que não te pagaram ao publicar uma vulnerabilidade que, depois de 2 anos, já não significa mais nada... pessoalmente, não acho isso muito elegante.
Mas imagino que esse tipo de coisa também precise ser escrito no blog para provar o próprio valor, né?
Sinceramente, eu também queria aprender essa mentalidade e escrever muito mais no meu blog.
É só usar o Firefox. Nos últimos 1 ou 2 anos ele ficou bem mais rápido, então não é uma opção ruim.
Eu uso o Firefox como principal há vários anos e de vez em quando comparo com o Chrome, e especialmente recentemente sinto que o Firefox está totalmente bom de usar.
Até páginas da web que ignoravam os padrões web, como os bancos coreanos, ultimamente foram bastante corrigidas, então a maioria também funciona bem no Firefox.
A personalização é muito mais fácil no Firefox também.
Opiniões do Hacker News
Apesar de eu querer experimentar o Firefox, os maiores obstáculos são alguns bugs ocasionais de carregamento de sites e o fato de não ser possível instalar PWAs (Progressive Web Apps). O Chrome e os navegadores derivados já suportam isso há muito tempo, então não entendo bem por que o Firefox ainda não implementou. Encontrei uma extensão de terceiros (PWAs for Firefox), mas fico relutante em usar por questões de privacidade
Mesmo que exista uma forma de contornar o que o Google está fazendo, não acho que essa seja a direção certa. Se as pessoas não concordam com os movimentos do Google, a única forma correta é abandonar tanto o Chrome quanto todos os navegadores baseados em Chromium. É importante atingir o monopólio do Google e tirar dele o controle sobre o rumo futuro da web
O verdadeiro contorno é usar o Firefox. O uBlock Origin funciona melhor no Firefox
uBlock Origin works best on Firefox
Também fico em dúvida se o MV3 é realmente mais seguro que o MV2. Não parece que mudar para o MV3 fortaleça de fato a segurança de forma essencial
Sobre o caso de alguém ter encontrado uma forma de contornar bloqueadores de anúncios e contado isso ao Google, houve a reação: “achou e foi correndo dedurar para o Google, excelente”
O OP reportou ao Google um “issue” que não causava problema nenhum, e com isso bloqueou um método que os desenvolvedores de addons poderiam usar para contornar as limitações do MV3. Espero que tenha valido os $0
Desde que comecei a usar o Brave, não sinto falta nenhuma do Chrome
Brave
Stop using Brave browser
Diante da afirmação de que “adblockers precisam obrigatoriamente de
webRequestBlocking, e como o Google ganha dinheiro com anúncios, remover esse recurso foi algo muito intencional”, também há a opinião de que “isso não é verdade, qualquer um pode usar o uBlock Origin Lite no Chrome com manifest v3, o desempenho é bom e eu não percebo diferença em relação ao uBlock Origin tradicional. Tudo é filtrado em C++, então é muito mais rápido. Claro, existe um limite máximo de regras, mas por enquanto é algo totalmente administrável”Fora o notebook de trabalho, não tenho motivo para usar Chrome e continuo usando Firefox no dia a dia. Ainda assim, é uma pena não poder usar o uBlock Origin no contexto profissional, já que ele ajudava bastante na navegação de trabalho (pesquisa, documentação etc.)
Se você só quer um contorno, é só instalar o Firefox