1 pontos por GN⁺ 2025-07-13 | 4 comentários | Compartilhar no WhatsApp
  • A atualização MV3 do Chrome removeu a permissão webRequestBlocking para enfraquecer os recursos dos bloqueadores de anúncios existentes
  • O autor descobriu em 2023 um bug que permitia contornar o webRequestBlocking mesmo 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.webRequest ainda 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 .constructor do evento webRequest

  • 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 bloqueio

    let 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

 
hhcrux 2025-07-14

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.

 
crawler 2025-07-14

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.

 
ndrgrd 2025-07-14

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

 
GN⁺ 2025-07-13
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

    • Acho que os monopólios de hoje existem porque todos esqueceram a lição que deveriam ter aprendido com o IE. O problema vem do fato de não aprenderem os padrões da web e distribuírem o Chrome junto com as aplicações
    • Esse não é o ponto principal do artigo; no artigo real é mencionado que esse contorno foi corrigido no Chrome 118
    • Dá vontade de ironizar perguntando se alguma vez algo realmente mudou por causa desse papo de “temos que atingir o monopólio”
    • Na prática, isso não vai acontecer
    • Muita gente acha que migrar para navegadores Chromium com o rastreamento do Google removido não é suficiente, mas sinceramente acho que esse é justamente o enquadramento que o Google quer. O Firefox é claramente diferente do Chrome e não é tão fácil migrar saindo do Chrome. Já Brave, Chromium customizado, Vivaldi etc. são quase o mesmo que um Chrome sem rastreamento do Google. A ideia de que “não serve porque o Google ainda controla o Chromium” é, na minha visão, exatamente o tipo de FUD (medo, incerteza e dúvida) que valeria a pena espalhar do ponto de vista do Google
  • O verdadeiro contorno é usar o Firefox. O uBlock Origin funciona melhor no Firefox
    uBlock Origin works best on Firefox

    • Como sempre usei Firefox, eu nem sabia que isso estava acontecendo. Fui ver porque minha esposa disse que estava vendo anúncios no YouTube, e era isso, mesmo eu já tendo instalado o uBlock para ela antes
  • 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

    • Sinceramente, me surpreende pensar que alguém realmente acredite nisso. O próprio artigo já começa com um conflito de interesses bastante claro. Deixar qualquer extensão saber quais sites o usuário visita e quais requisições faz certamente cria um ambiente vulnerável. Ainda assim, eu confio mais no uBO do que em empresas de publicidade e coleta de dados, então continuo usando assim mesmo
  • 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”

    • Na verdade, se algum adblocker tivesse começado a usar isso, o Google teria corrigido imediatamente, e esse desenvolvedor não teria ganhado nada com isso. A ironia é que, no fim, de qualquer forma ele acabaria sem ganhar nada
  • 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

    • Um contorno desses teria sido removido pelo Google em no máximo um dia. Na verdade, o OP talvez até pudesse receber alguma recompensa financeira, então acho que era algo justificável. Não quero condenar
    • Não concordo com essa conclusão. Toda a responsabilidade é do Google. Mesmo que o OP não tivesse relatado o issue, se algum outro adblocker usasse esse método depois, o Google o proibiria rapidamente de qualquer jeito. Talvez até tomasse a medida extrema de remover a própria extensão da Web Store
    • Se um adblocker que as pessoas realmente usassem implementasse esse método, o Google obviamente o bloquearia na hora. Não é um cheat infinito que dá para explorar para sempre
    • Também penso assim. O OP acabou trabalhando de graça para uma grande corporação e, no resultado, tornou a web mais inconveniente. O motivo seria... “segurança”, imagino. Sensacional
  • Desde que comecei a usar o Brave, não sinto falta nenhuma do Chrome
    Brave

    • Na verdade, o Brave é ainda mais incômodo que o Chrome. Além dos problemas com o Brendan Eich, há lixo demais no navegador: vários recursos arbitrários, bloqueio de anúncios (Brave Shields) que nem dá para desligar completamente, elementos ligados a criptomoedas, botão de download de webapp que não pode ser desativado, interface que não pode ser removida etc.
    • O Brave continua sendo uma empresa com fins lucrativos e, por padrão, vem carregado demais de funções desnecessárias, então é inevitável que isso gere rejeição. Ainda assim, também existem vários conteúdos com dicas para deixá-lo mais enxuto, como "como colocar o Brave de dieta"
    • No fim, o motor continua sendo o Blink, então foi basicamente só uma mudança de aparência. Nunca vi um navegador Blink manter o Manifest V2 indefinidamente. Mesmo que exista algum, seria um soft fork e não duraria muito
    • O Brave também é baseado em Chromium no fim das contas, então na prática é quase a mesma coisa que o Chrome. O Manifest V3 vai acabar se aplicando de qualquer forma
    • Também existe uma visão crítica defendendo que não se deve usar o navegador 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”

    • Mesmo assim, o Lite é Lite, então as possibilidades são limitadas. Ele não é exatamente um adblocker original, então não é totalmente igual
  • 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

    • Acho que o Firefox não é grande coisa nem como navegador nem como base. É uma pena que o Zen não use Chromium