Rafforza la tua sicurezza

Le estensioni hanno accesso a privilegi speciali all'interno del browser, il che le rende un bersaglio accattivante per gli utenti malintenzionati. Se un'estensione viene compromessa, ogni utente di quell'estensione diventa vulnerabile a intrusioni dannose e indesiderate. Garantisci la sicurezza di un'estensione e la protezione dei 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 utente 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.

Mantieni selettivi i gruppi

Se utilizzi la pubblicazione di gruppo, mantieni il gruppo limitato 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 le connessioni HTTP siano intercettate o contengano modifiche. HTTPS dovrebbe sempre essere preferibile, poiché dispone di sicurezza integrata che elude la maggior parte degli attacchi man in the middle.

Richiedi autorizzazioni minime

Il browser Chrome limita l'accesso di un'estensione ai privilegi richiesti esplicitamente nel file manifest. Le estensioni dovrebbero ridurre al minimo le autorizzazioni registrando solo le API e i siti web da cui dipendono.

Limitare i privilegi di un'estensione limita ciò che un potenziale aggressore può sfruttare.

fetch() multiorigine

Un'estensione può usare solo fetch() e XMLHttpRequest() per ottenere risorse dall'estensione e dai domini specificati nelle autorizzazioni. Tieni presente che le chiamate a entrambi vengono intercettate dal gestore 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 sopra richiede l'accesso a qualsiasi contenuto su developer.chrome.com e nei sottodomini di Google inserendo "https://developer.chrome.com/*" e "https://*.google.com/*" nelle autorizzazioni. Se l'estensione venisse compromessa, avrebbe comunque l'autorizzazione per interagire solo con i siti web che soddisfano il pattern di corrispondenza. L'utente malintenzionato avrebbe una capacità limitata di accedere a "https://user_bank_info.com" o di interagire con "https://malicious_website.com".

Limita i campi del file manifest

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

Collegabile esternamente

Utilizza il campo "externally_connectable" per dichiarare con quali estensioni esterne e pagine web l'estensione scambierà informazioni. Limita le persone con cui l'estensione può connettersi esternamente alle origini attendibili.

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

Risorse accessibili dal web

Se rendi le risorse accessibili tramite il web, all'interno della "web_accessible_resources" un'estensione potrà essere rilevata da siti web e utenti malintenzionati.

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

Più risorse sono disponibili sul web, maggiori sono le opportunità che un potenziale aggressore può sfruttare. Mantieni questi file al minimo.

Includere criteri di sicurezza dei contenuti espliciti

Includi un criterio di sicurezza dei contenuti per l'estensione nel manifest per prevenire attacchi di scripting tra siti. Se l'estensione carica le risorse solo da se stessa, 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 Web Assembly o aumentare le limitazioni sulle pagine con sandbox, è possibile aggiungerle:

{
  "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
}

Evita document.write() e innerHTML

Anche se potrebbe essere più semplice creare dinamicamente elementi HTML con document.write() e innerHTML, l'estensione e le pagine web da cui dipende l'estensione rimangono aperte ai malintenzionati che inseriscono script dannosi. Puoi invece creare manualmente i nodi DOM e utilizzare innerText per inserire contenuti dinamici.

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

Usa con attenzione gli script di contenuti

Anche se i script di contenuti risiedono 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 potrebbero manipolare parti del DOM da cui dipende lo script dei contenuti o sfruttare un comportamento standard web sorprendente, ad esempio gli elementi con nome.
  • Per interagire con il DOM delle pagine web, gli script di contenuti devono essere eseguiti nello stesso processo di rendering della pagina web. Ciò rende gli script di contenuti vulnerabili alla fuga di dati tramite attacchi al canale laterale (ad es. Spectre) e che viene intasato da un utente 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 siano stati creati da un utente malintenzionato (ad es. convalida e sanitizza tutti gli input e proteggi i tuoi script da cross-site scripting).
  • Supponiamo che i dati inviati allo script dei contenuti possano essere trasmessi alla 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 con privilegi che possono essere attivate dagli script di contenuti. Non consentire agli script di contenuti di attivare richieste a URL arbitrari o di passare argomenti arbitrari alle API di estensione (ad esempio, non consentire il trasferimento di URL arbitrari ai metodi fetch() o chrome.tabs.create()).

Registra e sanitizza 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 arrivo e sanitizzando tutti gli input.

Un'estensione deve essere registrata per runtime.onMessageExternal solo se prevede la comunicazione da un'estensione o un sito web esterno. 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 inviati tramite evento runtime.onMessage dall'estensione stessa devono essere esaminati per assicurarti 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.");
});