Toda extensão do Chrome inclui um manifest.json, e é nele que fica definida boa parte do limite de capacidades no nível do navegador: APIs solicitadas, padrões de host, scripts estáticos de conteúdo, permissões opcionais e conexões externas permitidas. Esse 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 separado na web.
Analisei as dez extensões de raspagem e automação de navegador selecionadas para esta auditoria, incluindo a Thunderbit, que é nossa. O cenário é bem variado. Uma não declara acesso contínuo 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 anexaçã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 restrita pode simplesmente significar um produto mais limitado. O ponto é que a diferença é enorme, ela é pública e nunca aparece numa tabela comparativa.
Como isso foi feito
Cada extensão foi baixada como um .crx pelo próprio endpoint de atualização do Google — a mesma URL usada pelo Chrome — e então descompactada e analisada. Nenhuma extensão foi instalada e nenhum código de extensão foi executado. Trata-se de uma leitura de um arquivo JSON.
Os downloads foram espaçados em cerca de uma requisiçã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 tratamento especial, então sua linha foi derivada exatamente da mesma forma que as demais.
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 ao 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 de fato o faça.
Não foi 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 dados diferentes e exigem pré-condições diferentes. Compará-los exigiria um modelo de ameaça que esta auditoria baseada apenas em manifestos não fornece.
Os tamanhos abaixo são totais descompactados em MiB (2²⁰ bytes), somados a partir das entradas ZIP.
Data de referência: 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 de array não reconhecida: commands) | <all_urls> | ✅ |
| Clay for Chrome | 1.0.0 | 6.3 MiB | 51 | 6 | *://*/* (injeta apenas em seu 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 entraram na tabela, por motivos que merecem análise própria.
A diferença é uma escolha de design, não um efeito de tamanho
Agenty não declara permissões de host e não traz scripts de conteúdo. Suas quatro permissões são activeTab, scripting, identity e identity.email. activeTab é a mais restrita: ela concede acesso à aba atual apenas depois que você clica na extensão e só até navegar para outra página. Nada roda nas suas páginas a menos que você acione. E tudo isso em 2.2 MiB.
Axiom.ai declara http://*/* e https://*/*, injeta scripts de conteúdo que correspondem a <all_urls> e ocupa 37.1 MiB distribuídos em 232 arquivos — dezessete vezes o tamanho da Agenty, com acesso permanente a cada página que você visita.
A Hexomatic se aproxima da Agenty: duas permissões (storage, tabs), sem permissões de host, e scripts de conteúdo restritos a dois domínios próprios.
Clay for Chrome é uma terceira configuração que vale separar: ela declara *://*/* como permissão de host, mas injeta scripts de conteúdo apenas em seu 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 acessar arquivos no seu disco
file:/// não é um site. É o seu sistema de arquivos local renderizado em uma aba do navegador — um PDF que você abriu, uma exportação HTML, uma nota fiscal baixada.
Referência oficial: documentação de match patterns 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 acessa file:// | Nomeia file:// no manifesto? | Onde |
|---|---|---|---|
| Magical | corresponde a file:///* — todo arquivo local que o Chrome renderizar, não apenas HTML — em quatro de suas seis entradas de scripts de conteúdo | ✅ | scripts de conteúdo e web_accessible_resources |
| Listly | corresponde a file:///*.html | ✅ | scripts de conteúdo |
| Table Capture | scripts de conteúdo com <all_urls>, e também nomeia o esquema | ✅ | web_accessible_resources |
| Axiom.ai | apenas por meio do wildcard <all_urls> | — | em lugar nenhum |
| Thunderbit (ours) | apenas por meio do wildcard <all_urls> | — | em lugar nenhum |
http://*/* e https://*/* não cobrem file://; <all_urls> e *://*/* também diferem nisso. As cinco aqui são as que alcançam o esquema por uma via ou outra — não por causa do tipo de wildcard escolhido.
O Chrome coloca tudo isso atrás de uma chave por extensão chamada "Allow access to file URLs", que vem desativada 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 do manifesto: Axiom.ai e a nossa.
Essa contagem inclui web_accessible_resources, e não apenas scripts de conteúdo e permissões de host. A Table Capture nomeia file://*/* ali; omitir esse bloco colocaria erroneamente essa extensão no mesmo grupo de extensões cujos manifestos alcançam arquivos sem nomear o esquema.
Permissões que você só vê quando são 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 esse recurso, 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 de página depois que a barreira do Chrome é ativada |
| Magical | downloads, webRequest | webRequest observa o tráfego de rede |
userScripts fica invisível até ser solicitado, e também invisível para quem apenas lê a contagem de permissões.
Ela também tem uma barreira que as outras permissões desta auditoria não têm, e omitir isso superestimaria seu alcance. Declarar userScripts não basta para usá-la: o Chrome exige primeiro uma ação explícita do usuário. Antes do Chrome 138 isso era o Developer Mode, ativado globalmente em chrome://extensions. A partir do Chrome 138, isso virou uma chave por extensão chamada Allow User Scripts na página de detalhes da própria extensão, desativada por padrão. Então, para uma instalação comum, a capacidade está declarada, mas inativa. A afirmação precisa é condicional: a Table Capture pode tornar a API userScripts disponível depois que o usuário habilita a barreira do Chrome. Esta auditoria não mediu com que frequência os usuários visitam essa página ou ativam a opção.
Nenhuma das duas está oculta; ambas estão no manifesto. Uma tabela que ignora o bloco opcional subestima dois produtos.
Momento de injeção, não apenas escopo
Como um script de conteúdo é injetado também importa, e isso muda bastante a leitura. document_start é o primeiro ponto de execução que o Chrome oferece; all_frames alcança embeds de terceiros.
Tudo no conjunto que injeta estaticamente em todos os frames, ordenado pelo timing declarado:
| Extensão | run_at | all_frames | Padrão de correspondência do script de conteúdo |
|---|---|---|---|
| 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 ponto de execução mais cedo em padrões amplos de correspondência. Axiom.ai e Clay for Chrome usam o mesmo timing, mas apenas em seus próprios domínios — mesma agressividade, alvo restrito.
Para declarações estáticas, <all_urls> + all_frames é o teto de amplitude de correspondência, e tanto Table Capture quanto Thunderbit estão nesse ponto. O timing declarado é diferente: Table Capture usa document_start; o script estático da Thunderbit usa document_end. APIs de runtime são uma classe de capacidade separada e não podem ser inferidas dessa tabela.
Contagem de permissões é uma métrica ruim de resumo. Table Capture declara quatro permissões — menos que a maioria aqui — e injeta em document_start em todos os frames em <all_urls>, além de userScripts quando solicitado.
Quem pode enviar mensagens para a extensão
externally_connectable controla quais páginas da web ou outras extensões podem enviar mensagens diretamente para o service worker da extensão. O comportamento padrão é pouco intuitivo.
Omitir a chave é a configuração permissiva. No Chrome, quando externally_connectable está ausente, qualquer extensão pode conectar, enquanto nenhuma página da web pode. Declarar essa chave é a forma de restringir.
Lendo assim, a tabela se inverte:
| Extensão | Declaração de externally_connectable | Quem pode enviar mensagens |
|---|---|---|
| Agenty | omitida | Padrão permissivo — qualquer extensão pode conectar, nenhuma página da web pode |
| Clay for Chrome | omitida | Padrão permissivo — qualquer extensão pode conectar, nenhuma página da web pode |
| Clip to Clay | omitida | Padrão permissivo — qualquer extensão pode conectar, nenhuma página da web pode |
| Listly | omitida | Padrão permissivo — qualquer extensão pode conectar, nenhuma página da web pode |
| Table Capture | omitida | Padrão permissivo — qualquer extensão pode conectar, nenhuma página da web pode |
| TexAu | omitida | Padrão permissivo — qualquer extensão pode conectar, nenhuma página da web pode |
| Thunderbit (ours) | omitida | Padrão permissivo — qualquer extensão pode conectar, nenhuma página da web pode |
| Hexomatic | oito IDs de extensão e seis origens da web | Abre ambos os canais a partir de uma base fechada |
| Axiom.ai | sete origens da web, sem ids | Canal de extensão fechado, sete páginas da web abertas |
| Magical | {"ids": [], "matches": []} | A única extensão aqui que fecha explicitamente ambos os canais |
A regra do Chrome tem dois níveis. Na referência do manifesto:
| Situação | Quem pode conectar |
|---|---|
| a chave inteira está ausente | "all extensions can connect, but no web pages can connect" |
chave presente, ids indefinido ou [] | "no extensions or apps can connect" |
chave presente, matches indefinido ou [] | "no web pages can connect" |
O padrão permissivo se aplica à ausência da chave inteira. Quando a chave passa a existir, os dois subcampos começam fechados, e os valores nomeados ampliam cada canal.
Axiom.ai declara a chave apenas com matches. Portanto, ids fica indefinido, 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 foi sete origens da web, sendo apenas uma delas de Axiom: duas são terceiros não atribuíveis (*://*.tgwc.space/*, *://*.bitmachine.co.uk/*) e as demais são localhost, 0.0.0.0, um host de Google APIs e uma grande plataforma social com a qual ela não opera.
Hexomatic abre o canal de extensão para oito IDs nomeados. Com a chave presente, a base é 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 comum — qualquer coisa respondendo nessas portas na máquina do usuário entra na allowlist.
Sete das dez omitem a chave por completo, incluindo a nossa, e essas sete são justamente as que ficam no padrão permissivo para mensagens entre extensões. Duas extensões fecham esse canal: Magical explicitamente com ids: [], e Axiom.ai declarando a chave e nunca mencionando ids. Magical é a única que fecha ambos.
Essa última linha é o motivo para ler manifestos em vez de apenas contar permissões. A mesma extensão pode ser ampla em um eixo e a mais rígida do conjunto em outro.
O eixo que ninguém conta: escopos OAuth
Um manifesto pode conter um bloco oauth2, e os escopos ali dentro dão acesso às suas contas em outras empresas — um tipo de alcance diferente de tudo o que foi visto 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, incluindo a nossa | nenhum declarado |
https://www.googleapis.com/auth/drive é o escopo amplo. O Google oferece um escopo mais restrito, drive.file, que dá acesso apenas a arquivos criados pelo próprio app ou escolhidos explicitamente pelo usuário; auth/drive permite ver, editar, criar e excluir tudo no Drive do usuário. auth/spreadsheets segue a mesma lógica para todas as planilhas que a conta consegue alcançar. Tanto Axiom.ai quanto Table Capture combinam um escopo de conta Google com acesso a páginas em <all_urls>.
Há dois limites sobre o que esta tabela prova. Um escopo é solicitado, não concedido — o Google mostra uma tela de consentimento e o usuário pode recusar, e a extensão talvez nunca chame a API. E o manifesto só enxerga OAuth feito pelo fluxo identity do Chrome; uma extensão que, em vez disso, leva você para uma página de login na web não declara nada aqui. Os sete zeros significam "não solicitado neste arquivo", não "sem acesso à sua conta Google" — inclusive no nosso caso, por isso esse eixo é reportado em vez de ser apresentado como um sinal de restrição.
Nossa própria extensão, na mesma escala
A Thunderbit 4.6.4 passou pelo mesmo analisador de manifestos 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 dos scripts de conteúdo. 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 a opção 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 da web.
Teto de capacidade em runtime: 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 no conjunto que declara debugger, que pode anexar CDP a uma aba. O manifesto também expõe scripting para registro em tempo de execução. Essas APIs criam capacidades além da linha estática document_end, mas uma leitura do manifesto não consegue estabelecer 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 cookies mais restrita 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 exigiria inspeção do código-fonte ou rastreamento em runtime, e nada disso foi feito.
Nesse instrumento, a Thunderbit é ampla no acesso estático a sites, única no conjunto por declarar debugger e está no padrão permissivo do Chrome para mensagens entre extensões. Não existe um ranking único 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 — o menor aqui por um fator de dois — e nomeia quatorze sites específicos em vez de usar um wildcard: redes sociais, uma plataforma para desenvolvedores, plataformas de publicação, um produto de chat, um fornecedor de dados de negócios e seu próprio domínio. Seus scripts de conteúdo correspondem exatamente aos mesmos quatorze.
Você pode ler esse manifesto e saber exatamente onde a extensão é ativa. Ele também é uma divulgação do produto — a lista de alvos diz o que a ferramenta faz de maneira muito mais clara do que o marketing.
O trade-off é real: uma lista nomeada não consegue raspar um site que não esteja nela, e cada novo alvo exige um lançamento. Mas "quatorze domínios nomeados" e "cada URL que existe" são propostas bem 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 — a resposta de algo que a loja não serve de forma anônima. Já a página de listagem foi servida anonimamente — HTTP 200, 509.829 bytes. O que a captura não conseguiu encontrar ali foi uma string de versão, uma data de última atualização ou um número de instalações; as próprias anotações do script dizem que um nulo ali é evidência fraca, e nenhuma tela de login foi observada. 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 adivinhar.
A Dataflow Kit não tem nenhuma extensão do Chrome. O site descreve um app web hospedado, com seleção por apontar e clicar e uma API REST. Mesmo assim, ela entrou numa shortlist de extensões do Chrome — que é assim que essas listas normalmente são montadas.
Antiguidade 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 cada extensão 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 servida publicamente |
Três produtos não lançam uma versão há mais de um ano, e a Hexomatic há quase dois. Para extensões isso importa mais do que para bibliotecas: o Chrome lança uma versão estável aproximadamente a cada quatro semanas, e a própria plataforma de extensões continua mudando por baixo delas. userScripts mudou sua barreira de usuário no Chrome 138; uma extensão lançada pela última vez em 2024 foi construída contra um conjunto de regras diferente do navegador que agora as aplica.
Duas coisas que esta tabela não é. As contagens de instalações são faixas agrupadas pelo Google — 1.000 / 3.000 / 7.000 / 10.000 / 100.000 / 200.000 — então elas comparam ordens de grandeza e nada mais fino, e vários produtos anunciam números maiores em seu próprio marketing. Uma data recente é um fato sobre lançamento, não um veredito sobre qualidade de manutenção ou risco de permissão.
Um subproduto útil: a versão da loja coincide com a versão do manifesto em todos os dez pacotes analisados. Os arquivos CRX que esta auditoria leu são os mesmos que a loja está servindo hoje, não cópias antigas.
A atualização influencia o quanto uma seleção merece de checagem posterior; ela não muda a semântica do manifesto. Uma extensão baseada em domínios nomeados e atualizada há um ano ainda pode expor menos superfície de página do que uma extensão wildcard 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 precisa ser reavaliado e depois use o manifesto para decidir o que exige uma revisão mais profunda de capacidades. Não transforme as duas colunas em uma ú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 qualquer página. Isso não quer dizer que ela lê, nem que algo sai da sua máquina. Saber o que realmente acontece exige observar o tráfego de rede em runtime — um trabalho diferente, não realizado aqui, e nada acima deve ser lido como evidência de uso indevido.
Leitura relacionada: experimento sobre testabilidade de extensão do Chrome.
Três limites adicionais:
- O Chrome controla boa parte disso. O acesso a arquivos vem desativado por padrão;
activeTabé deliberadamente restrito; permissões opcionais exigem prompt em runtime; 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ê estiver" não consegue operar a partir de uma lista restrita a domínios nomeados. Escopo estreito às vezes é disciplina, e às vezes é só 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 de manifesto rápido. Primeiro, <all_urls> inclui o esquema file:, mas o Chrome mantém o acesso real a arquivos atrás de uma opção controlada pelo usuário. Segundo, web_accessible_resources.matches deve ser inspecionado junto com scripts de conteúdo 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. O 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 invoque scripting.registerContentScripts ou um método de CDP. Essas possibilidades aparecem apenas no campo de capacidade em runtime, nunca como comportamento observado. Os manifestos brutos, os hashes dos CRX e a saída do parser são o trilho de auditoria dessas normalizações, para que o leitor não precise confiar apenas na prosa.
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 desbloqueia mais alcance, quais APIs do navegador ou da conta ficam disponíveis e quais chamadores externos podem enviar mensagens à extensão. O modelo activeTab da Agenty, o userScripts com barreira da Table Capture, os escopos Drive da Axiom.ai e a declaração debugger da Thunderbit não são pontos em uma escala linear. São respostas diferentes para perguntas diferentes de ameaça.
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 a página nesta auditoria | Postura de chamadores externos |
|---|---|---|---|---|
| Agenty | sem permissão de host ou script de conteúdo estático | o usuário aciona activeTab na aba atual | permissões de identidade do Chrome | chave omitida: qualquer extensão pode conectar, nenhuma página da web pode |
| Table Capture | scripts estáticos em <all_urls> em todos os frames em document_start | acesso a arquivos vem desativado por padrão; userScripts precisa da barreira separada do Chrome | userScripts, downloads e identity opcionais | chave omitida: qualquer extensão pode conectar, nenhuma página da web pode |
| Axiom.ai | acesso wildcard 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 da web abertas |
| Thunderbit | acesso a <all_urls> e scripts estáticos em todos os frames em document_end | acesso a arquivos vem desativado por padrão; anexar debugger tem comportamento visível ao usuário controlado pelo Chrome | debugger, scripting, tabs e APIs relacionadas do navegador declaradas | chave omitida: qualquer extensão pode conectar, nenhuma página da web pode |
Essa tabela ainda não produz um vencedor. O acesso de página contínuo e restrito da Agenty não diz nada sobre o que seu backend 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é que o usuário ative sua barreira separada. A permissão debugger da Thunderbit expõe uma superfície ampla de controle do navegador, mas o manifesto não revela quais domínios ou métodos de CDP o código chama. Cada linha indica o que deve ser inspecionado em seguida: tráfego de rede em runtime, código-fonte, fluxo de consentimento ou rastros de APIs do navegador.

A mesma separação é importante ao ler o prompt de instalação do Chrome. Uma contagem bruta de permissões não mostra timing, alcance em frames, escopo OAuth, web_accessible_resources ou a omissão da chave externally_connectable. Da mesma forma, uma declaração ampla não prova coleta ou exfiltração. O resultado útil de uma auditoria de manifesto é um plano priorizado de testes em runtime: identificar a superfície de dados, anotar a barreira do usuário e então observar se o caminho declarado é realmente exercitado.
Como ler o seu próprio
Leitura relacionada: guia de automação de navegador.
chrome://extensions→ Detalhes mostra o acesso a sites concedido e permite mudar para on click qualquer coisa que não precise de acesso contínuo. Isso restringe a metade do acesso a sites mostrado acima. Isso não afeta mensagens de entrada (externally_connectablealcança o service worker de qualquer forma) 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 "pode em alguns casos também contornar outras restrições típicas, como permissões de host ou acesso a arquivos", então definir o acesso a sites para "on click" não limita o que ela pode alcançar. Nem esse controle afetatabs,webNavigation,clipboardRead,downloadsou qualquer coisa emoptional_permissions.- No 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 dele),externally_connectable— lembrando que uma chave ausente é permissiva para chamadores de extensão — eweb_accessible_resources, cujosmatchespodem nomear esquemas que os scripts de conteúdo 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 que uma página teste se esses URLs estáveis da extensão resolvem. - Verifique a data da última atualização da listagem em relação à 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 sem extensão.
Experimente Thunderbit para extração de dados da web
Resumo curto
Dez extensões de raspagem e automação, incluindo a nossa, foram lidas a partir de seus próprios manifestos.
Agenty não declara acesso a sites nem scripts de conteúdo, trabalhando apenas na aba em que você clica, 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 em <all_urls> — o mesmo teto de alcance que o nosso atinge, só que mais cedo — além de userScripts sob solicitação. TexAu é a menor, e nomeia o maior número de alvos — quatorze padrões distribuídos por treze propriedades distintas. Ela não é a única que os nomeia: 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, está 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 também está 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 uso indevido. 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 Thunderbit para extração de dados da web Get Started Free
Perguntas frequentes
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 passar duas coisas. <all_urls> significa que uma extensão pode ler todas as páginas que você visita; isso não diz o que ela faz nem se algo sai da sua máquina, e uma ferramenta construída para extrair dados de qualquer página realmente não consegue funcionar a partir de uma lista de domínios nomeados. O que se encontrou foi a amplitude, não conduta indevida — para estabelecer o comportamento real é preciso analisar o tráfego em runtime, e esta auditoria não fez isso. 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 não aparecem no prompt de instalação — a Table Capture pode solicitar userScripts em runtime, o que permite executar scripts arbitrários do usuário em contextos de página, e a Magical pode solicitar webRequest.
Qual destas pede menos?
Agenty: quatro permissões, sem permissões de host, sem scripts de conteúdo. Ela depende de activeTab, que concede acesso à aba atual apenas depois que você clica na extensão e só até navegar para outra página. A Hexomatic vem em seguida, com duas permissões e scripts de conteúdo limitados aos seus 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 scripts de conteúdo e Table Capture em web_accessible_resources. Axiom.ai e Thunderbit alcançam isso pelo wildcard 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 uma chave 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 da 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 conectar e nenhuma página da web pode. Sete dessas dez omitem isso, incluindo a Thunderbit. Com a chave presente, a Hexomatic abre o canal de extensão para oito IDs nomeados; a Axiom.ai abre sete origens da web e deixa o canal de extensão fechado; a Magical declara listas vazias para ambos, fechando os dois canais.
O que o manifesto da Thunderbit declara?
<all_urls> para acesso a hosts e injeção estática de scripts de conteúdo, 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:// por meio de <all_urls> depois que a barreira de acesso a arquivos do Chrome é ativada, e omite externally_connectable. O comportamento em runtime não foi executado, então a auditoria não afirma quais métodos de CDP ou scripting a extensão realmente chama.


