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

141 lines
15 KiB
Markdown

# BrowExt - permissions & host\_permissions
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## Basic Information
### **`permissions`**
Les permissions sont définies dans le fichier **`manifest.json`** de l'extension en utilisant la propriété **`permissions`** et permettent l'accès à presque tout ce qu'un navigateur peut accéder (Cookies ou Stockage Physique) :
Le manifeste précédent déclare que l'extension nécessite la permission `storage`. Cela signifie qu'elle peut utiliser [l'API de stockage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) pour stocker ses données de manière persistante. Contrairement aux cookies ou aux APIs `localStorage` qui donnent aux utilisateurs un certain niveau de contrôle, **le stockage des extensions ne peut normalement être effacé qu'en désinstallant l'extension**.
Une extension demandera les permissions indiquées dans son fichier **`manifest.json`** et après l'installation de l'extension, vous pouvez **toujours vérifier ses permissions dans votre navigateur**, comme le montre cette image :
<figure><img src="../../.gitbook/assets/image (18).png" alt=""><figcaption></figcaption></figure>
Vous pouvez trouver la [**liste complète des permissions qu'une extension de navigateur Chromium peut demander ici**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) et une [**liste complète pour les extensions Firefox ici**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api\_permissions)**.**
### `host_permissions`
Le paramètre optionnel mais puissant **`host_permissions`** indique avec quels hôtes l'extension pourra interagir via des APIs telles que [`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), et [`tabs`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs).
Les `host_permissions` suivants permettent essentiellement d'accéder à tous les sites web :
```json
"host_permissions": [
"*://*/*"
]
// Or:
"host_permissions": [
"http://*/*",
"https://*/*"
]
// Or:
"host_permissions": [
"<all_urls>"
]
```
Ces hôtes sont ceux auxquels l'extension de navigateur peut accéder librement. Cela est dû au fait qu'une extension de navigateur qui appelle **`fetch("https://gmail.com/")`** n'est pas restreinte par CORS.
## Abus de `permissions` et `host_permissions`
### Onglets
De plus, **`host_permissions`** déverrouille également la fonctionnalité "avancée" de l'[**API tabs**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs). Elles permettent à l'extension d'appeler [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) et non seulement d'obtenir une **liste des onglets du navigateur de l'utilisateur**, mais aussi de savoir quelle **page web (c'est-à-dire l'adresse et le titre) est chargée**.
{% hint style="danger" %}
Non seulement cela, mais des écouteurs comme [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **deviendront également beaucoup plus utiles**. Ceux-ci seront notifiés chaque fois qu'une nouvelle page se charge dans un onglet.
{% endhint %}
### Exécution de scripts de contenu <a href="#running-content-scripts" id="running-content-scripts"></a>
Les scripts de contenu ne sont pas nécessairement écrits statiquement dans le manifeste de l'extension. Avec des **`host_permissions`** suffisants, **les extensions peuvent également les charger dynamiquement en appelant** [**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).
Les deux API permettent d'exécuter non seulement des fichiers contenus dans les extensions en tant que scripts de contenu, mais aussi **du code arbitraire**. La première permet de passer du code JavaScript sous forme de chaîne, tandis que la seconde attend une fonction JavaScript qui est moins sujette aux vulnérabilités d'injection. Cependant, les deux API peuvent causer des ravages si elles sont mal utilisées.
{% hint style="danger" %}
En plus des capacités ci-dessus, les scripts de contenu pourraient par exemple **intercepter des identifiants** au fur et à mesure qu'ils sont saisis sur des pages web. Une autre façon classique de les abuser est **d'injecter de la publicité** sur chaque site web. Ajouter des **messages d'escroquerie** pour abuser de la crédibilité des sites d'actualités est également possible. Enfin, ils pourraient **manipuler des sites bancaires** pour rediriger des transferts d'argent.
{% endhint %}
### Privilèges implicites <a href="#implicit-privileges" id="implicit-privileges"></a>
Certains privilèges d'extension **n'ont pas besoin d'être déclarés explicitement**. Un exemple est l'[API tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) : sa fonctionnalité de base est accessible sans aucun privilège. Toute extension peut être notifiée lorsque vous ouvrez et fermez des onglets, elle ne saura simplement pas avec quel site web ces onglets correspondent.
Cela semble trop inoffensif ? L'[API tabs.create()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) l'est un peu moins. Elle peut être utilisée pour **créer un nouvel onglet**, essentiellement la même chose que [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open) qui peut être appelée par n'importe quel site web. Pourtant, alors que `window.open()` est soumis au **bloqueur de pop-ups, `tabs.create()` ne l'est pas**.
{% hint style="danger" %}
Une extension peut créer n'importe quel nombre d'onglets quand elle le souhaite.
{% endhint %}
Si vous examinez les paramètres possibles de `tabs.create()`, vous remarquerez également que ses capacités vont bien au-delà de ce que `window.open()` est autorisé à contrôler. Et bien que Firefox n'autorise pas l'utilisation de URI `data:` avec cette API, Chrome n'a pas cette protection. **L'utilisation de telles URI au niveau supérieur a été** [**interdite en raison d'abus pour le 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) est très similaire à `tabs.create()` mais va **modifier un onglet existant**. Ainsi, une extension malveillante peut par exemple charger arbitrairement une page publicitaire dans l'un de vos onglets, et elle peut également activer l'onglet correspondant.
### Webcam, géolocalisation et amis <a href="#webcam-geolocation-and-friends" id="webcam-geolocation-and-friends"></a>
Vous savez probablement que les sites web peuvent demander des autorisations spéciales, par exemple pour accéder à votre webcam (outils de visioconférence) ou à votre localisation géographique (cartes). Ce sont des fonctionnalités avec un potentiel d'abus considérable, donc les utilisateurs doivent chaque fois confirmer qu'ils souhaitent toujours cela.
{% hint style="danger" %}
Ce n'est pas le cas avec les extensions de navigateur. **Si une extension de navigateur** [**veut accéder à votre webcam ou microphone**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, elle n'a besoin de demander la permission qu'une seule fois**
{% endhint %}
Typiquement, une extension le fera immédiatement après son installation. Une fois cette invite acceptée, **l'accès à la webcam est possible à tout moment**, même si l'utilisateur n'interagit pas avec l'extension à ce moment-là. Oui, un utilisateur n'acceptera cette invite que si l'extension a vraiment besoin d'accéder à la webcam. Mais après cela, il doit faire confiance à l'extension pour ne rien enregistrer secrètement.
Avec l'accès à [votre localisation géographique exacte](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) ou [au contenu de votre presse-papiers](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard\_API), accorder la permission explicitement est totalement inutile. **Une extension ajoute simplement `geolocation` ou `clipboard` à l'** [**entrée de permissions**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **de son manifeste**. Ces privilèges d'accès sont ensuite accordés implicitement lorsque l'extension est installée. Ainsi, une extension malveillante ou compromise avec ces privilèges peut créer votre profil de mouvement ou surveiller votre presse-papiers pour des mots de passe copiés sans que vous ne remarquiez quoi que ce soit.
Ajouter le mot-clé **`history`** à l'[entrée de permissions](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) du manifeste de l'extension accorde **l'accès à l'** [**API history**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history). Cela permet de récupérer l'historique de navigation complet de l'utilisateur d'un seul coup, sans attendre que l'utilisateur visite à nouveau ces sites web.
La **permission `bookmarks`** a un potentiel d'abus similaire, celle-ci permet **de lire tous les signets via l'** [**API bookmarks**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks).
### Permission de stockage <a href="#the-storage-permission" id="the-storage-permission"></a>
Le stockage de l'extension est simplement une collection clé-valeur, très similaire à [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) que n'importe quel site web pourrait utiliser. Donc, aucune information sensible ne devrait y être stockée.
Cependant, les entreprises de publicité pourraient également abuser de ce stockage.
### Plus de permissions
Vous pouvez trouver la [**liste complète des permissions qu'une extension de navigateur Chromium peut demander ici**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) et une [**liste complète pour les extensions Firefox ici**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api\_permissions)**.**
## Prévention <a href="#why-not-restrict-extension-privileges" id="why-not-restrict-extension-privileges"></a>
La politique des développeurs de Google interdit explicitement aux extensions de demander plus de privilèges que nécessaire pour leur fonctionnalité, atténuant ainsi efficacement les demandes de permissions excessives. Un exemple où une extension de navigateur a dépassé cette limite impliquait sa distribution avec le navigateur lui-même plutôt que par le biais d'un magasin d'add-ons.
Les navigateurs pourraient également limiter davantage l'abus des privilèges d'extension. Par exemple, les [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) et [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) APIs de Chrome, utilisées pour l'enregistrement d'écran, sont conçues pour minimiser les abus. L'API tabCapture ne peut être activée que par une interaction directe de l'utilisateur, comme cliquer sur l'icône de l'extension, tandis que desktopCapture nécessite la confirmation de l'utilisateur pour que la fenêtre soit enregistrée, empêchant ainsi les activités d'enregistrement clandestin.
Cependant, le renforcement des mesures de sécurité entraîne souvent une diminution de la flexibilité et de la convivialité des extensions. La [permission activeTab](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab\_permission) illustre ce compromis. Elle a été introduite pour éliminer la nécessité pour les extensions de demander des privilèges d'hôte sur l'ensemble d'Internet, permettant aux extensions d'accéder uniquement à l'onglet actuel sur activation explicite par l'utilisateur. Ce modèle est efficace pour les extensions nécessitant des actions initiées par l'utilisateur, mais est insuffisant pour celles nécessitant des actions automatiques ou préventives, compromettant ainsi la commodité et la réactivité immédiate.
## **Références**
* [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)
{% hint style="success" %}
Apprenez et pratiquez le Hacking AWS :<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Apprenez et pratiquez le Hacking GCP : <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Soutenir HackTricks</summary>
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop)!
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-nous sur** **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Partagez des astuces de hacking en soumettant des PR aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts GitHub.
</details>
{% endhint %}