hacktricks/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md

138 lines
14 KiB
Markdown

# BrowExt - permissões e host_permissions
<details>
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras maneiras de apoiar o HackTricks:
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
</details>
## Informações Básicas
### **`permissões`**
As permissões são definidas no arquivo **`manifest.json`** da extensão usando a propriedade **`permissions`** e permitem acesso a quase tudo o que um navegador pode acessar (Cookies ou Armazenamento Físico):
O manifesto anterior declara que a extensão requer a permissão `storage`. Isso significa que ela pode usar [a API de armazenamento](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) para armazenar seus dados de forma persistente. Ao contrário dos cookies ou APIs `localStorage` que dão aos usuários algum nível de controle, **o armazenamento da extensão normalmente só pode ser limpo desinstalando a extensão**.
Uma extensão solicitará as permissões indicadas em seu arquivo **`manifest.json`** e após instalar a extensão, você pode **sempre verificar suas permissões no seu navegador**, como mostrado nesta imagem:
<figure><img src="../../.gitbook/assets/image (2) (1) (1).png" alt=""><figcaption></figcaption></figure>
Você pode encontrar a [**lista completa de permissões que uma Extensão do Navegador Chromium pode solicitar aqui**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) e uma [**lista completa para extensões do Firefox aqui**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api\_permissions)**.**
### `host_permissions`
A configuração opcional, mas poderosa, **`host_permissions`** indica com quais hosts a extensão será capaz de interagir via APIs como [`cookies`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/cookies), [`webRequest`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest) e [`tabs`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs).
As seguintes `host_permissions` basicamente permitem todo o web:
```json
"host_permissions": [
"*://*/*"
]
// Or:
"host_permissions": [
"http://*/*",
"https://*/*"
]
// Or:
"host_permissions": [
"<all_urls>"
]
```
Estes são os hosts que a extensão do navegador pode acessar livremente. Isso ocorre porque quando uma extensão do navegador chama **`fetch("https://gmail.com/")`** não é restrita pelo CORS.
## Abusando de `permissions` e `host_permissions`
### Abas
Além disso, **`host_permissions`** também desbloqueiam funcionalidades "avançadas" da [**API de abas**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs). Eles permitem que a extensão chame [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) e não apenas obtenha de volta uma **lista das abas do navegador do usuário**, mas também saiba qual **página da web (significando endereço e título) está carregada**.
{% hint style="danger" %}
Além disso, ouvintes como [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **também se tornam muito mais úteis**. Eles serão notificados sempre que uma nova página for carregada em uma aba.
{% endhint %}
### Executando scripts de conteúdo <a href="#running-content-scripts" id="running-content-scripts"></a>
Scripts de conteúdo não precisam ser necessariamente escritos estaticamente no manifesto da extensão. Com **`host_permissions`** suficientes, **as extensões também podem carregá-los dinamicamente chamando** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **ou** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript).
Ambas as APIs permitem a execução não apenas de arquivos contidos nas extensões como scripts de conteúdo, mas também **código arbitrário**. A primeira permite passar código JavaScript como uma string, enquanto a segunda espera uma função JavaScript que é menos propensa a vulnerabilidades de injeção. Ainda assim, ambas as APIs causarão estragos se forem mal utilizadas.
{% hint style="danger" %}
Além das capacidades acima, scripts de conteúdo poderiam, por exemplo, **interceptar credenciais** à medida que são inseridas nas páginas da web. Uma maneira clássica de abusá-los é **injetar publicidade** em cada site. Adicionar **mensagens de golpe** para abusar da credibilidade de sites de notícias também é possível. Por fim, eles poderiam **manipular** sites de **bancos** para redirecionar transferências de dinheiro.
{% endhint %}
### Privilégios implícitos <a href="#implicit-privileges" id="implicit-privileges"></a>
Alguns privilégios de extensão **não precisam ser declarados explicitamente**. Um exemplo é a [API de abas](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs): sua funcionalidade básica é acessível sem nenhum privilégio. Qualquer extensão pode ser notificada quando você abre e fecha abas, ela simplesmente não saberá com qual site essas abas correspondem.
Parece inofensivo demais? A [API tabs.create()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) é um pouco menos. Ela pode ser usada para **criar uma nova aba**, essencialmente o mesmo que [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open) que pode ser chamado por qualquer site. No entanto, enquanto `window.open()` está sujeito ao **bloqueador de pop-ups, `tabs.create()` não está**.
{% hint style="danger" %}
Uma extensão pode criar qualquer número de abas sempre que desejar.
{% endhint %}
Se você examinar os possíveis parâmetros de `tabs.create()`, também notará que suas capacidades vão muito além do que `window.open()` é permitido controlar. E enquanto o Firefox não permite que URIs `data:` sejam usados com esta API, o Chrome não tem essa proteção. **O uso desses URIs no nível superior foi** [**proibido por ser abusado para phishing**](https://bugzilla.mozilla.org/show\_bug.cgi?id=1331351)**.**
[**tabs.update()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/update) é muito semelhante ao `tabs.create()` mas irá **modificar uma aba existente**. Portanto, uma extensão maliciosa pode, por exemplo, carregar arbitrariamente uma página de publicidade em uma de suas abas e também pode ativar a aba correspondente.
### Webcam, geolocalização e amigos <a href="#webcam-geolocation-and-friends" id="webcam-geolocation-and-friends"></a>
Você provavelmente sabe que os sites podem solicitar permissões especiais, por exemplo, para acessar sua webcam (ferramentas de videoconferência) ou localização geográfica (mapas). São recursos com potencial considerável para abuso, então os usuários precisam confirmar isso a cada vez.
{% hint style="danger" %}
Não é assim com as extensões do navegador. **Se uma extensão do navegador** [**deseja acessar sua webcam ou microfone**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, ela só precisa pedir permissão uma vez**
{% endhint %}
Normalmente, uma extensão fará isso imediatamente após ser instalada. Uma vez que este prompt é aceito, **o acesso à webcam é possível a qualquer momento**, mesmo que o usuário não esteja interagindo com a extensão neste momento. Sim, um usuário só aceitará este prompt se a extensão realmente precisar de acesso à webcam. Mas depois disso, eles têm que confiar na extensão para não gravar nada secretamente.
Com acesso à [sua localização geográfica exata](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) ou [conteúdo da sua área de transferência](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard\_API), conceder permissão explicitamente é desnecessário. **Uma extensão simplesmente adiciona `geolocation` ou `clipboard` à** [**entrada de permissões**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **de seu manifesto**. Esses privilégios de acesso são concedidos implicitamente quando a extensão é instalada. Portanto, uma extensão maliciosa ou comprometida com esses privilégios pode criar seu perfil de movimento ou monitorar sua área de transferência para senhas copiadas sem que você perceba.
Adicionar a palavra-chave **`history`** à [entrada de permissões](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) do manifesto da extensão concede **acesso à** [**API de histórico**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history). Isso permite recuperar todo o histórico de navegação do usuário de uma só vez, sem esperar que o usuário visite esses sites novamente.
A **permissão `bookmarks`** tem um potencial de abuso semelhante, esta permite **ler todos os favoritos via** [**API de favoritos**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks).
### Permissão de armazenamento <a href="#the-storage-permission" id="the-storage-permission"></a>
O armazenamento da extensão é apenas uma coleção de chave-valor, muito semelhante ao [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) que qualquer site poderia usar. Portanto, informações sensíveis não devem ser armazenadas aqui.
No entanto, empresas de publicidade também poderiam abusar deste armazenamento.
### Mais permissões
Você pode encontrar a [**lista completa de permissões que uma Extensão de Navegador Chromium pode solicitar aqui**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) e uma [**lista completa para extensões do Firefox aqui**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api\_permissions)**.**
## Prevenção <a href="#why-not-restrict-extension-privileges" id="why-not-restrict-extension-privileges"></a>
A política do desenvolvedor do Google proíbe explicitamente as extensões de solicitar mais privilégios do que o necessário para sua funcionalidade, mitigando efetivamente solicitações excessivas de permissão. Um exemplo em que uma extensão do navegador ultrapassou esse limite envolveu sua distribuição com o próprio navegador, em vez de através de uma loja de complementos.
Os navegadores poderiam ainda reduzir o uso indevido dos privilégios da extensão. Por exemplo, as APIs [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) e [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) do Chrome, usadas para gravação de tela, são projetadas para minimizar o abuso. A API tabCapture só pode ser ativada por meio de interação direta do usuário, como clicar no ícone da extensão, enquanto o desktopCapture requer confirmação do usuário para a janela ser gravada, impedindo atividades de gravação clandestinas.
No entanto, o aumento das medidas de segurança muitas vezes resulta em uma diminuição da flexibilidade e da facilidade de uso das extensões. A [permissão activeTab](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab\_permission) ilustra esse compromisso. Foi introduzida para eliminar a necessidade de as extensões solicitarem privilégios de host em toda a internet, permitindo que as extensões acessem apenas a aba atual mediante ativação explícita pelo usuário. Esse modelo é eficaz para extensões que requerem ações iniciadas pelo usuário, mas é insuficiente para aquelas que exigem ações automáticas ou preventivas, comprometendo assim a conveniência e a capacidade de resposta imediata.
## **Referências**
* [https://palant.info/2022/08/17/impact-of-extension-privileges/](https://palant.info/2022/08/17/impact-of-extension-privileges/)
* [https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing](https://www.cobalt.io/blog/introduction-to-chrome-browser-extension-security-testing)
<details>
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Outras formas de apoiar o HackTricks:
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
</details>