Bénéficiez d'une sécurité optimale

Les extensions ont accès à des privilèges spéciaux dans le navigateur, ce qui en fait une cible intéressante pour contre les pirates informatiques. Si la sécurité d'une extension est compromise, chaque utilisateur de cette extension est vulnérable aux les intrusions malveillantes et indésirables. Assurez la sécurité d'une extension et protégez ses utilisateurs en intégrant ces pratiques.

Protéger les comptes de développeur

Le code d'extension est importé et mis à jour via les comptes Google. Si les développeurs comptes sont compromise, un attaquant pourrait pousser du code malveillant directement à tous les utilisateurs. Protégez ces comptes en Créer spécifiquement des comptes de développeur et activer l'authentification à deux facteurs , de préférence à l'aide d'une clé de sécurité .

Maintenir la sélectivité des groupes

Si vous utilisez la publication groupée, limitez-vous aux développeurs de confiance. Refuser demandes d'adhésion provenant de personnes inconnues.

Ne jamais utiliser HTTP

Lorsque vous demandez ou envoyez des données, évitez les connexions HTTP. Supposons que toutes les connexions HTTP les écoutes clandestines ou contiennent des modifications. Il est préférable d'utiliser le protocole HTTPS, en contournant la plupart des attaques MITM ("man in the middle").

Demander des autorisations minimales

Le navigateur Chrome limite l'accès d'une extension aux droits qui ont été explicitement demandés dans le fichier manifeste. Les extensions doivent réduire leurs autorisations en n'enregistrant que les API et sites Web sur lesquels elles dépendent. Le code arbitraire doit être réduit au minimum.

Limiter les privilèges d’une extension limite ce qu’un attaquant potentiel peut exploiter.

XMLHttpRequest multi-origine

Une extension ne peut utiliser XMLHttpRequest que pour obtenir des ressources provenant d'elle-même et de domaines. spécifiés dans les autorisations.

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

Cette extension demande l'accès à tous les contenus du site developer.chrome.com et les sous-domaines de Google en listant "/*" et "https://*google.com/" dans les autorisations. Si le l'extension ne serait toujours autorisée qu'à interagir avec les sites Web qui répondent le motif de correspondance. L'attaquant ne pourrait pas accéder à "https://user_bank_info.com" ou interagir avec "https://malicious_website.com".

Limiter les champs de fichier manifeste

L'inclusion d'enregistrements inutiles dans le fichier manifeste crée des failles et rend une extension plus visible. Limitez les champs du fichier manifeste à ceux sur lesquels repose l'extension et attribuez un champ spécifique l'enregistrement.

Connexion externe

Utilisez le champ externally_connectable pour déclarer les extensions et pages Web externes avec lequel l'extension échangera des informations. Limiter les personnes auxquelles l'extension peut se connecter en externe de sources fiables.

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

Ressources accessibles sur le Web

En rendant les ressources accessibles sur le Web, sous web_accessible_resources, vous créez une détectable par les sites Web et les pirates informatiques.

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

Plus les ressources disponibles sur le Web sont accessibles, plus les pirates informatiques potentiels peuvent exploiter des possibilités. Conserver ces fichiers à un minimum.

Inclure un règlement relatif à la sécurité du contenu explicite

Incluez un Content Security Policy pour l'extension dans le fichier manifeste afin d'empêcher l'affichage sur plusieurs sites attaques par script. Si l'extension ne charge que des ressources à partir d'elle-même, enregistrez les éléments suivants:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self'"
  "manifest_version": 2
}

Si l'extension doit inclure des scripts provenant d'hôtes spécifiques, vous pouvez l'inclure:

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

Éviter les API exécutables

Les API qui exécutent du code doivent être remplacées par des alternatives plus sûres.

document.write() et innerHTML

Bien qu'il soit plus simple de créer des éléments HTML de manière dynamique avec document.write() et innerHTML, l'extension, ainsi que les pages Web dont dépend l'extension, la laisse ouverte aux pirates informatiques des scripts malveillants. Créez plutôt manuellement des nœuds DOM et utilisez innerText pour insérer du contenu dynamique.

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

eval()

Évitez autant que possible d'utiliser eval() pour éviter les attaques, car eval() exécutera tout code transmis. qui peuvent être malveillants.

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

Privilégiez plutôt des méthodes plus sûres et plus rapides, comme 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();

Utiliser les scripts de contenu avec précaution

Bien que les scripts de contenu vivent dans un monde isolé, ils ne sont pas à l'abri des attaques:

  • Les scripts de contenu sont la seule partie d'une extension qui interagit directement avec la page Web. Pour cette raison, des pages Web hostiles peuvent manipuler des parties du DOM dont dépend le script du contenu, ou exploiter des comportements surprenants des standards Web, comme des éléments nommés.
  • Pour interagir avec le DOM des pages Web, les scripts de contenu doivent s'exécuter dans le même processus de moteur de rendu que la page Web. Cela rend les scripts de contenu vulnérables aux fuites de données via des attaques par canal secondaire. (par exemple, Spectre), et se faire prendre le contrôle d'un pirate informatique si une page Web malveillante est piratée le processus du moteur de rendu.

Les tâches sensibles doivent être effectuées dans le cadre d'un processus dédié, par exemple en ce qui concerne les antécédents de l'extension script. Évitez d'exposer accidentellement des droits d'extension à des scripts de contenu:

  • Supposons que les messages provenant d'un script de contenu ont peut-être été créés par un pirate informatique (par exemple, valider et nettoyer toutes les entrées et protéger vos scripts contre les scripts intersites).
  • Supposons que toutes les données envoyées au script de contenu puissent fuir vers la page Web. Ne pas envoyer de données sensibles (par exemple, les secrets de l'extension, les données provenant d'autres origines Web, l'historique de navigation) au contenu les scripts.
  • Limitez la portée des actions privilégiées pouvant être déclenchées par les scripts de contenu. Ne pas autoriser des scripts de contenu pour déclencher des requêtes sur des URL arbitraires ou transmettre des arguments arbitraires API d'extension (par exemple, il est interdit de transmettre des URL arbitraires dans fetch ou API chrome.tabs.create).

Enregistrer et nettoyer les entrées

Protéger une extension des scripts malveillants en limitant les écouteurs à la seule extension de vérifier les expéditeurs des données entrantes et de nettoyer toutes les entrées.

Une extension ne doit s'enregistrer que pour runtime.onRequestExternal, si elle doit attendre les communications d'un site Web ou d'une extension externe. Vérifiez toujours que l'expéditeur correspond à source fiable.

// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";

chrome.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    if (sender.id === kFriendlyExtensionId)
      doSomething();
});

Même les messages via l'événement runtime.onMessage de l'extension elle-même doivent être examinés de près pour Vérifiez que MessageSender ne provient pas d'un script de contenu compromis.

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

Empêchez une extension d'exécuter le script d'un pirate en nettoyant les entrées utilisateur y compris à partir de l'extension elle-même et de sources approuvées. Évitez les API exécutables.

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