Rafforza la tua sicurezza

Le estensioni hanno accesso a privilegi speciali all'interno del browser, il che le rende un obiettivo interessante per gli autori di attacchi. Se un'estensione viene compromessa, ogni utente di quell'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.

Utilizzare i ruoli dei membri appropriati

Se il tuo editore ha più membri, assicurati che il ruolo concesso a ogni utente sia appropriato.

Non utilizzare mai HTTP

Quando richiedi o invii dati, evita una connessione HTTP. Supponi che qualsiasi connessione HTTP venga intercettata o contenga modifiche. HTTPS dovrebbe essere sempre preferito, in quanto ha 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 richiesti esplicitamente nel manifest. Le estensioni devono ridurre al minimo le autorizzazioni registrando solo le API e i siti web da cui dipendono.

La limitazione dei privilegi di un'estensione limita ciò che un potenziale malintenzionato può sfruttare.

Cross-origin fetch()

Un'estensione può utilizzare 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 precedente richiede l'accesso a qualsiasi elemento 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'autore dell'attacco avrebbe solo una capacità limitata di accedere a "https://user_bank_info.com" o interagire con "https://malicious_website.com".

Limita i campi manifest

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

Connessione esterna

Utilizza il campo "externally_connectable" per dichiarare con quali estensioni e pagine web esterne l'estensione scambierà informazioni. Limitare le connessioni esterne dell'estensione 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 dal web

Rendere le risorse accessibili dal web, nella sezione "web_accessible_resources", renderà un'estensione rilevabile da siti web e malintenzionati.

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

Più risorse accessibili dal web sono disponibili, più vie un potenziale attaccante può sfruttare. Riduci al minimo questi file.

Includere una policy di sicurezza dei contenuti esplicita

Includi un content security policy per l'estensione nel manifest per impedire attacchi cross-site scripting. Se l'estensione carica solo risorse proprie, 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 WebAssembly o aumentare le restrizioni sulle pagine in 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
}

Evitare document.write() e innerHTML

Sebbene possa essere più semplice creare dinamicamente elementi HTML con document.write() e innerHTML, l'estensione e le pagine web da cui dipende l'estensione sono esposte all'inserimento di script dannosi da parte di malintenzionati. 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);
}

Utilizzare con cautela gli script di contenuti

Sebbene gli script dei 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 potrebbero manipolare parti del DOM da cui dipende lo script dei contenuti o sfruttare comportamenti sorprendenti degli standard web, come gli elementi denominati.
  • Per interagire con il DOM delle pagine web, gli script dei contenuti devono essere eseguiti nello stesso processo di rendering della pagina web. Ciò rende i content script vulnerabili alla perdita di dati tramite attacchi side-channel (ad es. Spectre) e alla violazione da parte di un malintenzionato se una pagina web dannosa compromette il processo di rendering.

Le operazioni che utilizzano dati sensibili (come le informazioni private di un utente) o le API 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:

  • Supponi che i messaggi di uno script dei contenuti possano essere stati creati da un malintenzionato (ad es. convalida e pulisci tutti gli input e proteggi i tuoi script dal cross-site scripting).
  • Supponi che tutti i dati inviati allo script dei contenuti possano essere divulgati alla pagina web. Non inviare dati sensibili (ad es. segreti 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 dei contenuti di attivare richieste a URL arbitrari o di passare argomenti arbitrari a API di estensione (ad es. non consentire il passaggio di URL arbitrari ai metodi fetch() o browser.tabs.create()).

Registrare ed eliminare gli input

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

Un'estensione deve registrarsi solo per runtime.onMessageExternal se prevede di ricevere 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";

browser.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 attentamente per assicurarsi che MessageSender non provenga da uno script dei contenuti compromesso.

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