Rafforza la tua sicurezza

Le estensioni hanno accesso a privilegi speciali all'interno del browser, il che le rende un bersaglio appetibile 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.

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 attacco di un potenziale malintenzionato.

Recupero() cross-origin

Un'estensione può utilizzare fetch() e XMLHttpRequest() solo 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 solo la possibilità limitata di accedere a "https://user_bank_info.com" o di 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 tramite il web, in "web_accessible_resources", un'estensione sarà rilevabile dai siti web e dagli utenti malintenzionati.

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

Più risorse accessibili sul web sono disponibili, più canali può sfruttare un potenziale utente malintenzionato. Riduci al minimo questi file.

Includi norme di sicurezza dei contenuti esplicite

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 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 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

Sebbene possa essere più semplice creare elementi HTML dinamicamente con document.write() e innerHTML, l'estensione e le pagine web da cui dipende sono aperte agli attaccanti 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 gli script di contenuti con cautela

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 potrebbero manipolare parti del DOM da cui dipende lo script dei contenuti o sfruttare comportamenti standard web sorprendenti, come gli elementi denominati.
  • 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 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 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.");
});