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

141 lines
14 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`**
I permessi sono definiti nel file **`manifest.json`** dell'estensione utilizzando la proprietà **`permissions`** e consentono l'accesso a quasi tutto ciò a cui un browser può accedere (Cookie o Archiviazione Fisica):
Il manifest precedente dichiara che l'estensione richiede il permesso `storage`. Questo significa che può utilizzare [l'API di archiviazione](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) per memorizzare i propri dati in modo persistente. A differenza dei cookie o delle API `localStorage` che offrono agli utenti un certo livello di controllo, **l'archiviazione dell'estensione può normalmente essere cancellata solo disinstallando l'estensione**.
Un'estensione richiederà i permessi indicati nel suo file **`manifest.json`** e dopo aver installato l'estensione, puoi **sempre controllare i suoi permessi nel tuo browser**, come mostrato in questa immagine:
<figure><img src="../../.gitbook/assets/image (18).png" alt=""><figcaption></figcaption></figure>
Puoi trovare la [**lista completa dei permessi che un'estensione del browser Chromium può richiedere qui**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) e una [**lista completa per le estensioni di Firefox qui**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api\_permissions)**.**
### `host_permissions`
L'impostazione facoltativa ma potente **`host_permissions`** indica con quali host l'estensione sarà in grado di interagire tramite API come [`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).
I seguenti `host_permissions` consentono fondamentalmente a ogni web:
```json
"host_permissions": [
"*://*/*"
]
// Or:
"host_permissions": [
"http://*/*",
"https://*/*"
]
// Or:
"host_permissions": [
"<all_urls>"
]
```
Questi sono gli host a cui l'estensione del browser può accedere liberamente. Questo perché quando un'estensione del browser chiama **`fetch("https://gmail.com/")`** non è soggetta a restrizioni CORS.
## Abusare di `permissions` e `host_permissions`
### Tabs
Inoltre, **`host_permissions`** sblocca anche la funzionalità “avanzata” [**tabs API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **.** Consentono all'estensione di chiamare [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) e non solo di ottenere un **elenco delle schede del browser dell'utente** ma anche di scoprire quale **pagina web (cioè indirizzo e titolo) è caricata**.
{% hint style="danger" %}
Non solo, i listener come [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **diventano molto più utili**. Questi verranno notificati ogni volta che una nuova pagina viene caricata in una scheda.
{% endhint %}
### Esecuzione di script di contenuto <a href="#running-content-scripts" id="running-content-scripts"></a>
Gli script di contenuto non devono necessariamente essere scritti staticamente nel manifesto dell'estensione. Date sufficienti **`host_permissions`**, **le estensioni possono anche caricarli dinamicamente chiamando** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **o** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript).
Entrambi gli API consentono di eseguire non solo file contenuti nelle estensioni come script di contenuto, ma anche **codice arbitrario**. Il primo consente di passare codice JavaScript come stringa, mentre il secondo si aspetta una funzione JavaScript che è meno soggetta a vulnerabilità di iniezione. Tuttavia, entrambi gli API possono causare danni se usati in modo improprio.
{% hint style="danger" %}
Oltre alle capacità sopra, gli script di contenuto potrebbero ad esempio **intercettare le credenziali** mentre vengono inserite nelle pagine web. Un altro modo classico per abusarne è **iniettare pubblicità** su ogni singolo sito web. Aggiungere **messaggi truffa** per abusare della credibilità dei siti di notizie è anche possibile. Infine, potrebbero **manipolare i siti web bancari** per reindirizzare i trasferimenti di denaro.
{% endhint %}
### Privilegi impliciti <a href="#implicit-privileges" id="implicit-privileges"></a>
Alcuni privilegi delle estensioni **non devono essere dichiarati esplicitamente**. Un esempio è l'[API tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs): la sua funzionalità di base è accessibile senza alcun privilegio. Qualsiasi estensione può essere notificata quando apri e chiudi schede, semplicemente non saprà a quale sito web corrispondono queste schede.
Sembra troppo innocuo? L'[API tabs.create()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) è un po' meno così. Può essere utilizzata per **creare una nuova scheda**, essenzialmente la stessa di [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open) che può essere chiamata da qualsiasi sito web. Eppure, mentre `window.open()` è soggetta al **blocco dei pop-up, `tabs.create()` non lo è**.
{% hint style="danger" %}
Un'estensione può creare qualsiasi numero di schede ogni volta che vuole.
{% endhint %}
Se guardi attraverso i possibili parametri di `tabs.create()`, noterai anche che le sue capacità vanno ben oltre ciò che `window.open()` è autorizzata a controllare. E mentre Firefox non consente l'uso di URI `data:` con questa API, Chrome non ha tale protezione. **L'uso di tali URI a livello superiore è stato** [**vietato a causa di abusi per 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) è molto simile a `tabs.create()` ma **modificherà una scheda esistente**. Quindi un'estensione malevola può ad esempio caricare arbitrariamente una pagina pubblicitaria in una delle tue schede e può attivare anche la scheda corrispondente.
### Webcam, geolocalizzazione e amici <a href="#webcam-geolocation-and-friends" id="webcam-geolocation-and-friends"></a>
Probabilmente sai che i siti web possono richiedere permessi speciali, ad esempio per accedere alla tua webcam (strumenti di videoconferenza) o alla tua posizione geografica (mappe). Sono funzionalità con un potenziale considerevole per abusi, quindi gli utenti devono confermare ogni volta che vogliono ancora questo.
{% hint style="danger" %}
Non così con le estensioni del browser. **Se un'estensione del browser** [**vuole accedere alla tua webcam o al microfono**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, ha bisogno di chiedere il permesso solo una volta**
{% endhint %}
Tipicamente, un'estensione lo farà immediatamente dopo essere stata installata. Una volta che questo avviso è accettato, **l'accesso alla webcam è possibile in qualsiasi momento**, anche se l'utente non sta interagendo con l'estensione in quel momento. Sì, un utente accetterà questo avviso solo se l'estensione ha davvero bisogno dell'accesso alla webcam. Ma dopo devono fidarsi dell'estensione per non registrare nulla di nascosto.
Con accesso alla [tua esatta posizione geografica](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) o [contenuti degli appunti](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard\_API), concedere il permesso esplicitamente è del tutto superfluo. **Un'estensione aggiunge semplicemente `geolocation` o `clipboard` all'** [**voce dei permessi**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **del suo manifesto**. Questi privilegi di accesso vengono quindi concessi implicitamente quando l'estensione viene installata. Quindi un'estensione malevola o compromessa con questi privilegi può creare il tuo profilo di movimento o monitorare i tuoi appunti per le password copiate senza che tu te ne accorga.
Aggiungere la parola chiave **`history`** all'[voce dei permessi](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) del manifesto dell'estensione concede **accesso all'** [**API history**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history). Consente di recuperare l'intera cronologia di navigazione dell'utente tutto in una volta, senza aspettare che l'utente visiti nuovamente questi siti web.
Il **permesso `bookmarks`** ha un potenziale di abuso simile, questo consente **di leggere tutti i segnalibri tramite l'** [**API bookmarks**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/bookmarks).
### Permesso di archiviazione <a href="#the-storage-permission" id="the-storage-permission"></a>
L'archiviazione dell'estensione è semplicemente una raccolta chiave-valore, molto simile a [localStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) che qualsiasi sito web potrebbe utilizzare. Quindi nessuna informazione sensibile dovrebbe essere memorizzata qui.
Tuttavia, le aziende pubblicitarie potrebbero anche abusare di questo spazio di archiviazione.
### Maggiori permessi
Puoi trovare la [**lista completa dei permessi che un'estensione del browser Chromium può richiedere qui**](https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions#permissions) e una [**lista completa per le estensioni Firefox qui**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#api\_permissions)**.**
## Prevenzione <a href="#why-not-restrict-extension-privileges" id="why-not-restrict-extension-privileges"></a>
La politica degli sviluppatori di Google vieta esplicitamente alle estensioni di richiedere più privilegi di quanto necessario per la loro funzionalità, mitigando efficacemente le richieste eccessive di permessi. Un caso in cui un'estensione del browser ha oltrepassato questo confine ha coinvolto la sua distribuzione con il browser stesso piuttosto che attraverso un negozio di componenti aggiuntivi.
I browser potrebbero ulteriormente limitare l'abuso dei privilegi delle estensioni. Ad esempio, le API [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) e [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) di Chrome, utilizzate per la registrazione dello schermo, sono progettate per ridurre al minimo gli abusi. L'API tabCapture può essere attivata solo attraverso l'interazione diretta dell'utente, come cliccare sull'icona dell'estensione, mentre desktopCapture richiede la conferma dell'utente per la finestra da registrare, prevenendo attività di registrazione clandestina.
Tuttavia, inasprire le misure di sicurezza spesso comporta una diminuzione della flessibilità e della facilità d'uso delle estensioni. Il [permesso activeTab](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab\_permission) illustra questo compromesso. È stato introdotto per eliminare la necessità per le estensioni di richiedere privilegi host su tutta Internet, consentendo alle estensioni di accedere solo alla scheda corrente su attivazione esplicita da parte dell'utente. Questo modello è efficace per le estensioni che richiedono azioni avviate dall'utente, ma non è sufficiente per quelle che richiedono azioni automatiche o preventive, compromettendo così la comodità e la reattività immediata.
## **Riferimenti**
* [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" %}
Impara e pratica 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">\
Impara e pratica 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>Supporta HackTricks</summary>
* Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
</details>
{% endhint %}