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 i suoi utenti protetti 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 creando account sviluppatore specifici e attivando l'autenticazione a due fattori , preferibilmente con un token di sicurezza .

Mantieni i gruppi selettivi

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

Non utilizzare mai HTTP

Quando richiedi o invii dati, evita una connessione HTTP. Supponi che qualsiasi connessione HTTP venga intercettata o contenga modifiche. HTTPS deve essere sempre preferito, in quanto ha una sicurezza integrata che aggira la maggior parte degli attacchi man in the middle.

Richiedere 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. Il codice arbitrario deve essere ridotto al minimo.

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

XMLHttpRequest multiorigine

Un'estensione può utilizzare XMLHttpRequest solo per ottenere risorse da se stessa e dai domini specificati nelle autorizzazioni.

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

Questa estensione richiede l'accesso a qualsiasi elemento su developer.chrome.com e sui sottodomini di Google elencando "/*" 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 non sarebbe in grado di accedere a "https://user_bank_info.com" o interagire con "https://malicious_website.com".

Limitare i campi manifest

L'inclusione di registrazioni non necessarie nel manifest crea vulnerabilità e rende un'estensione più visibile. Limita i campi manifest a quelli su cui si basa l'estensione e fornisci una registrazione specifica dei campi.

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 origini attendibili.

{
  "name": "Super Safe Extension",
  "externally_connectable": {
    "ids": [
      "iamafriendlyextensionhereisdatas"
    ],
    "matches": [
      "/*",
      "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": [
    "images/*.png",
    "style/secure_extension.css",
    "script/secure_extension.js"
  ],
  ...
}

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

Includere una policy di sicurezza dei contenuti esplicita

Includi un criterio di sicurezza del contenuto 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": "default-src 'self'"
  "manifest_version": 2
}

Se l'estensione deve includere script di host specifici, questi possono essere inclusi:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self' https://extension.resource.com"
  "manifest_version": 2
}

Evitare le API eseguibili

Le API che eseguono codice devono essere sostituite con alternative più sicure.

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);
}

eval()

Evita di utilizzare eval() quando possibile per prevenire attacchi, in quanto eval() eseguirà qualsiasi codice passato al suo interno, che potrebbe essere dannoso.

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // WARNING! Might be evaluating an evil script!
    var resp = eval("(" + xhr.responseText + ")");
    ...
  }
}
xhr.send();

Preferisci invece metodi più sicuri e veloci, come JSON.parse()

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // JSON.parse does not evaluate the attacker's scripts.
    var resp = JSON.parse(xhr.responseText);
  }
}
xhr.send();

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.

Il lavoro sensibile deve essere eseguito in un processo dedicato, ad esempio lo script in background dell'estensione. 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 dei 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 alle API delle estensioni (ad es. non consentire il passaggio di URL arbitrari alle API fetch o chrome.tabs.create).

Registrare ed eliminare gli input

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

Un'estensione dovrebbe registrarsi solo per runtime.onRequestExternal se prevede 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 attentamente per assicurarsi che MessageSender non provenga da uno script dei contenuti compromesso.

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

Impedisci a un'estensione di eseguire lo script di un malintenzionato sanificando gli input dell'utente e i dati in entrata, anche dall'estensione stessa e da fonti approvate. Evita le API eseguibili.

function sanitizeInput(input) {
    return input.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/"/g, '&quot;');
}