Yo mantengo una extensión de Chrome. Su manifiesto solicita el permiso identity, un permiso de host limitado a mi propio backend de Supabase y, más importante que ambos, un content script que se ejecuta en cada página http:// y https:// que visitas, que es lo que realmente produce la advertencia más amplia de Chrome —“leer y cambiar todos tus datos en los sitios web que visitas”—, no el permiso de host del backend. He escrito el desglose completo de para qué sirve todo eso en otra parte de este sitio. Lo nombro de nuevo aquí, por delante, porque un artículo cuyo argumento entero es “juzga las extensiones por su manifiesto, no por su discurso” solo se gana el derecho a hacer esa afirmación si sobrevive a que se apunte primero contra su propio autor.
Dicho esto: así es como se lee de verdad un manifiesto, y lo que muestra al aplicar el método a ocho extensiones que la gente instala todos los días, más una mirada autocrítica a dónde queda la mía.
Cómo leer tú mismo el manifiesto de cualquier extensión
El aviso de instalación de la Chrome Web Store es un resumen. El manifiesto es la fuente. Unas cuantas cosas que vale la pena saber antes de comparar los dos:
- Los permisos, los permisos de host y los content scripts son tres declaraciones independientes que cada una puede desencadenar por sí sola la misma advertencia amplia. Una extensión puede parecer estrecha en su array
permissionsy aun así ejecutarse en cada página que visitas por culpa de un bloquecontent_scriptsconmatchesamplios, o una entradahost_permissionsde<all_urls>. Lee las tres, no solo la que el aviso de instalación resuma primero. - Un permiso declarado es un techo, no una garantía de uso. Algunas extensiones declaran un acceso amplio en el manifiesto pero publican un comportamiento predeterminado más estrecho, y solo ejercen el alcance completo cuando activas explícitamente una función que lo necesita. Es una distinción real que vale la pena comprobar, no simplemente descartar, y también funciona en la dirección contraria: un manifiesto que parece estrecho sobre el papel puede seguir haciendo algo con el acceso que sí tiene que te interesaría conocer.
optional_permissionsyoptional_host_permissionsson una afirmación significativamente distinta al mismo acceso solicitado en la instalación. Un permiso que Chrome solo pide en el momento en que haces clic en una función concreta es una solicitud más pequeña y más rendible de cuentas que el mismo permiso incluido en cada instalación, aunque los dos terminen concediendo un acceso a la API idéntico una vez activados.- Manifest V3 elimina estructuralmente toda una categoría de riesgo: las extensiones ya no pueden descargar y ejecutar JavaScript arbitrario desde un servidor remoto en tiempo de ejecución. Y esto ya no es una recomendación suave: Chrome dejó de ejecutar extensiones de Manifest V2 en 2025, y Google está retirando por completo las que quedan de la Web Store el 31 de agosto de 2026. Una extensión que nunca migró de V2 ya no es un caso que “vale la pena mirar dos veces”; es una que ya no se ejecuta o está a punto de desaparecer.
- Si es de código abierto, lee el manifest.json real del repositorio, no un resumen de él, incluido el de este artículo. Si es de código cerrado, la propia divulgación de permisos de la ficha en la Chrome Web Store es la señal pública más fiable de la que dispones, más escueta que el código fuente, pero aun así más precisa que la descripción de funciones que tiene encima.
- Una política de privacidad que nombra exactamente qué sale del dispositivo, y bajo qué condición, vale más que una que dice “podemos recopilar información para mejorar nuestros servicios”. Las políticas vagas son texto de relleno sin importar lo buena que sea realmente la extensión.
- Nada de esto es una comprobación única. La propiedad de una extensión puede cambiar de manos después de que ya la hayas instalado, y un nuevo propietario puede publicar una actualización que añada nuevas capacidades bajo el mismo nombre y la misma base de instalaciones. Más abajo entro en detalle sobre cómo es eso en la práctica.
Cómo se ve esto aplicado a ocho extensiones reales
Obtuve el manifiesto real de cada una de estas, del propio repositorio de GitHub del proyecto cuando la extensión es de código abierto, o de la propia divulgación de permisos de la Chrome Web Store cuando no lo es.
| Extensión | Permisos / acceso a hosts | ¿Acceso amplio? | ¿Justificado? |
|---|---|---|---|
| uBlock Origin Lite | activeTab, alarms, declarativeNetRequest, offscreen, scripting, storage, unlimitedStorage, userScripts; host_permissions: <all_urls> | Declarado amplio, predeterminado estrecho | Sí, y en su mayor parte sin usar por defecto. <all_urls> es el techo para sus modos de filtrado opcionales “Optimal” y “Complete”; el modo predeterminado “Basic” bloquea únicamente mediante los conjuntos de reglas estáticas de declarativeNetRequest y nunca lee el contenido de la página a menos que tú mismo eleves el modo, sitio por sitio |
| Bitwarden | activeTab, alarms, clipboardRead, clipboardWrite, contextMenus, idle, offscreen, scripting, sidePanel, storage, tabs, unlimitedStorage, webNavigation, webRequest, webRequestAuthProvider, notifications; host_permissions: https://*/*, http://*/* | Sí | Sí. El autocompletado no puede funcionar sin leer los campos de formulario de la página en la que estás, y esa página podría ser cualquiera |
| ClearURLs | <all_urls>, webRequest, webRequestBlocking, tabs, downloads, contextMenus, webNavigation, storage, unlimitedStorage (sigue en Manifest V2) | Sí, sobre el papel | Este es un ejemplo de advertencia, no uno de “la gente instala esto todos los días”. La reescritura de URLs justificaría el acceso si todavía se ejecutara: esta es una extensión de Manifest V2, su mantenedor cerró explícitamente la solicitud de migrar a V3 como “no planeado”, Chrome ya dejó de ejecutarla, y Google retira las extensiones MV2 restantes de la Web Store el 31 de agosto de 2026, diez días después de la publicación de este artículo |
| Privacy Badger (EFF) | alarms, declarativeNetRequest, privacy, scripting, storage, tabs, webNavigation, webRequest; host_permissions: <all_urls> | Sí | Sí. Detectar rastreadores de terceros observando qué dominios aparecen en sitios no relacionados es el propio mecanismo, no un efecto secundario de él. (Vale la pena saber, como lector: el propio archivo fuente de GitHub de la EFF es una plantilla MV2 sin compilar, no lo que realmente está publicado. La fila de arriba son los permisos reales de Manifest V3 tal como se publican, extraídos del binario en vivo de la Chrome Web Store, no del repositorio.) |
| Dark Reader | alarms, fontSettings, scripting, storage; host_permissions: *://*/* | Sí | Sí. Reescribir el CSS de una página para invertirlo u oscurecerlo no tiene una versión que funcione solo en algunas páginas |
| GoFullPage | activeTab, scripting, storage, unlimitedStorage; optional_host_permissions: <all_urls>, file://*/* | Declarado amplio, opcional | Encaja con el trabajo. La concesión en el momento de instalar es estrecha; activeTab solo toca la pestaña en la que activas una captura de forma directa. Existe un acceso más amplio en el manifiesto, pero está detrás de optional_host_permissions, lo que significa que Chrome solo lo concede si un escenario de captura concreto (como una página que contiene iframes) realmente lo pide, no al instalar |
| Vimium | tabs, bookmarks, history, storage, sessions, notifications, scripting, favicon, webNavigation, search; host_permissions: <all_urls> | Sí | Sí. La navegación por teclado en cada página necesita ejecutarse en todas partes, y el acceso a marcadores/historial respalda sus propios comandos de teclado para saltar a un marcador o a una página pasada, no una función aparte añadida a posteriori |
| OneTab | tabs, activeTab, scripting, storage, unlimitedStorage, contextMenus, favicon (código cerrado; basado en el manifiesto real de la Chrome Web Store, no en una fuente primaria de GitHub) | Sin acceso amplio a hosts, pero no es nada | Encaja con el trabajo, con un permiso que vale la pena leer de verdad: tabs concede la URL y el título de cada pestaña que tienes abierta, no solo la que usas, que es exactamente el tipo de cosa que este método existe para sacar a la luz en lugar de darla por sentada a partir de solo una descripción de funciones |
| Second Bookmark Bar (la mía) | activeTab, bookmarks, storage, favicon, identity, alarms; tabGroups opcional (solicitado en tiempo de ejecución, no al instalar); permiso de host limitado a un dominio de Supabase; content script en http://*/* y https://*/* en document_start | Sí | En su mayor parte, pero el alcance del content script es real. Es lo que dibuja la barra y lee los detalles de un elemento arrastrado, y es genuinamente más amplio que los permisos bookmarks/storage/activeTab que tiene por encima, que es la razón honesta por la que esta extensión no encabeza esta tabla |
Una extensión gratuita hipotética con <all_urls>, un SDK de anuncios o analítica incluido, y una política de privacidad copiada y pegada | <all_urls> más llamadas salientes a un dominio de SDK de terceros | Sí | No, por diseño. Esta es la forma a la que hay que estar atento, no un producto concreto: acceso amplio sin ninguna función que lo necesite obviamente, monetizado mediante una llamada de red que la descripción nunca menciona, respaldado por una política que se lee como texto de relleno en lugar de una divulgación real |
Hay unas cuantas cosas que vale la pena sacar de esa tabla en lugar de dejarlas enterradas en ella. OneTab y GoFullPage tienen el menor acceso a hosts de todo lo que hay aquí, ninguno de los dos pide un solo sitio al que pueda llegar libremente, y eso no es casualidad: una herramienta de listado de pestañas y una herramienta de capturas genuinamente no necesitan ver el contenido de la página más allá de aquello sobre lo que actúas, así que no lo piden. Pero “menor acceso” no es lo mismo que “ningún permiso que valga la pena leer”. OneTab sigue declarando tabs, que le entrega la URL y el título de cada pestaña que tienes abierta a la vez, no solo la que haces clic, y eso es algo real y concreto que conviene saber sobre una herramienta que, por lo demás, parece de lo más estrecho de esta lista. (Si acumular pestañas es el problema real que estás resolviendo, también he escrito sobre cómo se compara OneTab con Second Bookmark Bar si estás decidiendo entre los dos enfoques.) Bitwarden, Privacy Badger, Dark Reader y Vimium son todas amplias en la instalación y todas justificadas, porque lo que hace cada una estructuralmente requiere ver cada página: el autocompletado, la detección de rastreadores entre sitios, la reescritura de CSS y la captura de teclado universal no tienen una versión que funcione en un subconjunto de la web. ClearURLs pertenecería a ese mismo grupo solo por motivos de manifiesto —la reescritura de URLs necesita ver cada URL—, pero vale la pena saber que ese motivo ahora es sobre todo teórico: nunca migró de Manifest V2, y Chrome dejó de ejecutar extensiones MV2 en 2025.
uBlock Origin Lite es el caso más interesante, y el que entendí mal en la primera lectura. Su manifiesto declara genuinamente <all_urls>, punto, sin asterisco. Pero esa declaración es un techo para modos opcionales que la mayoría de los usuarios nunca activa; el modo que viene activo por defecto, “Basic,” bloquea únicamente mediante los conjuntos de reglas precompiladas de declarativeNetRequest y nunca lee realmente el contenido de una página a menos que eleves explícitamente el nivel de filtrado en un sitio concreto. La lección no es “uBlock Origin Lite tiene cero permisos,” que habría sido incorrecto. Es que un manifiesto te dice el máximo que una extensión podría hacer, y aun así tienes que comprobar qué hace realmente por defecto antes de saber si ese máximo importa en el día a día.
Y luego está la mía. Second Bookmark Bar no encabeza esta tabla, y no debería. El content script que se ejecuta en cada página que visitas es acceso amplio real, punto, y ninguna cantidad de “solo lee elementos cuando los arrastras” cambia lo que declara el manifiesto. Es el mismo estándar que estoy aplicando a todos los demás en esta tabla, así que tiene que aplicarse también a mi propia fila, o el resto de este artículo no es más que marketing disfrazado de auditoría de permisos. Si quieres el recorrido completo caso por caso de qué hace y qué no hace ese content script con el acceso que tiene, ese es el artículo completo de seguridad, y si estás evaluando esto específicamente en nombre de una empresa en lugar de para ti mismo, hay una versión para revisores de seguridad de la misma divulgación escrita para ese caso de uso.
Los permisos no son una comprobación única
En febrero de 2026, una extensión de Chrome llamada QuickLens, una herramienta de búsqueda en pantalla al estilo “Google Lens” con unas 7.000 instalaciones, cambió de propietario. Había estado en venta en un mercado de extensiones de terceros poco después de publicarse por primera vez, y para el 1 de febrero ya tenía un nuevo propietario operando bajo un nombre distinto, con una política de privacidad sustituida por una alojada en lo que los investigadores describieron como un dominio apenas funcional. El 17 de febrero se publicó una versión nueva que añadía código para detectar monederos de criptomonedas instalados, incluidos MetaMask, Phantom, Coinbase Wallet y varios otros, e intentar robar las credenciales necesarias para vaciarlos. Varios investigadores de seguridad y medios lo cubrieron como un incidente documentado de cadena de suministro una vez descubierto, no un rumor.
Nada de esa historia requería un cambio de manifiesto que la mayoría de los usuarios habría notado en su momento. La base de instalaciones de la extensión, su nombre y su ficha eran los mismos. Lo que cambió fue quién estaba detrás y qué decidió publicar ese nuevo propietario. Ese es el límite honesto de todo lo anterior: leer un manifiesto te dice qué puede hacer una extensión ahora mismo, de parte de quienes la controlan actualmente. No te dice quién la controlará dentro de un año, ni qué decidirán añadir. Comprobar los permisos una vez al instalar es un hábito razonable. Tratar esa comprobación como permanente no lo es.
Qué hacer si el Chrome de tu trabajo bloquea una extensión
Nada de esta auditoría importa si la política de Chrome de tu empresa bloquea la extensión directamente antes de que llegues a ver un aviso de instalación, lo cual es una situación distinta y mucho más común que un manifiesto genuinamente arriesgado. Si te has topado con ese cuadro de diálogo gris de “bloqueado por tu organización”, escribí sobre qué es realmente ese bloqueo y cómo funciona el flujo de solicitud de instalación, incluido lo que ve realmente tu administrador de TI cuando le pides que apruebe algo. Y si eres tú quien está al otro lado de esa solicitud, decidiendo si aprobar una extensión para un equipo en lugar de solo para ti, la revisión permiso por permiso escrita para ese revisor es la página construida específicamente para esa decisión.