BrowExt - permissions & host_permissions

Support HackTricks

Información Básica

permissions

Los permisos se definen en el archivo manifest.json de la extensión utilizando la propiedad permissions y permiten el acceso a casi cualquier cosa a la que un navegador puede acceder (Cookies o Almacenamiento Físico):

El manifiesto anterior declara que la extensión requiere el permiso storage. Esto significa que puede usar la API de almacenamiento para almacenar sus datos de manera persistente. A diferencia de las cookies o las APIs de localStorage que dan a los usuarios cierto nivel de control, el almacenamiento de la extensión normalmente solo puede ser borrado desinstalando la extensión.

Una extensión solicitará los permisos indicados en su archivo manifest.json y después de instalar la extensión, siempre puedes verificar sus permisos en tu navegador, como se muestra en esta imagen:

Puedes encontrar la lista completa de permisos que una extensión de navegador Chromium puede solicitar aquí y una lista completa para extensiones de Firefox aquí.

host_permissions

La configuración opcional pero poderosa host_permissions indica con qué hosts la extensión podrá interactuar a través de APIs como cookies, webRequest, y tabs.

Los siguientes host_permissions permiten básicamente cada web:

"host_permissions": [
"*://*/*"
]

// Or:
"host_permissions": [
"http://*/*",
"https://*/*"
]

// Or:
"host_permissions": [
"<all_urls>"
]

Estos son los hosts a los que la extensión del navegador puede acceder libremente. Esto se debe a que cuando una extensión del navegador llama a fetch("https://gmail.com/"), no está restringida por CORS.

Abusando de permissions y host_permissions

Tabs

Además, host_permissions también desbloquea la funcionalidad “avanzada” de la API de tabs. Permiten que la extensión llame a tabs.query() y no solo obtenga una lista de las pestañas del navegador del usuario, sino que también aprenda qué página web (es decir, dirección y título) está cargada.

No solo eso, los oyentes como tabs.onUpdated también se vuelven mucho más útiles. Estos serán notificados cada vez que se cargue una nueva página en una pestaña.

Ejecutando scripts de contenido

Los scripts de contenido no necesariamente están escritos de forma estática en el manifiesto de la extensión. Dadas suficientes host_permissions, las extensiones también pueden cargarlos dinámicamente llamando a tabs.executeScript() o scripting.executeScript().

Ambas API permiten ejecutar no solo archivos contenidos en las extensiones como scripts de contenido, sino también código arbitrario. La primera permite pasar código JavaScript como una cadena, mientras que la segunda espera una función de JavaScript que es menos propensa a vulnerabilidades de inyección. Aún así, ambas API causarán estragos si se usan incorrectamente.

Además de las capacidades anteriores, los scripts de contenido podrían, por ejemplo, interceptar credenciales a medida que se ingresan en las páginas web. Otra forma clásica de abusar de ellos es inyectar publicidad en cada sitio web. También es posible agregar mensajes de estafa para abusar de la credibilidad de los sitios web de noticias. Finalmente, podrían manipular sitios web bancarios para redirigir transferencias de dinero.

Privilegios implícitos

Algunos privilegios de la extensión no tienen que ser declarados explícitamente. Un ejemplo es la API de tabs: su funcionalidad básica es accesible sin ningún privilegio. Cualquier extensión puede ser notificada cuando abres y cierras pestañas, simplemente no sabrá a qué sitio web corresponden estas pestañas.

¿Suena demasiado inofensivo? La API tabs.create() es algo menos inofensiva. Puede ser utilizada para crear una nueva pestaña, esencialmente lo mismo que window.open() que puede ser llamado por cualquier sitio web. Sin embargo, mientras que window.open() está sujeto al bloqueador de ventanas emergentes, tabs.create() no lo está.

Una extensión puede crear cualquier número de pestañas cuando quiera.

Si revisas los posibles parámetros de tabs.create(), también notarás que sus capacidades van mucho más allá de lo que window.open() puede controlar. Y aunque Firefox no permite que se usen URIs data: con esta API, Chrome no tiene tal protección. El uso de tales URIs en el nivel superior ha sido prohibido debido a su abuso para phishing.

tabs.update() es muy similar a tabs.create() pero modificará una pestaña existente. Así que una extensión maliciosa puede, por ejemplo, cargar arbitrariamente una página de publicidad en una de tus pestañas, y también puede activar la pestaña correspondiente.

Webcam, geolocalización y amigos

Probablemente sepas que los sitios web pueden solicitar permisos especiales, por ejemplo, para acceder a tu cámara web (herramientas de videoconferencia) o ubicación geográfica (mapas). Son características con un considerable potencial de abuso, por lo que los usuarios deben confirmar cada vez que aún desean esto.

No es así con las extensiones del navegador. Si una extensión del navegador quiere acceso a tu cámara web o micrófono, solo necesita pedir permiso una vez

Típicamente, una extensión lo hará inmediatamente después de ser instalada. Una vez que se acepta este aviso, el acceso a la cámara web es posible en cualquier momento, incluso si el usuario no está interactuando con la extensión en ese momento. Sí, un usuario solo aceptará este aviso si la extensión realmente necesita acceso a la cámara web. Pero después de eso, deben confiar en que la extensión no grabará nada en secreto.

Con acceso a tu ubicación geográfica exacta o contenido de tu portapapeles, otorgar permiso explícitamente es innecesario por completo. Una extensión simplemente agrega geolocation o clipboard a la entrada de permisos de su manifiesto. Estos privilegios de acceso se otorgan implícitamente cuando se instala la extensión. Así que una extensión maliciosa o comprometida con estos privilegios puede crear tu perfil de movimiento o monitorear tu portapapeles en busca de contraseñas copiadas sin que te des cuenta.

Agregar la palabra clave history a la entrada de permisos del manifiesto de la extensión otorga acceso a la API de history. Permite recuperar todo el historial de navegación del usuario de una vez, sin esperar a que el usuario visite estos sitios web nuevamente.

El permiso bookmarks tiene un potencial de abuso similar, este permite leer todos los marcadores a través de la API de bookmarks.

Permiso de almacenamiento

El almacenamiento de la extensión es simplemente una colección de clave-valor, muy similar a localStorage que cualquier sitio web podría usar. Por lo tanto, no se debe almacenar información sensible aquí.

Sin embargo, las empresas de publicidad también podrían abusar de este almacenamiento.

Más permisos

Puedes encontrar la lista completa de permisos que una extensión de navegador Chromium puede solicitar aquí y una lista completa para extensiones de Firefox aquí.

Prevención

La política del desarrollador de Google prohíbe explícitamente a las extensiones solicitar más privilegios de los necesarios para su funcionalidad, mitigando efectivamente las solicitudes excesivas de permisos. Un caso en el que una extensión del navegador sobrepasó este límite involucró su distribución con el propio navegador en lugar de a través de una tienda de complementos.

Los navegadores podrían limitar aún más el abuso de los privilegios de las extensiones. Por ejemplo, las API tabCapture y desktopCapture de Chrome, utilizadas para la grabación de pantalla, están diseñadas para minimizar el abuso. La API tabCapture solo puede ser activada a través de la interacción directa del usuario, como hacer clic en el ícono de la extensión, mientras que desktopCapture requiere confirmación del usuario para que la ventana sea grabada, previniendo actividades de grabación clandestinas.

Sin embargo, endurecer las medidas de seguridad a menudo resulta en una disminución de la flexibilidad y la facilidad de uso de las extensiones. El permiso activeTab ilustra este compromiso. Se introdujo para eliminar la necesidad de que las extensiones solicitaran privilegios de host en toda la internet, permitiendo que las extensiones accedan solo a la pestaña actual tras la activación explícita por parte del usuario. Este modelo es efectivo para extensiones que requieren acciones iniciadas por el usuario, pero no es suficiente para aquellas que requieren acciones automáticas o preventivas, comprometiendo así la conveniencia y la capacidad de respuesta inmediata.

Referencias

Support HackTricks

Last updated