14 KiB
BrowExt - permisos y host_permissions
Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si quieres ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.
Información Básica
permissions
Los permisos se definen en el archivo manifest.json
de la extensión utilizando la propiedad permissions
y permiten acceder a casi cualquier cosa a la que un navegador pueda acceder (Cookies o Almacenamiento Físico):
El manifiesto anterior declara que la extensión requiere el permiso storage
. Esto significa que puede utilizar la API de almacenamiento para almacenar sus datos de forma 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 se puede borrar 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 del Navegador Chromium puede solicitar aquí y una lista completa para extensiones de Firefox aquí.
host_permissions
El ajuste opcional pero poderoso 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
básicamente permiten todo en la 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
Pestañas
Además, host_permissions
también desbloquean la funcionalidad "avanzada" de la API de pestañas. Permiten que la extensión llame a tabs.query() y no solo obtenga una lista de pestañas del navegador del usuario, sino también sepa qué página web (dirección y título) está cargada.
{% hint style="danger" %} No solo eso, los listeners como tabs.onUpdated también se vuelven mucho más útiles. Serán notificados cada vez que una nueva página se cargue en una pestaña. {% endhint %}
Ejecución de scripts de contenido
Los scripts de contenido no necesariamente están escritos estáticamente en el manifiesto de la extensión. Con suficientes host_permissions
, las extensiones también pueden cargarlos dinámicamente llamando tabs.executeScript() o scripting.executeScript().
Ambas APIs 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 JavaScript que es menos propensa a vulnerabilidades de inyección. Aun así, ambas APIs causarán estragos si se usan incorrectamente.
{% hint style="danger" %} Además de las capacidades mencionadas anteriormente, los scripts de contenido podrían, por ejemplo, interceptar credenciales a medida que se ingresan en páginas web. Otra forma clásica de abusar de ellos es inyectar publicidad en cada sitio web. Agregar mensajes de estafa para abusar de la credibilidad de los sitios de noticias también es posible. Finalmente, podrían manipular sitios web bancarios para redirigir transferencias de dinero. {% endhint %}
Privilegios implícitos
Algunos privilegios de extensión no tienen que ser declarados explícitamente. Un ejemplo es la API de pestañas: 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á con qué sitio web corresponden esas pestañas.
¿Suena demasiado inofensivo? La API tabs.create() es un poco menos inofensiva. Se puede usar para crear una nueva pestaña, esencialmente lo mismo que window.open() que puede ser llamado por cualquier sitio web. Sin embargo, mientras window.open()
está sujeto al bloqueador de ventanas emergentes, tabs.create()
no lo está.
{% hint style="danger" %} Una extensión puede crear cualquier cantidad de pestañas cuando quiera. {% endhint %}
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()
está permitido a controlar. Y mientras que Firefox no permite que se utilicen URIs data:
con esta API, Chrome no tiene esa 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. Por lo tanto, 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.
Cámara web, 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 desean permitirlo.
{% hint style="danger" %} No es así con las extensiones del navegador. Si una extensión del navegador quiere acceder a tu cámara web o micrófono, solo necesita pedir permiso una vez {% endhint %}
Normalmente, 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, debe 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, no es necesario otorgar permiso explícitamente. 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. Por lo tanto, 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 historial. 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 marcadores.
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 compañías 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 de los desarrolladores 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 navegador en sí en lugar de a través de una tienda de complementos.
Los navegadores podrían limitar aún más el uso indebido de los privilegios de extensión. Por ejemplo, las APIs tabCapture y desktopCapture de Chrome, utilizadas para grabación de pantalla, están diseñadas para minimizar el abuso. La API tabCapture solo puede activarse a través de 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, evitando actividades de grabación clandestinas.
Sin embargo, el fortalecimiento de 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 soliciten privilegios de host en toda la internet, permitiendo que las extensiones accedan solo a la pestaña actual al ser activada explícitamente por el 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
- https://palant.info/2022/08/17/impact-of-extension-privileges/
- https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing
Aprende a hackear AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén el oficial PEASS & HackTricks swag
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.