Toda extensão do Chrome traz um manifest.json, e esse arquivo revela boa parte do teto de capacidades no nível do navegador: APIs solicitadas, padrões de host, scripts de conteúdo estáticos, permissões opcionais e conexões externas permitidas. Trata-se de um arquivo público dentro do pacote que você instala. Ele não prova quais capacidades declaradas o código em execução realmente usa, o que sai da máquina, nem quais acessos a contas acontecem por meio de um login web separado.
Analisei as dez extensões de scraping e automação de navegador selecionadas para este levantamento, incluindo a Thunderbit, que é nossa. A diferença entre elas é grande. Uma não declara acesso permanente a nenhum site. Outra declara treze permissões, incluindo clipboardRead. A Thunderbit é a única extensão deste conjunto que declara debugger, uma capacidade ampla de conexão via CDP com um perfil de risco diferente de acesso à página, OAuth ou scripts fornecidos pelo usuário.
Nada disso é acusação. Uma permissão ampla muitas vezes é a única forma honesta de construir um recurso específico, e uma permissão estreita pode simplesmente significar que o produto faz menos. O ponto é que a diferença é enorme, está publicada e nunca entra numa tabela comparativa.
Como isso foi feito
Cada extensão foi baixada como .crx diretamente do endpoint de atualização do Google — o mesmo URL usado pelo próprio Chrome — e depois descompactada e analisada. Nenhuma extensão foi instalada e nenhum código de extensão foi executado. Isto é uma leitura de um arquivo JSON.
Os downloads foram espaçados em cerca de uma solicitação a cada dois segundos. Cada .crx, seu SHA-256 e o manifest.json extraído foram preservados como artefatos. A Thunderbit passou pelo mesmo script que as outras nove, sem caminho especial, então sua linha foi derivada exatamente da mesma forma.
A análise usa duas classes de evidência e as mantém separadas:
- Comportamento estático declarado: padrões de host e entradas de
content_scripts, incluindomatches,run_ateall_frames. - Capacidade disponível para o código em execução: APIs nomeadas em
permissionsouoptional_permissions. Essas declarações mostram o que o código poderia solicitar ou invocar, não que o faça.
Não é atribuído nenhum ranking ordinal de "mais poderoso". debugger, userScripts, acesso amplo a hosts, escopos OAuth, acesso à área de transferência e mensagens externas expõem tipos diferentes de dados e exigem pré-condições diferentes. Compará-los exige um modelo de ameaça que esta auditoria apenas do manifesto não fornece.
Os tamanhos abaixo são totais descompactados em MiB (2²⁰ bytes), somados a partir das entradas ZIP.
Em 2026-07-29. Extensões são atualizadas; verifique novamente antes de citar.
O que dez manifestos declaram

Referência oficial: guia do Chrome para declaração de permissões.
| Extensão | Versão | Descompactado | Arquivos | Permissões | Acesso a sites | Acessa file:// |
|---|---|---|---|---|---|---|
| Axiom.ai | 5.1.0 | 37,1 MiB | 232 | 8 | http://*/* + https://*/* | ✅ |
| Table Capture | 11.0.41 | 21,1 MiB | 115 | 4 (+3 opcionais) | <all_urls> | ✅ |
| Magical | 3.119.1 | 16,8 MiB | 395 | 13 (+2 opcionais) | <all_urls> | ✅ |
| Thunderbit (ours) | 4.6.4 | 15,9 MiB | 78 | 8 reconhecidas (+1 string não reconhecida em array: commands) | <all_urls> | ✅ |
| Clay for Chrome | 1.0.0 | 6,3 MiB | 51 | 6 | *://*/* (injeta apenas no próprio domínio) | — |
| Listly | 0.9.6 | 3,5 MiB | 84 | 7 | http://*/*, https://*/*, file:///*.html | ✅ |
| Hexomatic | 1.8.4 | 2,7 MiB | 37 | 2 | apenas domínios próprios | — |
| Agenty | 2.9.7 | 2,2 MiB | 49 | 4 | nenhum declarado | — |
| Clip to Clay | 1.8.0 | 0,7 MiB | 16 | 4 | 2 domínios nomeados | — |
| TexAu v2 | 1.6.6 | 0,3 MiB | 12 | 6 | 14 domínios nomeados | — |
Mais duas estavam na lista de candidatas e não aparecem na tabela, por motivos que valem ser reportados separadamente.
A diferença é uma escolha de design, não efeito de tamanho
Agenty não declara permissões de host e não traz nenhum content script. Suas quatro permissões são activeTab, scripting, identity e identity.email. activeTab é a mais restrita: ela concede acesso à aba atual somente depois que você clica na extensão e apenas até navegar para outro lugar. Nada roda nas suas páginas a menos que você acione a extensão. Em 2,2 MiB.
Axiom.ai declara http://*/* e https://*/*, injeta content scripts que correspondem a <all_urls> e se descompacta em 37,1 MiB distribuídos por 232 arquivos — dezessete vezes o tamanho da Agenty, com acesso permanente a todas as páginas que você visita.
A Hexomatic se aproxima da Agenty: duas permissões (storage, tabs), nenhuma permissão de host e scripts de conteúdo restritos aos seus dois próprios domínios.
Clay for Chrome apresenta uma terceira configuração que vale separar: ela declara *://*/* como permissão de host, mas injeta content scripts apenas no próprio domínio. A capacidade permanente é ampla; o comportamento automático é restrito. Uma tabela de permissões sozinha mistura essas coisas.
Cinco das dez podem alcançar arquivos no seu disco
file:/// não é um site. É o seu sistema de arquivos local renderizado numa aba do navegador — um PDF que você abriu, uma exportação HTML, uma fatura baixada.
Referência oficial: documentação de match-pattern do Chrome.
Três extensões dizem isso explicitamente. Duas chegam lá sem nomear o esquema: <all_urls> inclui o esquema file:.
| Extensão | Como alcança file:// | Nomeia file:// no manifesto? | Onde |
|---|---|---|---|
| Magical | corresponde a file:///* — qualquer arquivo local que o Chrome renderize, não só HTML — em quatro de suas seis entradas de content script | ✅ | content scripts e web_accessible_resources |
| Listly | corresponde a file:///*.html | ✅ | content scripts |
| Table Capture | content scripts com <all_urls>, e também nomeia o esquema | ✅ | web_accessible_resources |
| Axiom.ai | apenas por força do curinga <all_urls> | — | em nenhum lugar |
| Thunderbit (ours) | apenas por força do curinga <all_urls> | — | em nenhum lugar |
http://*/* e https://*/* não cobrem file://; <all_urls> e *://*/* também diferem nesse ponto. As cinco aqui são as que, por um caminho ou outro, alcançam esse esquema — não como consequência de terem escolhido uma forma de curinga específica.
O Chrome coloca tudo isso atrás do controle por extensão "Allow access to file URLs", que vem desativado por padrão, então a declaração é um pedido, não uma concessão. Cinco de dez é a contagem honesta, e duas dessas cinco nunca escrevem file:// em lugar nenhum no manifesto: Axiom.ai e a nossa.
Essa contagem inclui web_accessible_resources, não apenas content scripts e permissões de host. A Table Capture nomeia file://*/* ali; omitir esse bloco colocaria indevidamente a extensão entre as que alcançam arquivos sem nomear o esquema.
Permissões que você não vê até serem solicitadas

optional_permissions são declaradas antecipadamente, mas solicitadas em tempo de execução, então não aparecem no prompt de instalação. Duas extensões usam isso, e uma delas é relevante.
| Extensão | optional_permissions | A que importa |
|---|---|---|
| Table Capture | userScripts, downloads, identity | userScripts pode executar scripts fornecidos pelo usuário em contextos da página depois que a barreira de usuário do Chrome é ativada |
| Magical | downloads, webRequest | webRequest observa o tráfego de rede |
userScripts fica ausente até ser solicitado, e é invisível para quem lê uma contagem de permissões.
Ela também tem uma barreira que o restante das permissões desta auditoria não tem, e omiti-la a superestimaria. Declarar userScripts não basta para usá-la: o Chrome exige uma ação explícita do usuário primeiro. Antes do Chrome 138, isso era o Developer Mode, ativado globalmente em chrome://extensions. A partir do Chrome 138, é um controle por extensão Allow User Scripts na própria página de detalhes daquela extensão, desativado por padrão. Então, numa instalação comum, a capacidade é declarada e inerte. A afirmação precisa é condicional: a Table Capture pode disponibilizar a API userScripts depois que o usuário ativa a barreira do Chrome. Esta auditoria não mediu com que frequência os usuários visitam essa página de configurações ou ativam o controle.
Nenhuma das duas está oculta; ambas aparecem no manifesto. Uma tabela que ignora o bloco opcional subestima dois produtos.
Tempo de injeção, não só escopo
O como um content script é injetado recebe pouca atenção e muda o quadro. document_start é o gancho mais cedo que o Chrome oferece; all_frames alcança embeds de terceiros.
Tudo no conjunto que injeta estaticamente em todos os frames, em ordem de tempo declarado:
| Extensão | run_at | all_frames | Padrão de correspondência do content script |
|---|---|---|---|
| Table Capture | document_start | ✅ | <all_urls> |
| Listly | document_start | ✅ | file:///*.html mais todo http e https |
| Axiom.ai | document_start | ✅ | apenas domínios próprios |
| Clay for Chrome | document_start | ✅ | apenas domínios próprios |
| Thunderbit (ours) | document_end | ✅ | <all_urls> |
| Magical | document_idle | ✅ | file:///* mais http e https amplos |
| TexAu | document_idle (não definido) | ✅ | quatorze padrões nomeados |
Table Capture e Listly usam o gancho mais cedo em padrões amplos. Axiom.ai e Clay for Chrome usam o mesmo tempo, mas apenas em seus próprios domínios — mesma agressividade, alvo restrito.
Para declarações estáticas, <all_urls> mais all_frames é o teto de amplitude de correspondência, e tanto Table Capture quanto Thunderbit ficam nesse ponto. O tempo declarado difere: Table Capture usa document_start; o content script estático da Thunderbit usa document_end. APIs em tempo de execução são uma classe separada de capacidade e não podem ser inferidas desta tabela.
Contar permissões é uma métrica ruim de resumo. A Table Capture declara quatro permissões — menos que a maioria aqui — e injeta em document_start em todos os frames sobre <all_urls>, além de userScripts quando solicitado.
Quem está autorizado a se comunicar com a extensão
externally_connectable controla quais páginas web ou outras extensões podem enviar mensagens diretamente para o service worker da extensão. Seu padrão não é intuitivo.
Omitir a chave é a configuração permissiva. O padrão do Chrome quando externally_connectable está ausente é que qualquer extensão pode se conectar, mas nenhuma página web pode. Declarar isso é a forma de restringir.
Lendo assim, a tabela se inverte:
| Extensão | Declaração de externally_connectable | Quem pode enviar mensagens |
|---|---|---|
| Agenty | omitido | Padrão permissivo — qualquer extensão pode se conectar, nenhuma página web pode |
| Clay for Chrome | omitido | Padrão permissivo — qualquer extensão pode se conectar, nenhuma página web pode |
| Clip to Clay | omitido | Padrão permissivo — qualquer extensão pode se conectar, nenhuma página web pode |
| Listly | omitido | Padrão permissivo — qualquer extensão pode se conectar, nenhuma página web pode |
| Table Capture | omitido | Padrão permissivo — qualquer extensão pode se conectar, nenhuma página web pode |
| TexAu | omitido | Padrão permissivo — qualquer extensão pode se conectar, nenhuma página web pode |
| Thunderbit (ours) | omitido | Padrão permissivo — qualquer extensão pode se conectar, nenhuma página web pode |
| Hexomatic | oito IDs de extensão e seis origens web | Abre ambos os canais a partir de uma base fechada |
| Axiom.ai | sete origens web, sem ids | Canal de extensão fechado, sete páginas web abertas |
| Magical | {"ids": [], "matches": []} | A única extensão aqui que fecha explicitamente os dois canais |
A regra do Chrome tem dois níveis. Na referência do manifesto:
| Situação | Quem pode se conectar |
|---|---|
| a chave inteira está ausente | "all extensions can connect, but no web pages can connect" |
chave presente, ids não definido ou [] | "no extensions or apps can connect" |
chave presente, matches não definido ou [] | "no web pages can connect" |
O padrão permissivo se aplica à ausência da chave inteira. Depois que a chave existe, ambos os subcampos começam fechados e nomear valores amplia cada canal.
Axiom.ai declara a chave apenas com matches. Logo, seu ids fica não definido, o que significa que nenhuma extensão pode enviar mensagens para ela — o canal de extensão está fechado, não aberto. O que ela abriu foram sete origens web, das quais apenas uma é um domínio da própria Axiom: duas são terceiros não atribuíveis (*://*.tgwc.space/*, *://*.bitmachine.co.uk/*) e o restante é localhost, 0.0.0.0, um host de Google APIs e uma grande plataforma social em que ela não opera.
Hexomatic abre o canal de extensão para oito IDs nomeados. Com a chave presente, o padrão inicial é zero extensões; nomear oito amplia isso para oito. Seus seis matches ampliam o outro canal a partir de nenhum, e dois deles são http://localhost:8000/* e http://localhost:3000/* via HTTP puro — qualquer coisa respondendo nessas portas na máquina do usuário entra na allowlist.
Sete das dez omitem a chave por completo, inclusive a nossa, e essas sete ficam no padrão permissivo para mensagens entre extensões. Duas extensões fecham esse canal: Magical explicitamente com ids: [], e Axiom.ai ao declarar a chave e nunca mencionar ids. Magical é a única que fecha ambos.
Essa última linha é o motivo para ler manifestos em vez de contar permissões. A mesma extensão pode ser ampla em um eixo e a mais restrita do conjunto em outro.
O eixo que ninguém conta: escopos OAuth
Um manifesto pode carregar um bloco oauth2, e os escopos dentro dele dão acesso às suas contas em outras empresas — um tipo de alcance diferente de tudo acima, e que nenhuma contagem de permissões reflete.
Referência oficial: lista de escopos OAuth 2.0 do Google.
| Extensão | Escopos oauth2 solicitados |
|---|---|
| Axiom.ai | openid, email, profile, auth/drive, auth/spreadsheets |
| Table Capture | auth/spreadsheets, auth/userinfo.email |
| Agenty | openid, email, profile |
| As outras sete, inclusive a nossa | nenhum declarado |
https://www.googleapis.com/auth/drive é o escopo amplo. O Google oferece um escopo mais restrito, drive.file, que concede acesso apenas aos arquivos que o próprio app cria ou que o usuário seleciona explicitamente; auth/drive permite ver, editar, criar e excluir em todo o Drive do usuário. auth/spreadsheets tem a mesma abrangência para todas as planilhas que a conta alcança. Tanto Axiom.ai quanto Table Capture combinam um escopo de conta Google com acesso a páginas em <all_urls>.
Há duas limitações no que essa tabela prova. Um escopo é solicitado, não concedido — o Google exibe uma tela de consentimento e o usuário pode recusar, e a extensão talvez nunca chame a API. Além disso, o manifesto só enxerga OAuth feito pelo fluxo identity do Chrome; uma extensão que o leve para uma página web de autenticação não declararia nada aqui. Os sete zeros significam "não solicitado neste arquivo", e não "sem acesso à sua conta Google" — inclusive no nosso caso, razão pela qual este eixo é reportado, e não reivindicado como estreiteza.
Nossa própria extensão, na mesma escala
A Thunderbit 4.6.4 passou pelo mesmo parser de manifesto que as outras nove. O pacote tem 15,9 MiB descompactados em 78 arquivos.
Comportamento estático declarado: <all_urls> aparece nas permissões de host e nas correspondências de content script. O script estático roda em all_frames em document_end. Como <all_urls> inclui file:, o manifesto pode alcançar arquivos locais depois que o usuário ativa o controle de acesso a arquivos do Chrome. A Thunderbit também omite externally_connectable, então o padrão do Chrome permite mensagens de qualquer extensão, mas de nenhuma página web.
Teto de capacidade em tempo de execução: o array permissions contém nove strings: activeTab, commands, debugger, offscreen, scripting, sidePanel, storage, tabGroups e tabs. O Chrome reconhece oito delas como permissões; commands é uma chave de manifesto de nível superior e não tem efeito como entrada nesse array. A Thunderbit é a única extensão do conjunto que declara debugger, capaz de anexar CDP a uma aba. O manifesto também disponibiliza scripting para registro em tempo de execução. Essas APIs criam capacidades além da linha estática de document_end, mas uma leitura do manifesto não permite concluir que a Thunderbit invoque um método específico de CDP ou registre um script em um momento anterior específico.
Essa distinção bloqueia várias comparações tentadoras, mas inválidas. A ausência de uma permissão mais estreita, como cookies, não limita o que um código com debugger poderia acessar. A ausência de clipboardRead não prova que o acesso à área de transferência seja impossível. Por outro lado, a presença de debugger não é evidência de que esses caminhos sejam usados. Responder a qualquer uma dessas perguntas exige inspeção do código-fonte ou rastreamento em tempo de execução, e nenhum dos dois foi realizado.
Neste instrumento, a Thunderbit é ampla no acesso estático a sites, única neste conjunto por declarar debugger, e segue o padrão do Chrome para mensagens entre extensões. Não existe um único ranking de "mais forte" porque a auditoria não fornece um modelo de ameaça comum para CDP, OAuth, userScripts, área de transferência e acesso a hosts.
O design contido que ninguém vende
TexAu tem 0,3 MiB — a menor aqui por um fator de dois — e nomeia quatorze sites específicos em vez de usar um curinga: redes sociais, uma plataforma para desenvolvedores, plataformas de publicação, um produto de chat, um provedor de dados empresariais e o próprio domínio. Seus content scripts correspondem exatamente aos mesmos quatorze.
Você pode ler esse manifesto e saber com precisão onde a extensão atua. Ele também é uma divulgação do produto — a lista de alvos diz mais claramente para que a ferramenta serve do que o marketing.
A troca é real: uma lista nomeada não consegue raspar um site que não esteja nela, e cada novo alvo exige um novo lançamento. Mas "quatorze domínios nomeados" e "todo URL que existe" são propostas muito diferentes, e só uma delas é legível.
Dois produtos que não eram o que a lista dizia
A extensão da Captain Data não é distribuída publicamente. O endpoint de atualização do Google retorna HTTP 204 com corpo vazio para o ID da extensão dela — a resposta típica de algo que a loja não serve anonimamente. Já a página da listagem foi servida anonimamente — HTTP 200, 509.829 bytes. O que a captura não conseguiu encontrar ali foi uma versão, uma data de última atualização ou uma contagem de instalações; as anotações do próprio script dizem que um nulo ali é evidência fraca, e nenhum bloqueio de login foi observado. O ID é real e de primeira parte, então a leitura mais provável é distribuição apenas por link ou não listada, mas não consegui distinguir isso de uma remoção da loja e não vou chutar.
Dataflow Kit não tem nenhuma extensão do Chrome. O site descreve um app web hospedado, com seleção ponto a ponto e uma API REST. Mesmo assim, ele havia sido incluído numa lista de extensões para Chrome — que é normalmente como essas listas são montadas.
Obsolescência e alcance, já que ambos são fáceis de verificar
Os metadados da loja acrescentam contexto de seleção de produto além das permissões. Os mesmos campos foram capturados para todas as extensões em 2026-07-30.
| Extensão | Versão na loja | Última atualização | Faixa de instalações |
|---|---|---|---|
| Thunderbit (ours) | 4.6.4 | 28 de julho de 2026 | 200.000 |
| Listly | 0.9.6 | 25 de julho de 2026 | 100.000 |
| Axiom.ai | 5.1.0 | 20 de julho de 2026 | 100.000 |
| Table Capture | 11.0.41 | 26 de junho de 2026 | 200.000 |
| Magical | 3.119.1 | 4 de abril de 2026 | 200.000 |
| Agenty | 2.9.7 | 8 de fevereiro de 2026 | 10.000 |
| TexAu | 1.6.6 | 20 de agosto de 2025 | 7.000 |
| Clay for Chrome | 1.0.0 | 9 de abril de 2025 | 10.000 |
| Clip to Clay | 1.8.0 | 8 de abril de 2025 | 1.000 |
| Hexomatic | 1.8.4 | 6 de setembro de 2024 | 3.000 |
| Captain Data | — | — | não servido publicamente |
Três produtos não lançam há mais de um ano, e a Hexomatic há quase dois. Para extensões isso importa mais do que para bibliotecas: o Chrome tem lançamentos estáveis cerca de uma vez a cada quatro semanas, e a própria plataforma de extensões continua mudando sob elas. userScripts mudou sua barreira de usuário no Chrome 138; uma extensão lançada pela última vez em 2024 foi construída sob um conjunto de regras diferente daquele que o navegador agora aplica.
Duas coisas que esta tabela não é. Contagens de instalação são agrupadas pelo Google — 1.000 / 3.000 / 7.000 / 10.000 / 100.000 / 200.000 — portanto servem para comparar ordens de grandeza e nada mais fino, e vários produtos divulgam números maiores em seu próprio marketing. Uma data recente é um fato sobre publicação, não um veredito sobre qualidade de manutenção ou risco de permissão.
Um subproduto útil: a versão da loja corresponde à versão do manifesto em todos os dez pacotes analisados. Os arquivos CRX que esta auditoria analisou são os que a loja está servindo hoje, não cópias antigas.
A frescura altera o quanto uma seleção merece acompanhamento; não altera a semântica do manifesto. Uma extensão de domínio nomeado atualizada há um ano ainda pode expor menos superfície de página do que uma extensão com curinga lançada ontem. O pacote mais novo ainda pode ser a melhor escolha operacional se acompanhar as mudanças do Chrome com rapidez. Para uma shortlist, use a data da loja para decidir o que retestar e, depois, use o manifesto para decidir o que exige uma revisão mais cuidadosa de capacidades. Não transforme as duas colunas numa única pontuação.
O que um manifesto não diz
Uma permissão declarada é um teto, não um comportamento. <all_urls> significa que uma extensão pode ler todas as páginas. Não significa que lê, nem que algo sai da sua máquina. Estabelecer o que realmente acontece exige observar o tráfego de rede em tempo de execução — um trabalho diferente, não feito aqui, e nada acima deve ser lido como evidência de abuso.
Leitura relacionada: experimento de testabilidade de extensão do Chrome.
Três limites adicionais:
- O Chrome impõe barreiras a muita coisa. O acesso a arquivos vem desativado por padrão;
activeTabé deliberadamente restrita; permissões opcionais exigem um prompt em tempo de execução; o usuário vê uma lista de permissões na instalação. - Permissões amplas muitas vezes são necessárias. Uma ferramenta cujo trabalho é "extrair uma tabela de qualquer página em que você esteja" não pode funcionar a partir de uma lista de domínios nomeados. Escopo estreito às vezes é disciplina e às vezes é apenas um produto menor.
- Uma versão, um dia. Todos os números são do pacote servido em 2026-07-29.
Correções materiais na análise
As contagens publicadas usam três regras que são fáceis de errar ao escrever um parser rápido de manifesto. Primeiro, <all_urls> inclui o esquema file:, mas o Chrome mantém o acesso real a arquivos atrás de um controle ativado pelo usuário. Segundo, web_accessible_resources.matches precisa ser examinado junto com content scripts e permissões de host; é ali que a Table Capture nomeia explicitamente file://*/*. Terceiro, externally_connectable tem padrões diferentes dependendo de a chave inteira estar ausente ou existir com um subcampo vazio. As tabelas acima aplicam essas regras de forma consistente.
A contagem de permissões da Thunderbit também distingue strings brutas de permissões reconhecidas pelo Chrome. Seu array tem nove entradas, mas commands pertence ao nível superior, então a contagem efetiva usada aqui é oito permissões reconhecidas mais uma string não reconhecida. Por fim, declarações estáticas de content_scripts não são evidência de que o código chame scripting.registerContentScripts ou um método de CDP. Essas possibilidades aparecem apenas como capacidade em tempo de execução, nunca como comportamento observado. Os manifestos brutos, os hashes CRX e a saída do parser devem ser vinculados em um apêndice da publicação para que os leitores possam auditar essas normalizações sem confiar apenas no texto.
Para uma decisão real de instalação, compare pelo menos quatro dimensões separadamente: quais páginas estão no escopo por padrão, qual ação explícita do usuário libera mais alcance, quais APIs do navegador ou da conta ficam disponíveis e quais chamadores externos podem enviar mensagens para a extensão. O modelo activeTab da Agenty, o userScripts com barreira da Table Capture, o escopo Drive da Axiom.ai e a declaração debugger da Thunderbit não são pontos numa mesma escala linear. São respostas diferentes para perguntas de ameaça diferentes.
Aqui está essa comparação aplicada a quatro designs propositalmente diferentes:
| Extensão | Escopo de página visível no manifesto | Barreira adicional | Capacidade não relacionada à página nesta auditoria | Postura de chamadores externos |
|---|---|---|---|---|
| Agenty | nenhuma permissão de host nem content script estático | usuário aciona activeTab na aba atual | permissões de identidade do Chrome | chave omitida: qualquer extensão pode se conectar, nenhuma página web pode |
| Table Capture | scripts estáticos em <all_urls> em todos os frames em document_start | acesso a arquivos desativado por padrão; userScripts precisa da barreira separada do Chrome | userScripts, downloads e identity opcionais | chave omitida: qualquer extensão pode se conectar, nenhuma página web pode |
| Axiom.ai | acesso amplo a HTTP e HTTPS; scripts estáticos em document_start em seus próprios domínios | consentimento OAuth para os escopos Google solicitados | escopos OAuth de Drive e Sheets declarados | chamadores de extensão fechados; sete origens web abertas |
| Thunderbit | acesso a hosts em <all_urls> e scripts estáticos em todos os frames em document_end | acesso a arquivos desativado por padrão; anexar debugger tem comportamento visível controlado pelo Chrome | debugger, scripting, tabs e APIs relacionadas do navegador declaradas | chave omitida: qualquer extensão pode se conectar, nenhuma página web pode |
Essa tabela ainda não produz um vencedor. O alcance estreito de página da Agenty não diz nada sobre o que o backend dela faz com os dados enviados. Os escopos de conta da Axiom.ai não são comparáveis a uma extensão lendo a página atual. A declaração userScripts da Table Capture fica inerte até o usuário ativar sua barreira separada. A permissão debugger da Thunderbit expõe uma ampla superfície de controle do navegador, mas o manifesto não revela quais domínios ou métodos de CDP o código chama. Cada linha diz o que inspecionar em seguida: tráfego de rede em tempo de execução, código-fonte, fluxo de consentimento ou traces de API do navegador.

A mesma separação importa ao ler o prompt de instalação do Chrome. Uma contagem bruta de permissões não mostra timing, alcance por frame, escopo OAuth, web_accessible_resources ou uma chave externally_connectable omitida. Por outro lado, uma declaração ampla não prova coleta ou exfiltração. O resultado útil de uma auditoria de manifesto é um plano de teste em tempo de execução priorizado: identifique a superfície de dados, observe a barreira do usuário e então verifique se o caminho declarado é de fato usado.
Como ler o seu próprio
Leitura relacionada: guia de automação de navegador.
chrome://extensions→ Details mostra o acesso a sites concedido e permite mudar para on click tudo o que não precisar de acesso permanente. Isso reduz a metade de acesso a sites do que foi mostrado acima. Não altera mensagens de entrada (externally_connectablealcança o service worker independentemente) nem permissões no nível do navegador. A declaraçãodebuggerda Thunderbit é relevante aqui. A documentação de segurança de extensões do próprio Chromium diz que a API debugger "may in some cases also sidestep other typical restrictions, such as host permissions or file access", então definir o acesso ao site como "on click" não limita o que ela pode alcançar. E esse controle também não afetatabs,webNavigation,clipboardRead,downloadsnem nada emoptional_permissions.- Para o arquivo bruto, o pacote fica no diretório
Extensions/<id>/<version>/do Chrome. Leia seis campos:permissions,optional_permissions,host_permissions,content_scripts(osmatches,run_ateall_framesdentro deles),externally_connectable— lembrando que uma chave ausente é permissiva para chamadores de extensão — eweb_accessible_resources, cujosmatchespodem nomear esquemas que os content scripts nunca nomeiam. O último campo da Thunderbit tem duas entradas<all_urls>expondoindex.htmle dois scripts empacotados para qualquer origem, comuse_dynamic_url: false, o que permite a uma página testar se esses URLs estáveis da extensão resolvem. - Verifique a data de última atualização da listagem contra a versão atual do Chrome.
Divulgação e recursos: este artigo é publicado pela Thunderbit, cuja extensão está incluída na mesma tabela e no mesmo parser. Nosso pilar de scrapers open source cobre ferramentas que não são extensões.
Experimente a Thunderbit para extração de dados da web
Resumo curto
Dez extensões de scraping e automação, incluindo a nossa, foram lidas a partir dos seus próprios manifestos.
Agenty não declara acesso a sites nem content scripts, funcionando apenas na aba em que você clica nela, em 2,2 MiB. Axiom.ai declara qualquer URL HTTP e HTTPS em 37,1 MiB. Magical declara treze permissões, incluindo clipboardRead — e também é a única extensão aqui que fecha completamente as mensagens de entrada. Table Capture declara apenas quatro permissões, e injeta em document_start em todos os frames sobre <all_urls> — o mesmo teto de correspondência que a nossa atinge, mas mais cedo — além de userScripts sob solicitação. TexAu é a menor, e nomeia o maior número de alvos — quatorze padrões em treze propriedades distintas. Ela não é a única a nomeá-los: Clip to Clay declara dois (clay.com e um site de terceiros), e Hexomatic e Clay for Chrome nomeiam seus próprios domínios. TexAu é a única cuja lista nomeada é majoritariamente de sites de outras pessoas. Cinco das dez podem alcançar arquivos no seu disco, e duas delas — Axiom.ai e a nossa — sem nunca escrever file://.
A Thunderbit, a nossa, fica na ponta mais ampla: <all_urls> tanto para acesso a host quanto para injeção estática, além de debugger, que nenhuma outra extensão deste conjunto declara. Ela fica no padrão do Chrome que permite mensagens de qualquer extensão e alcança file:// depois que a barreira de acesso a arquivos do Chrome é ativada.
Uma declaração é um teto, não um comportamento, e nada disso mostra abuso. Mas está publicado, é gratuito para verificar, e a diferença entre os dois extremos é maior do que qualquer coisa nas páginas de produto.
Experimente a Thunderbit para extração de dados da web Get Started Free
FAQs
Uma permissão ampla significa que a extensão está fazendo algo errado — e por que não basta contar permissões?
Não, e porque a contagem deixa de fora duas coisas. <all_urls> significa que uma extensão pode ler todas as páginas que você visita; isso não diz nada sobre o que ela faz nem se algo sai da sua máquina, e uma ferramenta criada para extrair dados de qualquer página realmente não pode funcionar a partir de uma lista de domínios nomeados. O achado é a diferença de alcance, não má conduta — estabelecer o comportamento real exige análise de tráfego em tempo de execução, o que esta auditoria não fez. Quanto à contagem: configurações de injeção não são permissões, então a Table Capture declara quatro enquanto injeta em document_start, em all_frames, correspondendo a <all_urls>. E optional_permissions nem aparecem no prompt de instalação — a Table Capture pode solicitar userScripts em tempo de execução, o que permite executar scripts arbitrários fornecidos pelo usuário em contextos da página, e a Magical pode solicitar webRequest.
Qual delas pede menos?
Agenty: quatro permissões, nenhuma permissão de host, nenhum content script. Ela depende de activeTab, que concede acesso à aba atual apenas depois que você clica na extensão e só até navegar para outro lugar. A Hexomatic vem em seguida, com duas permissões e content scripts limitados aos próprios domínios.
Como uma extensão pode alcançar meus arquivos locais sem declarar file://?
Porque <all_urls> inclui o esquema file:. Listly, Magical e Table Capture nomeiam padrões file:// explicitamente — Magical em seus content scripts e Table Capture em web_accessible_resources. Axiom.ai e Thunderbit alcançam isso pelo curinga sem mencionar o esquema em lugar nenhum. http://*/* e https://*/* não cobrem file://. O Chrome mantém o acesso a arquivos desativado por padrão, atrás de um controle por extensão, então a declaração é um pedido, não uma concessão.
O que é externally_connectable, e por que omiti-lo é a opção permissiva?
Ele nomeia as origens web ou IDs de extensão autorizados a enviar mensagens ao service worker de uma extensão. O padrão do Chrome quando a chave está ausente é que qualquer extensão pode se conectar e nenhuma página web pode. Sete dessas dez omitem isso, incluindo a Thunderbit. Com a chave presente, Hexomatic abre o canal de extensão para oito IDs nomeados; Axiom.ai abre sete origens web e mantém o canal de extensão fechado; Magical declara listas vazias para ambos, fechando os dois canais.
O que o próprio manifesto da Thunderbit declara?
<all_urls> para acesso a host e injeção estática de content script, em all_frames em document_end; 15,9 MiB em 78 arquivos; e nove strings no array de permissões. Oito são permissões reconhecidas: activeTab, debugger, offscreen, scripting, sidePanel, storage, tabGroups e tabs. commands é uma chave de manifesto de nível superior e não tem efeito nesse array. Nenhuma outra extensão deste conjunto declara debugger. A Thunderbit também alcança file:// via <all_urls> depois que a barreira de acesso a arquivos do Chrome é ativada, e omite externally_connectable. O comportamento em tempo de execução não foi executado, então a auditoria não afirma quais métodos de CDP ou de scripting a extensão realmente chama.


