Rafforza la tua sicurezza

Le estensioni hanno accesso a privilegi speciali all'interno del browser, il che le rende un target interessante per gli aggressori. Se un'estensione viene compromessa, ogni utente di quell'estensione diventa vulnerabile a intrusioni dannose e indesiderate. Garantisci la sicurezza di un'estensione e dei suoi utenti incorporando queste pratiche.

Proteggere gli account sviluppatore

Il codice dell'estensione viene caricato e aggiornato tramite gli Account Google. Se gli sviluppatori account sono compromessi, un aggressore potrebbe inviare codice dannoso direttamente a tutti gli utenti. Proteggi questi account creando appositamente account sviluppatore e 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 agli sviluppatori attendibili. Non accettare richieste di adesione da persone sconosciute.

Non usare mai HTTP

Evita una connessione HTTP quando richiedi o invii dati. Supponiamo che le connessioni HTTP presentano intercettazioni o contengono modifiche. È sempre preferibile utilizzare HTTPS in quanto sono integrati sicurezza 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 in il manifest. Le estensioni dovrebbero ridurre al minimo le autorizzazioni registrando solo API 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 solo XMLHttpRequest per ottenere risorse da se stessa e dai domini specificato 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 contenuto su developer.chrome.com e sottodomini di Google tramite elenca "/*" e "https://*google.com/" nelle autorizzazioni. Se se un'estensione è stata compromessa, avrebbe comunque l'autorizzazione per interagire soltanto con i siti web lo schema di corrispondenza. L'utente malintenzionato non riuscirebbe ad accedere a "https://user_bank_info.com" o interagire con "https://malicious_website.com".

Limita i campi del manifest

L'inclusione di registrazioni non necessarie nel file manifest crea vulnerabilità e crea un'estensione più visibile. Limita i campi manifest a quelli su cui si basa l'estensione e assegna un campo specifico registrazione.

Collegabili esternamente

Utilizza il campo externally_connectable per dichiarare quali estensioni e pagine web esterne scambia informazioni. Limita gli utenti a cui l'estensione può connettersi esternamente da fonti attendibili.

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

Risorse accessibili dal web

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

{
  ...
  "web_accessible_resources": [
    "images/*.png",
    "style/secure_extension.css",
    "script/secure_extension.js"
  ],
  ...
}

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

Includere un criterio di sicurezza dei contenuti espliciti

Includi un criterio di sicurezza del contenuto per l'estensione nel file manifest in modo da evitare di attacchi di 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": "default-src 'self'"
  "manifest_version": 2
}

Se l'estensione deve includere script di host specifici, è possibile includerli:

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

Evita le API eseguibili

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

document.write() e innerHTML

Anche se può essere più semplice creare in modo dinamico elementi HTML con document.write() e innerHTML, lascia l'estensione e le pagine web da cui dipende l'estensione, aperte agli autori di attacchi 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);
}

eval()

Evita di utilizzare eval() quando possibile per prevenire gli attacchi, poiché eval() eseguirà qualsiasi codice passato 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();

Utilizza con attenzione i script di contenuti

Anche se gli script di contenuti risiedono in un mondo isolato, non sono immuni dagli 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 un comportamento standard del web sorprendente, come gli elementi con nome.
  • Per interagire con il DOM delle pagine web, gli script dei contenuti devono essere eseguiti nello stesso processo del renderer delle pagine la pagina web. Di conseguenza gli script di contenuti sono vulnerabili alla fuga di dati da attacchi a canale laterale (ad es. Spectre) e alla violazione da parte di un utente malintenzionato nel caso in cui una pagina web dannosa venga compromessa. il processo del renderer.

Le attività sensibili devono essere eseguite in un processo dedicato, ad esempio sui background dell'estensione. script. Evita di esporre accidentalmente i privilegi delle estensioni agli script di contenuti:

  • Supponi che i messaggi provenienti da uno script di contenuti possano essere stati creati da un utente malintenzionato (ad es. convalida e sanitizza tutti gli input e proteggi i tuoi script dal cross-site scripting.
  • Supponi che i dati inviati allo script di contenuti possano essere divulgati alla pagina web. Non inviare dati sensibili (ad es. segreti dell'estensione, dati provenienti da altre origini web, cronologia di navigazione) ai contenuti script.
  • Limita l'ambito delle azioni privilegiate che possono essere attivate dagli script di contenuti. Non consentire script di contenuti per attivare richieste a URL arbitrari o passare argomenti arbitrari a API delle estensioni (ad es. non consentire il trasferimento di URL arbitrari a fetch o l'API chrome.tabs.create).

Registra e sanitizza gli input

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

Un'estensione deve essere registrata per runtime.onRequestExternal solo se è in attesa comunicazioni da un sito web o un'estensione esterni. Verifica sempre che il mittente corrisponda a un 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 provenienti dall'estensione stessa devono essere esaminati per Assicurati 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.");
});

Impedisci a un’estensione di eseguire lo script di un aggressore sanificando gli input utente e anche dall'estensione stessa e da origini approvate. Evita le API eseguibili.

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