2 pontos por GN⁺ 2024-03-07 | 1 comentários | Compartilhar no WhatsApp
  • Under New Management é uma extensão que verifica periodicamente se as informações do desenvolvedor das extensões de navegador instaladas mudaram na Chrome Web Store ou no Firefox Add-ons
  • Quando as informações do desenvolvedor mudam, ela exibe um selo vermelho no ícone da extensão para que o usuário saiba da mudança de propriedade
  • A necessidade vem do problema de desenvolvedores de extensões receberem ofertas de aquisição com frequência, e de que, na imensa maioria dos casos, o comprador pretende abusar dos usuários existentes
  • O usuário pode não saber que a propriedade de uma extensão instalada mudou e que ela pode ter sido comprometida, então a ferramenta oferece uma oportunidade para avaliar a situação
  • Como o navegador impõe restrições à modificação de domínios de marketplaces de extensões, a verificação das informações do desenvolvedor é delegada ao servidor da API ExBoost

Detecção de mudança de propriedade de extensões

  • Under New Management verifica ocasionalmente se as informações do desenvolvedor das extensões instaladas foram alteradas nas lojas Chrome Web Store ou Firefox Add-ons
  • Se houver mudanças, um selo vermelho aparece no ícone da extensão, permitindo que o usuário perceba a mudança de propriedade
  • O objetivo é dar ao usuário a oportunidade de fazer um julgamento informado sobre o software que usa

Por que isso é necessário

  • Desenvolvedores de extensões recebem continuamente ofertas para comprar suas extensões
  • O README afirma que, em quase todos os casos, o comprador tem o objetivo de enganar os usuários existentes
  • O usuário pode não saber que a propriedade de uma extensão instalada mudou e que, agora, ela pode ter sido comprometida

Como instalar

Build a partir do código-fonte

  • Under New Management usa Plasmo
  • pnpm install: instala as dependências
  • pnpm dev: executa localmente
  • pnpm build --zip: gera o build de release
  • pnpm build --target=firefox-mv3: gera o build para Firefox

Por que um servidor externo é necessário

  • O navegador tem regras especiais para modificar domínios de marketplaces de extensões
  • Por exemplo, não é possível configurar regras declarative_net_request para chromewebstore.google.com
  • Por isso, a verificação das informações do desenvolvedor é delegada ao servidor da API ExBoost

1 comentários

 
GN⁺ 2024-03-07
Opiniões no Hacker News
  • O ID de uma extensão é derivado da chave privada enviada junto quando o desenvolvedor a publica pela primeira vez na app store; se um ZIP enviado depois contiver um key.pem diferente, o ID muda.
    Porém, se não houver key.pem, o ID da extensão é mantido. Então, se o ID mudar, é possível que o proprietário tenha mudado, mas o proprietário original também pode ter passado a chave privada para o novo proprietário. Como o Google não exige a chave privada a cada upload, o novo proprietário pode distribuir alterações mesmo sem essa chave.
    O ecossistema de extensões é interessante, então também estou criando ferramentas nessa área. Quero criar um repositório no GitHub para uma extensão específica, registrar cada atualização como uma alteração no repositório e então executar um analisador estático e uma análise dinâmica de taint para rastrear se entradas do usuário fluem para sinks perigosos como eval ou postMessage: https://github.com/milesrichardson/crxmon

    • Um tempo atrás, uma extensão minha para Opera chegou à primeira página e ficou popular, e alguém se ofereceu para comprá-la por uma quantia bem alta.
      Durante a negociação, eu disse que tiraria a extensão do ar e entregaria todo o código-fonte para que a pessoa a distribuísse por conta própria, mas ela esperava que eu entregasse também as credenciais da conta de extensões do Opera. No fim, desisti do negócio; e concordo que ferramentas assim são úteis até certo ponto, mas um scanner de malware para extensões seria melhor.
    • Isso não é como funciona uma infraestrutura de chave pública (PKI). Tenho dúvidas de que extensões do Chrome realmente façam você enviar a chave privada como um arquivo PEM.
      O desenvolvedor deveria assinar a extensão ou o manifesto com a chave privada, e compartilhar a chave pública ou incluí-la no upload. As atualizações também deveriam continuar sendo assinadas com a mesma chave privada e, enquanto a chave não mudar, seria possível verificar, pela chave pública do primeiro upload, que a mesma chave privada foi usada. Se a chave pública é incluída nos uploads posteriores não é algo essencial. Se você vender ou compartilhar a chave privada, outra pessoa pode criar atualizações assinadas legitimamente, mas esse é um risco decorrente de o signatário não manter a chave privada em segredo. Se o Google, ou qualquer um, compartilha a chave privada, a garantia de origem da extensão desmorona.
    • Se o ID da extensão mudar, seria preciso instalar explicitamente a nova versão, e ela não seria atualizada automaticamente.
      Mas fico me perguntando se é realmente possível o Google permitir que um novo proprietário distribua alterações sem a chave privada. A Chrome Web Store é extremamente exigente até com coisas triviais, então é estranho que não se preocupe com isso.
      Uso 3 extensões publicadas apenas para testadores e as uso para instalá-las facilmente em várias máquinas, sem modo de desenvolvedor nem rsync/robocopy. Mas neste fim de semana o Chrome desativou todas elas em apenas uma máquina, dizendo que “não estão listadas na Chrome Web Store e podem ter sido adicionadas sem o conhecimento do usuário”. Nem dá para reativá-las à força; na loja, elas aparecem como “desativadas” e mostram “ativar agora”, mas só o banner desaparece e volta quando atualizo a página. Esse perfil do Chrome está conectado com uma conta na lista de permissões.
      O selo da página da Chrome Web Store mostra que minha conta de desenvolvedor não tem punições e está em bom estado. Se eu não estivesse conectado com o e-mail da lista de permissões, nem conseguiria ver essa página. Não faz sentido que eles “se preocupem tanto” com isso e, ao mesmo tempo, permitam atualizações sem chave.
    • O método descrito é possível, mas não é a forma obrigatória nem a forma comum de gerar o ID de uma extensão. Normalmente, o desenvolvedor envia apenas o arquivo ZIP na primeira submissão, e a Chrome Web Store gera e armazena a chave privada que será usada para assinar a distribuição pública.
      A CWS nunca deve alterar o ID de uma extensão existente, porque o ID identifica a extensão de forma única. Se o ID mudar, o cliente Chrome não consegue solicitar atualizações para aquela extensão, e a CWS e o Chrome não oferecem um recurso para migrar usuários de uma extensão para outra.
      Até onde sei, depois da primeira submissão, a CWS recusaria um ZIP que contivesse key.pem. Se o ID da extensão mudou, então não é a mesma extensão. É basicamente correto dizer que um novo proprietário pode distribuir alterações mesmo sem o PEM, mas, se o desenvolvedor assinou diretamente a extensão enviada à CWS, não é possível atualizá-la sem o PEM. Sinceramente, nem sei se esse recurso ainda existe; no passado, era uma armadilha enorme, em que desenvolvedores perdiam a chave privada usada no upload e acabavam perdendo toda a base instalada.
    • Se alguém comprar uma extensão com intenções malignas, também vai querer a chave privada.
      Quase todo mundo acabaria concordando se o preço fosse certo; a diferença entre as pessoas é apenas quanto elas precisariam receber.
  • Alguns meses atrás, criei uma extensão gratuita e open source que pula rapidamente anúncios do YouTube, compartilhei aqui e ela chegou à primeira página.
    Em menos de uma semana, uma pessoa que havia comentado no meu post Show HN copiou a extensão e promoveu a própria versão no Reddit; ela viralizou e passou de 300 mil usuários: https://github.com/rkk3/ad-accelerator/blob/main/lessons_pos...
    Fiquei me perguntando por que a pessoa copiou em vez de enviar um PR para uma extensão gratuita e open source, mas algumas semanas depois ela estava tentando vendê-la em vários sites por um valor de cinco dígitos. Talvez ainda seja dona dela, mas também chamou a atenção que o desenvolvedor listado na Chrome Store mudou em relação ao lançamento inicial.

    • Ao ver também o outro lado da história, o contexto muda um pouco: https://news.ycombinator.com/item?id=38463233
      Não entendi todo o pano de fundo, mas essa extensão é, na prática, um JavaScript trivial de 50 linhas. Dizer que alguém a roubou é uma afirmação bem forte. A ideia em si não tem valor, e também é difícil alegar que ela seja muito nova. Mesmo supondo que a outra pessoa tenha se inspirado, a cronologia de quem fez o quê primeiro não é tão clara assim.
    • Você disse que “da próxima vez vai fazer uma divulgação mais agressiva”, mas me parece que ainda dá para fazer isso agora. A extensão ainda existe, então ainda é possível promovê-la.
      Só que por quanto tempo o YouTube e o Chrome vão deixá-la funcionando é outra questão, e talvez eles também não gostem disso.
    • Espero que o resultado termine bem, mas, se não, a postura de Jeff Tweedy talvez ajude.
      “…se o mundo inteiro está cantando suas músicas / e todos os seus quadros foram pendurados / lembre-se de que o que era seu agora é de todos / isso não é certo nem errado / mas você pode se apegar a isso o quanto quiser / só que só você vai ficar ansioso…” — “What Light”, do Wilco
    • Fico curioso por que você nunca escreve o handle do usuário do HN em texto e só o coloca em imagens. Não sei qual modelo de ameaça você está imaginando ao dizer claramente, neste comentário ou no post do blog, o nome do usuário que copiou.
    • Isso parece o tipo de coisa que se chama de ter sido “zuckered”.
  • É realmente útil, mas, como outra pessoa disse, isso deveria ser um recurso embutido no navegador.
    Ainda não olhei o código-fonte a fundo, mas fico me perguntando se ele avisa automaticamente quando há mudança de propriedade. Não precisa ser em tempo real, mas ele avisa ao iniciar, ou é preciso executar manualmente um comando de verificação?
    Esse assunto também virou tema de discussão alguns meses atrás: https://news.ycombinator.com/item?id=36233068
    Como no comentário no topo na época, Firefox e Chrome fariam bem em mudar a política de atualização automática de extensões nessas situações. Se a extensão divulgar a mudança de propriedade, a atualização deveria exigir aprovação do usuário; se não divulgar, o usuário deveria poder denunciá-la como maliciosa. Além disso, acho que o título provavelmente deveria ter “Show HN”.

    • Sou o criador. A verificação é executada automaticamente a cada hora e, quando uma mudança é detectada, um badge aparece sobre o ícone da extensão.
      Considerei que uma notificação mais forte do que isso seria invasiva demais.
    • Colocar uma lombada em que usuários precisem aprovar explicitamente a atualização por causa de uma mudança de propriedade da empresa fará com que uma porcentagem significativa deles abandone o produto.
      Isso reduz o valor do produto ou da empresa numa venda. É amigável ao usuário, mas pouco amigável ao criador que precisa pagar as contas.
  • Isso não é motivo de piada.
    Fui dono por alguns anos de uma extensão open source do Chrome bastante popular, e o total de doações não pagava nem o café de um mês.
    Mas as ofertas para comprar a extensão, muitas vezes com objetivos claramente maliciosos e até declarados de forma explícita, eram numerosas e os valores eram absurdos. Recusei todas, mas esperar que, numa situação dessas, a moralidade do desenvolvedor original seja o único sistema de segurança e privacidade não é uma avaliação sensata.

    • Os realmente maliciosos não serão detectados pela ferramenta do artigo. Isso porque eles exigem não só a propriedade da extensão e o código, mas também a transferência da conta de desenvolvedor.
  • Eu concordo bastante com o objetivo e entendo as limitações técnicas, mas é meio suspeito enviar a lista de todas as extensões do usuário para uma rede de publicidade centrada em extensões.
    A justificativa para precisar de um servidor externo é que o navegador aplica regras especiais a modificações em domínios de marketplace de extensões, como chromewebstore.google.com, então a verificação das informações do desenvolvedor é delegada ao servidor de API da ExBoost.
    https://www.extensionboost.com/
    A ExBoost se descreve como uma rede colaborativa de extensões de navegador que querem mais usuários e avaliações. O funcionamento é inserir um slot da ExBoost na UI da extensão e exibir promoções de extensões semelhantes ou pedidos de avaliação.

    • Bem observado. Cavando um pouco, por enquanto ela não envia metadados ligados ao navegador, apenas uma lista de IDs de extensões separada por vírgulas. Claro que o IP pode ser usado facilmente.
      Ao ver o resultado da API para uma das extensões instaladas, aparecem metadados relacionados ao desenvolvedor. Tentei usar a API do Chrome chrome.management.get(id), mas ela não retornou essas informações, e também não parece haver uma forma programática de obter o conteúdo do manifest.json. Portanto, para fazer o que a extensão atual quer fazer, uma fonte externa de fato é necessária.
      https://github.com/classvsoftware/under-new-management/blob/...
      https://api.extensionboost.com/v1/developer?extension_ids=gh...
    • A ExBoost também parece ser um projeto do autor do post original. Interpretando de boa-fé, parece que ele usou esse servidor de API porque já tinha os dados necessários para raspar metadados, como o proprietário, a partir de um ID de extensão.
    • Por diversão, já criei algumas extensões pequenas e, algumas semanas atrás, recebi um e-mail da ExBoost com o título “Collaboration To Grow Our Extensions”.
      A mensagem pedia para eu colocar o código deles na minha extensão e dizia: “se você mostrar a minha, eu mostro a sua. Custo zero, todo mundo ganha”. Pareceu suspeito, marquei como spam e não parecia diferente de outros spams que eu recebia de golpistas.
    • É uma conexão inesperada nesse tipo de projeto. Surpreendente.
    • Não entendo por que precisa se conectar a um serviço externo. Eu achava que, quando o proprietário mudava, o ID da extensão mudava também, então não bastaria rastrear os IDs localmente e avisar quando aparecesse um novo ID? Talvez eu esteja entendendo algo errado.
  • Para extensões do Firefox, existe o programa de extensões recomendadas da Mozilla, e a documentação diz que, antes de serem incluídas, elas passam por uma rigorosa revisão técnica feita por especialistas de segurança da equipe: https://support.mozilla.org/en-US/kb/recommended-extensions-...
    Porém, só pelo documento de suporte, não fica claro se todas as atualizações são revisadas antes da publicação. Se forem revisadas sempre, isso resolveria em certa medida esse problema para extensões populares, mas também fico curioso para saber quanto atraso isso causaria quando fosse necessária uma atualização de segurança urgente.

    • Todas as atualizações são revisadas. Até extensões muito populares, como o uBlock Origin, ficam bloqueadas de vez em quando.
      Pela minha política pessoal atual, só permito que essas extensões curadas sejam executadas em todos os sites e abas.
    • Parece que você está dizendo que seria bom ter um “marketplace” um tanto trabalhoso, com regras e fiscalização.
      Uma estrutura em que, por mais popular que seja uma organização, ou por mais conhecida, ela possa ser banida se violar regras repetidamente ou tentar contornar as funcionalidades do marketplace.
  • Em casos realmente maliciosos, quando uma extensão é transferida, muitas vezes o que se vende são as próprias credenciais da conta de desenvolvedor do Google, então isso não seria detectado.

    • Vender a conta de desenvolvedor inteira é permitido, para começo de conversa?
  • Instalei o adblock muito tempo atrás e gostava muito dele.
    Comprei uma máquina nova e precisei reinstalá-lo; foi a primeira vez que olhei as permissões e fiquei assustado. Faz sentido, logicamente, que para bloquear anúncios ele precise ver o que eu vejo, mas eu nunca tinha pensado nisso a sério.
    Hoje uso Pi-hole e não uso nenhuma extensão.

    • O Pi-hole não bloqueia anúncios e rastreadores com a mesma eficácia que o uBlock Origin.
      Ainda assim, é bom que existam opções para quem quiser, e cada pessoa tem um perfil de risco e preocupações diferentes.
    • Um dos motivos das mudanças de permissão que vêm com o Manifest V3 é justamente reduzir o alcance do que uma extensão pode acessar.
      Algumas extensões são open source e confiáveis, mas muitas não são, e as pessoas parecem ter dificuldade para verificar isso.
    • O Safari tem uma interface especial que permite que bloqueadores de conteúdo funcionem sem nenhuma permissão.
      Você fornece a lista de bloqueio e o próprio navegador faz o bloqueio. Não sei se isso é possível no Firefox: https://developer.apple.com/documentation/safariservices/cre...
    • Fico curioso sobre qual extensão de adblock está sendo mencionada aqui. Por exemplo, o uBlock usa listas de bloqueio locais.
    • E no mobile, como faz?
  • Se eu fosse um comprador de extensões maliciosas, não bastaria manter o nome do desenvolvedor para evitar isso? Ou a Chrome Extension Store controla rigorosamente o nome do desenvolvedor?

    • É difícil impedir de forma prática que um criador de extensão desonesto entregue a senha informalmente e depois diga “opa, fui hackeado” para dar uma saída ao comprador suspeito.
      Por exemplo, um agente estatal malicioso poderia oferecer dezenas de milhões de dólares ao autor do uBlock para obter acesso a muitos navegadores. Não sei como ficaria a viabilidade econômica, mas extensões mais de nicho poderiam ser alvo por valores muito menores.
    • Provavelmente seria uma violação dos Termos de Serviço da Chrome Web Store.
  • Fico me perguntando se esse problema é pior no Chrome do que em outros navegadores
    A única extensão de navegador que uso é o HonorLock, um software de supervisão de provas, e sou obrigado a usá-la. Como a extensão é exclusiva do Chrome, às vezes uso o Chrome por causa do HonorLock. Se eu abro o link de instalação no Safari, ele diz para instalar o Chrome: https://app.honorlock.com/install/extension
    Fico me perguntando se há alguma característica exclusiva das extensões do Chrome que permita o caso de uso do HonorLock e, ao mesmo tempo, torne a ferramenta deste artigo mais útil

    • O Chrome é apenas o vetor de ataque por extensões escolhido por ser o navegador mais popular
    • Se você só usa o HonorLock, não sei como consegue viver sem AdBlock