Rafforza la tua sicurezza

Le estensioni hanno accesso a privilegi speciali all'interno del browser, il che le rende un bersaglio interessante per gli aggressori. Se un'estensione viene compromessa, ogni utente dell'estensione diventa vulnerabile a intrusioni dannose e indesiderate. Mantieni un'estensione sicura e proteggi i suoi utenti incorporando queste pratiche.

Proteggere gli account sviluppatore

Il codice dell'estensione viene caricato e aggiornato tramite gli Account Google. Se gli account degli sviluppatori vengono compromessi, un malintenzionato potrebbe inviare codice dannoso direttamente a tutti gli utenti. Proteggi questi account attivando l'autenticazione a due fattori , preferibilmente con un token di sicurezza.

Mantenere i gruppi selettivi

Se utilizzi la pubblicazione di gruppo, limita il gruppo a sviluppatori attendibili. Non accettare richieste di adesione da persone sconosciute.

Non utilizzare mai HTTP

Quando richiedi o invii dati, evita una connessione HTTP. Supponiamo che tutte le connessioni HTTP presentino intercettazioni o contengano modifiche. È sempre preferibile utilizzare HTTPS, in quanto offre una sicurezza integrata che aggira la maggior parte degli attacchi man in the middle.

Richiedi autorizzazioni minime

Il browser Chrome limita l'accesso di un'estensione ai privilegi che sono stati richiesti esplicitamente nel manifest. Le estensioni devono ridurre al minimo le autorizzazioni registrando solo le API e i siti web di cui hanno bisogno.

Limitare i privilegi di un'estensione limita le possibilità di sfruttamento da parte di un potenziale malintenzionato.

Recupero() cross-origin

Un'estensione può utilizzare solo fetch() e XMLHttpRequest() per recuperare risorse dall'estensione e dai domini specificati nelle autorizzazioni. Tieni presente che le chiamate a entrambi vengono intercettate dall'handler fetch nel service worker.

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "host_permissions": [
    "https://developer.chrome.com/*",
    "https://*.google.com/*"
  ],
  "manifest_version": 3
}

Questa estensione nell'esempio riportato sopra richiede l'accesso a tutti i contenuti su developer.chrome.com e ai sottodomini di Google elencando "https://developer.chrome.com/*" e "https://*.google.com/*" nelle autorizzazioni. Se l'estensione venisse compromessa, avrebbe comunque l'autorizzazione a interagire solo con i siti web che soddisfano il pattern di corrispondenza. L'utente malintenzionato avrebbe soltanto una capacità limitata di accedere a "https://user_bank_info.com" o interagire con "https://malicious_website.com".

Limitare i campi manifest

L'inclusione di chiavi e autorizzazioni non necessarie nel file manifest crea vulnerabilità e rende un'estensione più visibile. Limita i campi manifest a quelli su cui si basa l'estensione.

Con possibilità di connessione esterna

Utilizza il campo "externally_connectable" per dichiarare con quali estensioni ed esterne e pagine web l'estensione scambierà informazioni. Limitare gli utenti esterni con cui l'estensione può connettersi a fonti attendibili.

{
  "name": "Super Safe Extension",
  "externally_connectable": {
    "ids": [
      "iamafriendlyextensionhereisdatas"
    ],
    "matches": [
      "https://developer.chrome.com/*",
      "https://*.google.com/*"
    ],
    "accepts_tls_channel_id": false
  },
  ...
}

Risorse accessibili tramite il web

Se rendi le risorse accessibili sul web, in "web_accessible_resources" un'estensione sarà rilevabile da siti web e utenti malintenzionati.

{
  ...
  "web_accessible_resources": [
    {
      "resources": [ "test1.png", "test2.png" ],
      "matches": [ "https://web-accessible-resources-1.glitch.me/*" ]
    }
  ]
  ...
}

Maggiore è il numero di risorse web disponibili, maggiori sono le opportunità di sfruttamento da parte di un potenziale aggressore. Riduci al minimo questi file.

Includere un criterio di sicurezza dei contenuti espliciti

Includi un criterio di sicurezza del contenuto per l'estensione nel file manifest per impedire gli attacchi cross-site scripting. Se l'estensione carica risorse solo da sola, registra quanto segue:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
   "content_security_policy": {
    "extension_pages": "default-src 'self'"
  },
  "manifest_version": 3
}

Se l'estensione deve utilizzare il Web Assembly o aumentare le limitazioni relative alle pagine in sandbox, è possibile aggiungere:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
   "content_security_policy": {
    "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';",
    "sandboxed_pages":"script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"
  },

  "manifest_version": 3
}

Evitare document.write() e innerHTML

Anche se può essere più semplice creare dinamicamente elementi HTML con document.write() e innerHTML, l'estensione lascia l'estensione e le pagine web da cui dipende l'estensione aperte a utenti malintenzionati che inseriscono script dannosi. Crea manualmente i nodi DOM e utilizza innerText per inserire contenuti dinamici.

function constructDOM() {
  let newTitle = document.createElement('h1');
  newTitle.innerText = host;
  document.appendChild(newTitle);
}

Utilizza con attenzione gli script di contenuti

Sebbene gli script di contenuti si trovino in un mondo isolato, non sono immuni agli attacchi:

  • Gli script di contenuti sono l'unica parte di un'estensione che interagisce direttamente con la pagina web. Per questo motivo, le pagine web ostili possono manipolare parti del DOM da cui dipende lo script dei contenuti o sfruttare il sorprendente comportamento standard del web, ad esempio gli elementi con nome.
  • Per interagire con il DOM delle pagine web, gli script di contenuto devono essere eseguiti nello stesso processo di rendering della pagina web. Ciò rende gli script dei contenuti vulnerabili alla fuga di dati tramite attacchi lato canale (ad es. Spectre) e al controllo da parte di un malintenzionato se una pagina web dannosa compromette il processo del renderer.

Le operazioni che utilizzano dati sensibili (ad esempio le informazioni private di un utente) o API di Chrome con accesso alle funzioni del browser devono essere eseguite nel service worker delle estensioni. Evita di esporre accidentalmente i privilegi delle estensioni agli script di contenuti:

  • Supponiamo che i messaggi di uno script di contenuti possano essere stati creati da un malintenzionato (ad es. convalida e sanitize tutti gli input e proteggi i tuoi script da cross-site scripting).
  • Supponiamo che tutti i dati inviati allo script dei contenuti potrebbero essere divulgati nella pagina web. Non inviare dati sensibili (ad es. secret dell'estensione, dati di altre origini web, cronologia di navigazione) agli script di contenuti.
  • Limita l'ambito delle azioni privilegiate che possono essere attivate dagli script dei contenuti. Non consentire agli script di contenuti di attivare richieste a URL arbitrari o di passare argomenti arbitrari alle API di estensioni (ad es. non consentire il passaggio di URL arbitrari ai metodi fetch() o chrome.tabs.create()).

Registra e convalida gli input

Proteggi un'estensione da script dannosi limitando gli ascoltatori solo a ciò che l'estensione si aspetta, convalidando i mittenti dei dati in entrata e sanificando tutti gli input.

Un'estensione deve registrarsi per runtime.onMessageExternal solo se si aspetta comunicazioni da un sito web o un'estensione esterni. Verifica sempre che il mittente corrisponda a una fonte attendibile.

// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";

chrome.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    if (sender.id === kFriendlyExtensionId)
      doSomething();
});

Anche i messaggi tramite l'evento runtime.onMessage dell'estensione stessa devono essere esaminati per verificare che MessageSender non provenga da uno script di contenuti compromesso.

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  if (request.allowedAction)
    console.log("This is an allowed action.");
});