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

141 lines
15 KiB
Markdown

# BrowExt - permissões & host\_permissions
<details>
<summary><strong>Aprenda hacking no 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ê quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
## Informações Básicas
### **`permissions`**
Permissões são definidas no arquivo **`manifest.json`** da extensão usando a propriedade **`permissions`** e permitem acesso a quase tudo 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 guardar seus dados de forma persistente. Diferente 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).png" alt=""><figcaption></figcaption></figure>
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)**.**
### `host_permissions`
A configuração opcional, mas poderosa, **`host_permissions`** indica com quais hosts a extensão poderá interagir através de 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 tudo na web:
```json
"host_permissions": [
"*://*/*"
]
// Or:
"host_permissions": [
"http://*/*",
"https://*/*"
]
// Or:
"host_permissions": [
"<all_urls>"
]
```
Estes são os hosts aos quais a extensão do navegador pode acessar livremente. Isso ocorre porque quando uma extensão do navegador chama **`fetch("https://gmail.com/")`**, ela 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). Elas permitem que a extensão chame [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) e obtenha não apenas uma **lista das abas do navegador do usuário**, mas também saiba qual **página da web (ou seja, endereço e título) está carregada**.
{% hint style="danger" %}
Não só isso, ouvintes como [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **tornam-se muito mais úteis também**. 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 são necessariamente escritos estaticamente no manifesto da extensão. Dadas suficientes **`host_permissions`**, **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 executar não apenas 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 podem causar estragos se mal utilizadas.
{% hint style="danger" %}
Além das capacidades acima, scripts de conteúdo podem, por exemplo, **interceptar credenciais** à medida que são inseridas em páginas da web. Outra maneira clássica de abusar deles é **injetar publicidade** em cada site. Adicionar **mensagens de golpe** para abusar da credibilidade de sites de notícias também é possível. Finalmente, eles podem **manipular sites bancários** 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 quaisquer privilégios. Qualquer extensão pode ser notificada quando você abre e fecha abas, apenas não saberá a 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 inofensiva. 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-up, `tabs.create()` não está**.&#x20;
{% hint style="danger" %}
Uma extensão pode criar qualquer número de abas sempre que quiser.
{% endhint %}
Se você analisar os possíveis parâmetros de `tabs.create()`, também notará que suas capacidades vão muito além do que `window.open()` tem permissão para controlar. E enquanto o Firefox não permite o uso de URIs `data:` com esta API, o Chrome não tem tal proteção. **O uso de tais URIs no nível superior foi** [**proibido devido ao abuso 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 a `tabs.create()`, mas **modificará uma aba existente**. Então, 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 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 considerável potencial de abuso, então os usuários têm que confirmar cada vez que ainda querem isso.
{% hint style="danger" %}
Não é o caso com extensões de navegador. **Se uma extensão do navegador** [**quer acesso à 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 naquele 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 que a extensão 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údos 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) **do seu manifesto**. Esses privilégios de acesso são então concedidos implicitamente quando a extensão é instalada. Assim, 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 nada.
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). Ela 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 potencial de abuso semelhante, ela permite **ler todos os favoritos através da** [**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 é meramente 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, nenhuma informação sensível deve ser armazenada aqui.
No entanto, empresas de publicidade também poderiam abusar desse armazenamento.
### Mais permissões
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)**.**
## Prevenção <a href="#why-not-restrict-extension-privileges" id="why-not-restrict-extension-privileges"></a>
As políticas de desenvolvedor do Google [proíbem explicitamente](https://developer.chrome.com/docs/webstore/program_policies/#permissions) solicitar mais privilégios do que o necessário para a extensão funcionar. Na minha experiência, essa regra de fato funciona. Só consigo pensar em um caso em que uma extensão do navegador [solicitou privilégios demais](https://palant.info/2020/01/13/pwning-avast-secure-browser-for-fun-and-profit/#selecting-a-target), e essa extensão particular estava sendo distribuída com o navegador em vez de via alguma loja de complementos.
Em alguns casos, os navegadores poderiam fazer melhor para **limitar o potencial de abuso** dos privilégios das extensões. Por exemplo, o Chrome permite a gravação de tela através das APIs [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) ou [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/). O potencial de abuso é baixo porque o primeiro só pode ser iniciado como **resposta a uma ação do usuário** (normalmente clicando no ícone da extensão) enquanto o último traz um prompt para selecionar a janela do aplicativo a ser gravada. Ambos são suficientes para impedir que as extensões comecem a gravar silenciosamente em segundo plano.
No entanto, tais melhorias de segurança tendem a tornar as extensões **menos flexíveis e menos amigáveis ao usuário**. Um bom exemplo aqui é a [permissão activeTab](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission). Seu propósito é tornar desnecessário solicitar privilégios de host para toda a internet. Em vez disso, a **extensão pode acessar a aba atual quando a extensão é ativada explicitamente**, normalmente clicando em seu ícone.
Essa abordagem funciona bem para algumas extensões, particularmente aquelas onde o usuário precisa acionar explicitamente uma ação. Ela **não funciona em cenários onde as extensões têm que realizar seu trabalho automaticamente** no entanto (ou seja, sendo mais conveniente para o usuário) ou onde a ação da extensão não pode ser executada imediatamente e requer preparação.
## **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 maneiras de apoiar o HackTricks:
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**merchandising oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Compartilhe suas dicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>