Cada extensión de Chrome incluye un manifest.json que define una parte importante de su techo de capacidades a nivel de navegador: APIs solicitadas, patrones de host, scripts de contenido estáticos, permisos opcionales y conexiones externas permitidas. Es un archivo público dentro del paquete que instalas. No demuestra qué capacidades declaradas usa realmente el código en ejecución, qué datos salen del equipo o qué accesos a cuentas se producen a través de un inicio de sesión web aparte.
Leí las diez extensiones de scraping y automatización de navegador seleccionadas para esta auditoría, incluida la de Thunderbit, que es la nuestra. El abanico es amplio. Una no declara acceso persistente a sitios. Otra declara trece permisos, incluido clipboardRead. Thunderbit es la única extensión de este conjunto que declara debugger, una capacidad amplia de conexión a CDP con un perfil de riesgo distinto al acceso a páginas, OAuth o scripts aportados por el usuario.
Nada de eso es una acusación. Un permiso amplio suele ser la única forma honesta de construir una función concreta, y uno limitado puede significar simplemente que el producto hace menos. El punto es que la diferencia es enorme, está publicada y nunca aparece en una tabla comparativa.
Cómo se hizo
Cada extensión se descargó como .crx desde el propio endpoint de actualización de Google —la misma URL que usa Chrome— y luego se descomprimió y analizó. No se instaló ninguna extensión ni se ejecutó ningún código de extensión. Esto es una lectura de un archivo JSON.
Las descargas se espaciaron en aproximadamente una petición cada dos segundos. Cada .crx, su SHA-256 y el manifest.json extraído se conservan como evidencias. Thunderbit pasó por el mismo script que las otras nueve, no por una vía aparte, así que su fila se deriva exactamente igual que las demás.
El análisis usa dos clases de evidencia y las mantiene separadas:
- Comportamiento estático declarado: patrones de host y entradas de
content_scripts, incluidosmatches,run_atyall_frames. - Capacidad disponible para el código en tiempo de ejecución: APIs nombradas en
permissionsooptional_permissions. Estas declaraciones muestran qué podría solicitar o invocar el código, no que lo haga.
No se asigna una puntuación ordinal de "más potente". debugger, userScripts, acceso amplio a hosts, ámbitos OAuth, acceso al portapapeles y mensajería externa exponen datos distintos y requieren condiciones previas diferentes. Compararlos exige un modelo de amenaza que esta auditoría basada solo en el manifiesto no proporciona.
Los tamaños de abajo son totales descomprimidos en MiB (2²⁰ bytes), sumados a partir de las entradas ZIP.
A fecha de 2026-07-29. Las extensiones se actualizan; vuelve a comprobarlo antes de citar.
Qué declaran diez manifiestos

Referencia oficial: guía de declaración de permisos de Chrome.
| Extension | Version | Unpacked | Files | Permissions | Site access | Reaches file:// |
|---|---|---|---|---|---|---|
| Axiom.ai | 5.1.0 | 37.1 MiB | 232 | 8 | http://*/* + https://*/* | ✅ |
| Table Capture | 11.0.41 | 21.1 MiB | 115 | 4 (+3 optional) | <all_urls> | ✅ |
| Magical | 3.119.1 | 16.8 MiB | 395 | 13 (+2 optional) | <all_urls> | ✅ |
| Thunderbit (ours) | 4.6.4 | 15.9 MiB | 78 | 8 recognized (+1 unrecognized array string: commands) | <all_urls> | ✅ |
| Clay for Chrome | 1.0.0 | 6.3 MiB | 51 | 6 | *://*/* (injects only on own domain) | — |
| Listly | 0.9.6 | 3.5 MiB | 84 | 7 | http://*/*, https://*/*, file:///*.html | ✅ |
| Hexomatic | 1.8.4 | 2.7 MiB | 37 | 2 | own domains only | — |
| Agenty | 2.9.7 | 2.2 MiB | 49 | 4 | none declared | — |
| Clip to Clay | 1.8.0 | 0.7 MiB | 16 | 4 | 2 named domains | — |
| TexAu v2 | 1.6.6 | 0.3 MiB | 12 | 6 | 14 named domains | — |
Dos más estaban en la lista de candidatos y no aparecen en la tabla, por razones que merecen comentarse por separado.
La diferencia es una decisión de diseño, no un efecto del tamaño
Agenty no declara permisos de host y no incluye ningún content script. Sus cuatro permisos son activeTab, scripting, identity e identity.email. activeTab es el más limitado: concede acceso a la pestaña actual solo después de hacer clic en la extensión y únicamente hasta que navegues a otra página. Nada se ejecuta en tus páginas salvo que lo invoques. Y ocupa 2.2 MiB.
Axiom.ai declara http://*/* y https://*/*, inyecta content scripts que coinciden con <all_urls> y se descomprime hasta 37.1 MiB repartidos en 232 archivos: diecisiete veces el tamaño de Agenty, con acceso persistente a todas las páginas que visitas.
Hexomatic se parece más a Agenty: dos permisos (storage, tabs), sin permisos de host y con content scripts restringidos a sus dos propios dominios.
Clay for Chrome es una tercera forma que conviene separar: declara *://*/* como permiso de host, pero solo inyecta content scripts en su propio dominio. La capacidad persistente es amplia; el comportamiento automático, limitado. Una tabla de permisos sola mezcla ambas cosas.
Cinco de las diez pueden llegar a archivos de tu disco
file:/// no es un sitio web. Es tu sistema de archivos local renderizado en una pestaña del navegador: un PDF que abriste, una exportación HTML, una factura descargada.
Referencia oficial: documentación de patrones de coincidencia de Chrome.
Tres extensiones lo dicen explícitamente. Dos llegan sin nombrarlo: <all_urls> incluye el esquema file:.
| Extension | How it reaches file:// | Names file:// in its manifest? | Where |
|---|---|---|---|
| Magical | matches file:///* — every local file Chrome will render, not just HTML — in four of its six content-script entries | ✅ | content scripts, and web_accessible_resources |
| Listly | matches file:///*.html | ✅ | content scripts |
| Table Capture | <all_urls> content scripts, and it also names the scheme | ✅ | web_accessible_resources |
| Axiom.ai | purely by virtue of the <all_urls> wildcard | — | nowhere |
| Thunderbit (ours) | purely by virtue of the <all_urls> wildcard | — | nowhere |
http://*/* y https://*/* no cubren file://; <all_urls> y *://*/* también difieren en esto. Las cinco de aquí son las que alcanzan el esquema por una vía u otra, no como consecuencia de la forma de comodín que eligieron.
Chrome bloquea todo esto con un interruptor por extensión de "Permitir acceso a URLs de archivo" que está desactivado por defecto, así que la declaración es una solicitud, no una concesión. Cinco de diez es el conteo honesto, y dos de esas cinco nunca escriben file:// en su manifiesto: Axiom.ai y la nuestra.
Este conteo incluye web_accessible_resources, no solo content scripts y permisos de host. Table Capture nombra file://*/* ahí; omitir ese bloque lo colocaría erróneamente junto a extensiones cuyos manifiestos alcanzan archivos sin nombrar el esquema.
Permisos que no ves hasta que se solicitan

optional_permissions se declaran por adelantado, pero se solicitan en tiempo de ejecución, así que no aparecen en el aviso de instalación. Dos extensiones los usan, y uno de ellos es importante.
| Extension | optional_permissions | The one that matters |
|---|---|---|
| Table Capture | userScripts, downloads, identity | userScripts can run user-supplied scripts in page contexts after Chrome's user gate is enabled |
| Magical | downloads, webRequest | webRequest observes network traffic |
userScripts no está disponible hasta que se solicita, y es invisible para cualquiera que lea solo un recuento de permisos.
Además tiene una barrera que el resto de permisos de esta auditoría no tienen, y omitirla lo exageraría. Declarar userScripts no basta para usarlo: Chrome exige antes una acción explícita del usuario. Antes de Chrome 138 eso era el Developer Mode, activado globalmente en chrome://extensions. Desde Chrome 138 es un interruptor Allow User Scripts por extensión en la propia página de detalles de esa extensión, desactivado por defecto. Así que, para una instalación normal, la capacidad está declarada pero inerte. La afirmación precisa es condicional: Table Capture puede hacer que la API userScripts esté disponible después de que el usuario habilite la barrera de Chrome. Esta auditoría no midió cuántos usuarios visitan esa página de ajustes o activan el interruptor.
Ninguno está oculto; ambos figuran en el manifiesto. Una tabla que ignore el bloque opcional infravalora dos productos.
Tiempo de inyección, no solo alcance
Cómo se inyecta un content script no recibe atención y cambia el panorama. document_start es el enganche más temprano que ofrece Chrome; all_frames alcanza los embebidos de terceros.
Todo lo que en el conjunto se inyecta estáticamente en todos los marcos, ordenado por el tiempo declarado:
| Extension | run_at | all_frames | Content-script match pattern |
|---|---|---|---|
| Table Capture | document_start | ✅ | <all_urls> |
| Listly | document_start | ✅ | file:///*.html plus all of http and https |
| Axiom.ai | document_start | ✅ | own domains only |
| Clay for Chrome | document_start | ✅ | own domains only |
| Thunderbit (ours) | document_end | ✅ | <all_urls> |
| Magical | document_idle | ✅ | file:///* plus broad http and https |
| TexAu | document_idle (unset) | ✅ | fourteen named patterns |
Table Capture y Listly usan el enganche más temprano con patrones amplios. Axiom.ai y Clay for Chrome usan el mismo momento, pero solo en sus propios dominios: misma agresividad, objetivo estrecho.
Para las declaraciones estáticas, <all_urls> más all_frames es el techo de amplitud de coincidencia, y tanto Table Capture como Thunderbit están ahí. Su tiempo declarado difiere: Table Capture usa document_start; el content script estático de Thunderbit usa document_end. Las APIs en tiempo de ejecución son otra clase de capacidad y no pueden inferirse de esta tabla.
Un recuento de permisos es una mala estadística resumida. Table Capture declara cuatro permisos —menos que la mayoría aquí— y, aun así, inyecta en document_start en todos los marcos sobre <all_urls>, además de userScripts bajo solicitud.
Quién puede escribirle a la extensión
externally_connectable controla qué páginas web u otras extensiones pueden enviar mensajes directamente al script en segundo plano de una extensión. Su valor por defecto es contraintuitivo.
Omitir la clave es la opción permisiva. El valor predeterminado de Chrome cuando externally_connectable no está presente es que cualquier extensión puede conectarse, mientras que ninguna página web puede hacerlo. Declararlo es la forma de restringir.
Con esa lectura, la tabla se invierte:
| Extension | externally_connectable declaration | Who can message it |
|---|---|---|
| Agenty | omitted | Permissive default — any extension may connect, no web page may |
| Clay for Chrome | omitted | Permissive default — any extension may connect, no web page may |
| Clip to Clay | omitted | Permissive default — any extension may connect, no web page may |
| Listly | omitted | Permissive default — any extension may connect, no web page may |
| Table Capture | omitted | Permissive default — any extension may connect, no web page may |
| TexAu | omitted | Permissive default — any extension may connect, no web page may |
| Thunderbit (ours) | omitted | Permissive default — any extension may connect, no web page may |
| Hexomatic | eight extension IDs and six web origins | Opens both channels from a closed baseline |
| Axiom.ai | seven web origins, no ids | Extension channel closed, seven web pages opened |
| Magical | {"ids": [], "matches": []} | The only extension here that closes both channels explicitly |
La regla de Chrome tiene dos niveles. Según la referencia del manifiesto:
| Situation | Who may connect |
|---|---|
| the whole key is absent | "all extensions can connect, but no web pages can connect" |
key present, ids unset or [] | "no extensions or apps can connect" |
key present, matches unset or [] | "no web pages can connect" |
El valor permisivo por defecto se aplica a la ausencia de toda la clave. Una vez presente la clave, ambos subcampos empiezan cerrados y añadir valores amplía cada canal.
Axiom.ai declara la clave solo con matches. Su ids queda por tanto sin definir, lo que significa que ninguna extensión puede escribirle —el canal de extensiones está cerrado, no abierto. Lo que sí abrió son siete orígenes web, solo uno de los cuales es de Axiom: dos son terceros no atribuibles (*://*.tgwc.space/*, *://*.bitmachine.co.uk/*) y el resto son localhost, 0.0.0.0, un host de Google APIs y una gran plataforma social que no opera.
Hexomatic abre su canal de extensiones a ocho IDs nombrados. Con la clave presente, la base es cero extensiones; nombrar ocho lo amplía a ocho. Sus seis matches amplían el otro canal desde ninguno, y dos de ellos son http://localhost:8000/* y http://localhost:3000/* sobre HTTP sin cifrar: cualquier servicio que responda en esos puertos en la máquina del usuario entra en la lista permitida.
Siete de las diez omiten la clave por completo, incluida la nuestra, y esas siete son las que quedan en el valor permisivo por defecto para la mensajería entre extensiones. Dos extensiones cierran ese canal: Magical explícitamente con ids: [], y Axiom.ai declarando la clave y no mencionando nunca ids. Magical es la única que cierra ambos.
Esa última línea es la razón para leer manifiestos y no contar permisos. La misma extensión puede ser amplia en un eje y la más estricta del conjunto en otro.
El eje que nadie cuenta: ámbitos OAuth
Un manifiesto puede incluir un bloque oauth2, y los ámbitos dentro de él equivalen a acceso a tus cuentas en otras empresas —un tipo de alcance distinto a cualquiera de los anteriores, y que ningún recuento de permisos refleja.
Referencia oficial: lista de ámbitos OAuth 2.0 de Google.
| Extension | oauth2 scopes requested |
|---|---|
| Axiom.ai | openid, email, profile, auth/drive, auth/spreadsheets |
| Table Capture | auth/spreadsheets, auth/userinfo.email |
| Agenty | openid, email, profile |
| The other seven, including ours | none declared |
https://www.googleapis.com/auth/drive es el ámbito amplio. Google ofrece un ámbito más limitado, drive.file, que da acceso solo a los archivos que la propia app crea o que el usuario selecciona explícitamente; auth/drive permite ver, editar, crear y borrar en todo el Drive del usuario. auth/spreadsheets tiene la misma forma para todas las hojas de cálculo a las que la cuenta pueda acceder. Tanto Axiom.ai como Table Capture combinan un ámbito de cuenta de Google con acceso a páginas <all_urls>.
Dos límites sobre lo que prueba esta tabla. Un ámbito se solicita, no se concede: Google muestra una pantalla de consentimiento y el usuario puede rechazarla, y la extensión quizá nunca invoque la API. Y el manifiesto solo ve OAuth realizado a través del flujo identity de Chrome; una extensión que te lleve a una página web de inicio de sesión en su lugar no declararía nada aquí. Los siete ceros significan "no solicitado en este archivo", no "sin acceso a tu cuenta de Google" —incluida la nuestra, por eso este eje se informa y no se presume estrecho.
Nuestra propia extensión, en la misma escala
Thunderbit 4.6.4 pasó por el mismo analizador de manifiestos que las otras nueve. El paquete ocupa 15.9 MiB descomprimidos en 78 archivos.
Comportamiento estático declarado: <all_urls> aparece en los permisos de host y en las coincidencias de content scripts. El script estático se ejecuta en all_frames en document_end. Como <all_urls> incluye file:, el manifiesto puede llegar a archivos locales después de que el usuario active el interruptor de acceso a archivos de Chrome. Thunderbit también omite externally_connectable, así que el valor por defecto de Chrome permite mensajes desde cualquier extensión pero no desde ninguna página web.
Techo de capacidad en tiempo de ejecución: el array permissions contiene nueve cadenas: activeTab, commands, debugger, offscreen, scripting, sidePanel, storage, tabGroups y tabs. Chrome reconoce ocho de estas como permisos; commands es una clave de manifiesto de nivel superior y no tiene efecto como entrada en este array. Thunderbit es la única extensión del conjunto que declara debugger, capaz de adjuntar CDP a una pestaña. El manifiesto también habilita scripting para registro en tiempo de ejecución. Esas APIs crean capacidades más allá de la fila estática document_end, pero una lectura del manifiesto no puede establecer que Thunderbit invoque un método concreto de CDP ni que registre un script en un momento anterior específico.
Esa distinción bloquea varias comparaciones tentadoras pero inválidas. La ausencia de un permiso más limitado cookies no acota lo que podría acceder un código con debugger. La ausencia de clipboardRead no prueba que el acceso al portapapeles sea imposible. A la inversa, la presencia de debugger no demuestra que esas rutas se usen. Responder cualquiera de esas preguntas requiere inspección de código o trazado en tiempo de ejecución, y no se hizo ninguna de las dos cosas.
En este instrumento, Thunderbit es amplio en acceso estático a sitios, único en este conjunto por declarar debugger, y está en el valor por defecto de Chrome para la mensajería entre extensiones. No existe un único ranking de "más fuerte" porque la auditoría no ofrece un modelo de amenaza común entre CDP, OAuth, userScripts, portapapeles y acceso a hosts.
El diseño sobrio que nadie promociona
TexAu pesa 0.3 MiB —el más pequeño de todos por un factor de dos— y nombra catorce sitios específicos en lugar de usar un comodín: redes sociales, una plataforma para desarrolladores, plataformas de publicación, un producto de chat, un proveedor de datos empresariales y su propio dominio. Sus content scripts coinciden exactamente con esos catorce.
Puedes leer este manifiesto y saber con precisión dónde está activa la extensión. También es una declaración de producto: la lista de destinos dice para qué sirve la herramienta con más claridad que el marketing.
El compromiso es real: una lista nombrada no puede raspar un sitio que no esté en ella, y cada nuevo destino requiere una nueva versión. Pero "catorce dominios nombrados" y "cada URL existente" son propuestas muy distintas, y solo una de ellas es legible.
Dos productos que no eran lo que la lista decía
La extensión de Captain Data no se distribuye públicamente. El endpoint de actualización de Google devuelve HTTP 204 con cuerpo vacío para su ID de extensión, la respuesta de algo que la tienda no sirve de forma anónima. Su página de listado, en cambio, sí se sirvió de forma anónima —HTTP 200, 509.829 bytes. Lo que la captura no pudo encontrar ahí fue una versión, una fecha de última actualización o un recuento de instalaciones; las propias notas del script dicen que un nulo ahí es evidencia débil, y no se observó ningún muro de inicio de sesión. El ID es real y de primera parte, así que la lectura más probable es distribución solo mediante enlace o no listada, pero no pude distinguir eso de una retirada y no voy a adivinar.
Dataflow Kit no tiene ninguna extensión de Chrome. Su sitio describe una aplicación web alojada, con selección punto y clic y una API REST. Aun así había llegado a una lista preliminar de extensiones para Chrome, que es como suelen construirse estas listas.
Antigüedad y alcance, ya que ambos son gratuitos de comprobar
Los metadatos de la tienda añaden contexto de selección de producto más allá de los permisos. Los mismos campos se capturaron para cada extensión el 2026-07-30.
| Extension | Store version | Last updated | Install bucket |
|---|---|---|---|
| Thunderbit (ours) | 4.6.4 | July 28, 2026 | 200,000 |
| Listly | 0.9.6 | July 25, 2026 | 100,000 |
| Axiom.ai | 5.1.0 | July 20, 2026 | 100,000 |
| Table Capture | 11.0.41 | June 26, 2026 | 200,000 |
| Magical | 3.119.1 | April 4, 2026 | 200,000 |
| Agenty | 2.9.7 | February 8, 2026 | 10,000 |
| TexAu | 1.6.6 | August 20, 2025 | 7,000 |
| Clay for Chrome | 1.0.0 | April 9, 2025 | 10,000 |
| Clip to Clay | 1.8.0 | April 8, 2025 | 1,000 |
| Hexomatic | 1.8.4 | September 6, 2024 | 3,000 |
| Captain Data | — | — | not publicly served |
Tres productos no han publicado una versión en más de un año, y Hexomatic en casi dos. Para las extensiones eso importa más que para las librerías: Chrome publica una versión estable aproximadamente cada cuatro semanas y la propia plataforma de extensiones sigue cambiando debajo. userScripts movió su barrera de usuario en Chrome 138; una extensión publicada por última vez en 2024 se construyó contra un conjunto de reglas distinto del navegador que ahora las aplica.
Dos cosas que esta tabla no es. Los conteos de instalación están agrupados por Google —1.000 / 3.000 / 7.000 / 10.000 / 100.000 / 200.000—, así que comparan órdenes de magnitud y nada más fino; y varios productos publicitan cifras mayores en su propio marketing. Una fecha reciente es un hecho sobre publicación, no un veredicto sobre calidad de mantenimiento o riesgo de permisos.
Un subproducto útil: la versión de la tienda coincide con la versión del manifiesto en los diez paquetes analizados. Los archivos CRX que esta auditoría analizó son los que la tienda sirve hoy, no copias obsoletas.
La frescura cambia cuánto trabajo de seguimiento merece una selección; no cambia la semántica del manifiesto. Una extensión con dominios nombrados actualizada hace un año puede seguir exponiendo menos superficie de página que una extensión comodín publicada ayer. El paquete más nuevo todavía puede ser la mejor opción operativa si sigue bien los cambios de Chrome. Para una lista corta, usa la fecha de la tienda para decidir qué volver a probar, y luego el manifiesto para decidir qué requiere una revisión más profunda de capacidades. No conviertas las dos columnas en una sola puntuación.
Lo que un manifiesto no te dice
Un permiso declarado es un techo, no un comportamiento. <all_urls> significa que una extensión puede leer todas las páginas. No significa que lo haga, ni que algo salga de tu equipo. Establecer qué ocurre realmente exige observar el tráfico de red en tiempo de ejecución —otro trabajo, no realizado aquí, y nada de lo anterior debe leerse como evidencia de uso indebido.
Revisión relacionada: experimento de comprobación de extensiones de Chrome.
Tres límites más:
- Chrome pone barreras a gran parte de esto. El acceso a archivos está desactivado por defecto;
activeTabes deliberadamente estrecho; los permisos opcionales requieren un aviso en tiempo de ejecución; y el usuario ve una lista de permisos al instalar. - Los permisos amplios suelen ser necesarios. Una herramienta cuya tarea es "extraer una tabla de cualquier página en la que estés" no puede funcionar con una lista de dominios concretos. Un alcance estrecho a veces es disciplina y a veces simplemente un producto más pequeño.
- Una versión, un día. Todas las cifras proceden del paquete servido el 2026-07-29.
Correcciones materiales del análisis
Los recuentos publicados usan tres reglas que es fácil aplicar mal al escribir un analizador rápido de manifiestos. Primero, <all_urls> incluye el esquema file:, pero Chrome mantiene el acceso real a archivos detrás de un interruptor controlado por el usuario. Segundo, web_accessible_resources.matches debe revisarse junto con los content scripts y los permisos de host; ahí es donde Table Capture nombra explícitamente file://*/*. Tercero, externally_connectable tiene valores por defecto distintos según si falta toda la clave o si la clave existe con un subcampo vacío. Las tablas anteriores aplican esas reglas de forma consistente.
El total de permisos de Thunderbit también distingue entre cadenas en bruto y permisos reconocidos por Chrome. Su array tiene nueve entradas, pero commands pertenece al nivel superior, así que el recuento efectivo usado aquí es de ocho permisos reconocidos más una cadena no reconocida. Por último, las declaraciones estáticas de content_scripts no son prueba de que el código invoque scripting.registerContentScripts o un método CDP. Esas posibilidades aparecen solo como capacidad en tiempo de ejecución, nunca como comportamiento observado. Los manifiestos en bruto, los hashes CRX y la salida del analizador son la trazabilidad de estas normalizaciones, de modo que el lector no tenga que aceptar el texto sin más.
Para una decisión real de instalación, compara al menos cuatro dimensiones por separado: qué páginas entran por defecto, qué acción explícita del usuario desbloquea más alcance, qué APIs del navegador o de la cuenta quedan disponibles y qué llamadores externos pueden enviar mensajes a la extensión. El modelo activeTab de Agenty, el userScripts protegido de Table Capture, el ámbito Drive de Axiom.ai y la declaración debugger de Thunderbit no son puntos en una misma escala lineal. Son respuestas distintas a preguntas de amenaza distintas.
Aquí está esa comparación aplicada a cuatro diseños deliberadamente diferentes:
| Extension | Page scope visible in the manifest | Additional gate | Non-page capability in this audit | External caller posture |
|---|---|---|---|---|
| Agenty | no host permission or static content script | user invokes activeTab on the current tab | Chrome identity permissions | key omitted: any extension may connect, no web page may |
| Table Capture | static scripts on <all_urls> in all frames at document_start | file access is off by default; userScripts needs Chrome's separate user gate | optional userScripts, downloads, and identity | key omitted: any extension may connect, no web page may |
| Axiom.ai | HTTP and HTTPS wildcard access; static scripts at document_start on its own domains | OAuth consent for requested Google scopes | Drive and Sheets OAuth scopes declared | extension callers closed; seven web origins opened |
| Thunderbit | <all_urls> host access and static scripts in all frames at document_end | file access is off by default; attaching debugger has Chrome-controlled user-visible behavior | debugger, scripting, tabs, and related browser APIs declared | key omitted: any extension may connect, no web page may |
Esta tabla sigue sin producir un ganador. El acceso de página persistente y estrecho de Agenty no dice nada sobre lo que hace su backend con los datos enviados. Los ámbitos de cuenta de Axiom.ai no son comparables a que una extensión lea la página actual. La declaración userScripts de Table Capture está inerte hasta que el usuario activa su barrera aparte. El permiso debugger de Thunderbit expone una superficie amplia de control del navegador, pero el manifiesto no revela qué dominios o métodos CDP llama su código. Cada fila te dice qué inspeccionar a continuación: tráfico de red en tiempo de ejecución, código fuente, flujo de consentimiento o trazas de API del navegador.

La misma separación importa al leer el aviso de instalación de Chrome. Un recuento bruto de permisos no puede mostrar tiempo, alcance por marcos, ámbito OAuth, web_accessible_resources ni la ausencia de la clave externally_connectable. A la inversa, una declaración amplia no prueba ni recogida ni exfiltración. El resultado útil de una auditoría de manifiesto es un plan priorizado de pruebas en tiempo de ejecución: identificar la superficie de datos, anotar la barrera del usuario y luego observar si la ruta declarada se usa.
Cómo leer el tuyo
Revisión relacionada: guía de automatización del navegador.
chrome://extensions→ Details muestra el acceso a sitios concedido y permite cambiarlo a on click para cualquier cosa que no necesite acceso persistente. Eso acota la mitad de acceso a sitios de lo anterior. No toca la mensajería entrante (externally_connectablellega al service worker igual), ni los permisos a nivel de navegador. La declaracióndebuggerde Thunderbit importa aquí. La propia documentación de seguridad de extensiones de Chromium dice que la API debugger "may in some cases also sidestep other typical restrictions, such as host permissions or file access", así que poner el acceso a sitios en "on click" no limita lo que puede alcanzar. Tampoco ese control afecta atabs,webNavigation,clipboardRead,downloadsni a nada dentro deoptional_permissions.- Para el archivo en bruto, el paquete está en el directorio de Chrome
Extensions/<id>/<version>/. Lee seis campos:permissions,optional_permissions,host_permissions,content_scripts(losmatches,run_atyall_framesdentro),externally_connectable—recordando que una clave ausente es permisiva para los llamadores de extensiones— yweb_accessible_resources, cuyosmatchespueden nombrar esquemas que los content scripts nunca nombran. El último campo de Thunderbit tiene dos entradas<all_urls>que exponenindex.htmly dos scripts incluidos a cualquier origen, conuse_dynamic_url: false, lo que permite que una página compruebe si esas URLs estables de extensión resuelven. - Comprueba la fecha de última actualización del listado frente a la versión actual de Chrome.
Divulgación y recursos: este artículo está publicado por Thunderbit, cuya extensión aparece en la misma tabla y analizador. Nuestro pilar de scrapers de código abierto cubre herramientas no basadas en extensiones.
Probar Thunderbit para extracción de datos web
Versión breve
Diez extensiones de scraping y automatización, incluida la nuestra, se leen a partir de sus propios manifiestos.
Agenty no declara acceso a sitios ni content scripts, y solo trabaja sobre la pestaña que estás viendo cuando haces clic, ocupando 2.2 MiB. Axiom.ai declara cualquier URL HTTP y HTTPS en 37.1 MiB. Magical declara trece permisos, incluido clipboardRead —y además es la única extensión aquí que cierra por completo la mensajería entrante. Table Capture declara solo cuatro permisos, e inyecta en document_start en todos los marcos sobre <all_urls> —el mismo techo de coincidencia que alcanza la nuestra, pero antes—, además de userScripts bajo solicitud. TexAu es la más pequeña, y la que nombra más destinos: catorce patrones repartidos en trece propiedades distintas. No es la única que los nombra: Clip to Clay declara dos (clay.com y un sitio de terceros), y Hexomatic y Clay for Chrome nombran sus propios dominios. TexAu es la única cuya lista nombrada está compuesta en su mayor parte por dominios ajenos. Cinco de las diez pueden llegar a archivos de tu disco, y dos de ellas —Axiom.ai y la nuestra— sin escribir nunca file://.
Thunderbit, la nuestra, está en el extremo amplio: <all_urls> tanto para acceso a hosts como para inyección estática, más debugger, que ninguna otra extensión de este conjunto declara. Se sitúa en el valor por defecto de Chrome que permite mensajes desde cualquier extensión, y alcanza file:// cuando se habilita el acceso a archivos de Chrome.
Una declaración es un techo, no un comportamiento, y nada de esto demuestra abuso. Pero está publicado, se puede comprobar gratis y la diferencia entre ambos extremos es mayor que cualquier cosa que aparezca en las páginas de producto.
Probar Thunderbit para extracción de datos web Get Started Free
Preguntas frecuentes
¿Un permiso amplio significa que la extensión está haciendo algo mal, y por qué no basta con contar permisos?
No, y porque contar omite dos cosas. <all_urls> significa que una extensión puede leer cada página que visitas; no dice nada sobre lo que hace ni sobre si algo sale de tu equipo, y una herramienta creada para extraer datos de cualquier página realmente no puede funcionar con una lista de dominios nombrados. Lo que se observa aquí es la diferencia de alcance, no una conducta indebida; establecer el comportamiento real exige analizar el tráfico en tiempo de ejecución, cosa que esta auditoría no hizo. En cuanto al conteo: los ajustes de inyección no son permisos, así que Table Capture declara cuatro mientras inyecta en document_start, en all_frames, coincidiendo con <all_urls>. Y optional_permissions ni siquiera aparecen en el aviso de instalación: Table Capture puede solicitar userScripts en tiempo de ejecución, lo que permite ejecutar scripts arbitrarios aportados por el usuario en contextos de página, y Magical puede solicitar webRequest.
¿Cuál de estas pide menos?
Agenty: cuatro permisos, sin permisos de host, sin content scripts. Se apoya en activeTab, que concede acceso a la pestaña actual solo después de hacer clic en la extensión y solo hasta que navegues a otra página. Hexomatic va después, con dos permisos y content scripts limitados a sus propios dominios.
¿Cómo puede una extensión llegar a mis archivos locales sin declarar file://?
Porque <all_urls> incluye el esquema file:. Listly, Magical y Table Capture nombran patrones file:// explícitamente —Magical en sus content scripts y Table Capture en web_accessible_resources. Axiom.ai y Thunderbit lo alcanzan mediante el comodín sin mencionarlo en ningún sitio. http://*/* y https://*/* no cubren file://. Chrome mantiene el acceso a archivos desactivado por defecto con un interruptor por extensión, así que la declaración es una solicitud, no una concesión.
¿Qué es externally_connectable y por qué omitirlo es la opción permisiva?
Nombra los orígenes web o IDs de extensiones que pueden enviar mensajes al script en segundo plano de una extensión. El valor predeterminado de Chrome cuando la clave está ausente es que cualquier extensión puede conectarse y ninguna página web puede hacerlo. Siete de estas diez la omiten, incluida Thunderbit. Con la clave presente, Hexomatic abre el canal de extensiones a ocho IDs nombrados; Axiom.ai abre siete orígenes web mientras mantiene cerrado el canal de extensiones; Magical declara listas vacías para ambos, cerrando los dos canales.
¿Qué declara el propio manifiesto de Thunderbit?
<all_urls> para acceso a hosts e inyección estática de content scripts, en all_frames en document_end; 15.9 MiB repartidos en 78 archivos; y nueve cadenas en el array de permisos. Ocho son permisos reconocidos: activeTab, debugger, offscreen, scripting, sidePanel, storage, tabGroups y tabs. commands es una clave de manifiesto de nivel superior y no tiene efecto dentro de ese array. Ninguna otra extensión de este conjunto declara debugger. Thunderbit también alcanza file:// mediante <all_urls> cuando está habilitada la barrera de acceso a archivos de Chrome, y omite externally_connectable. No se ejecutó el comportamiento en tiempo de ejecución, así que la auditoría no afirma qué métodos CDP o de scripting llama realmente la extensión.


