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 attrayante pour les pirates informatiques. Si une extension est compromise, tous les utilisateurs de cette extension deviennent vulnérables aux intrusions malveillantes et indésirables. Pour assurer la sécurité d'une extension et protéger ses utilisateurs, appliquez ces pratiques.

Protéger les comptes de développeur

Le code de l'extension est importé et mis à jour via des comptes Google. Si les comptes d'un développeur sont compromis, un pirate informatique peut transmettre du code malveillant directement à tous les utilisateurs. Protégez ces comptes en activant l'authentification à deux facteurs , de préférence avec une clé de sécurité.

Conserver les groupes sélectifs

Si vous utilisez l'édition de groupe, limitez le groupe aux développeurs de confiance. N'acceptez pas de demandes d'adhésion de la part de personnes inconnues.

Ne jamais utiliser HTTP

Lorsque vous demandez ou envoyez des données, évitez d'utiliser une connexion HTTP. Supposons que toutes les connexions HTTP soient interceptées ou contiennent des modifications. HTTPS doit toujours être privilégié, car il intègre une sécurité qui contourne la plupart des attaques MITM.

Demander des autorisations minimales

Le navigateur Chrome limite l'accès d'une extension aux droits qui ont été explicitement demandés dans le manifest. Les extensions doivent minimiser leurs autorisations en n'enregistrant que les API et les sites Web dont elles dépendent.

Limiter les droits d'une extension limite ce qu'un pirate informatique potentiel peut exploiter.

Extraire() multi-origine

Une extension ne peut utiliser que fetch() et XMLHttpRequest() pour obtenir des ressources à partir de l'extension et des domaines spécifiés dans les autorisations. Notez que les appels aux deux sont interceptés par le gestionnaire fetch dans le 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
}

Dans l'exemple ci-dessus, cette extension demande l'accès à tout ce qui se trouve sur developer.chrome.com et les sous-domaines de Google en listant "https://developer.chrome.com/*" et "https://*.google.com/*" dans les autorisations. Si l'extension était compromise, elle n'aurait toujours l'autorisation d'interagir qu'avec les sites Web qui répondent au modèle de correspondance. Le pirate informatique ne pourrait accéder qu'à "https://user_bank_info.com" ou interagir avec "https://malicious_website.com" de manière limitée.

Limiter les champs du fichier manifeste

L'inclusion de clés et d'autorisations inutiles dans le fichier manifeste crée des failles et rend une extension plus visible. Limitez les champs du fichier manifeste à ceux sur lesquels l'extension s'appuie.

Connectable en externe

Utilisez le champ "externally_connectable" pour déclarer les extensions externes et les pages Web avec lesquelles l'extension échangera des informations. Limitez les sources approuvées auxquelles l'extension peut se connecter en externe.

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

Ressources accessibles sur le Web

Rendre les ressources accessibles via le Web, sous "web_accessible_resources", rend une extension détectable par les sites Web et les pirates informatiques.

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

Plus les ressources disponibles sur le Web sont accessibles, plus les pirates informatiques potentiels peuvent exploiter des possibilités. Réduisez au maximum ces fichiers.

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

Incluez une règle de sécurité du contenu pour l'extension dans le fichier manifeste afin d'éviter les attaques de script intersites. Si l'extension ne charge des ressources que 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": {
    "extension_pages": "default-src 'self'"
  },
  "manifest_version": 3
}

Si l'extension doit utiliser un assembly Web ou augmenter les restrictions sur les pages en bac à sable, vous pouvez les ajouter:

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

Éviter document.write() et innerHTML

Bien qu'il puisse être plus simple de créer dynamiquement des éléments HTML avec document.write() et innerHTML, cela laisse l'extension et les pages Web sur lesquelles elle dépend ouvertes aux pirates informatiques qui insèrent 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);
}

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. Par conséquent, les pages Web hostiles peuvent manipuler des parties du DOM sur lesquelles le script de contenu dépend ou exploiter un comportement standard Web surprenant, comme les é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 auxiliaire (par exemple, Spectre), et être pris le contrôle d'un pirate informatique si une page Web malveillante compromet le processus de rendu.

Les opérations utilisant des données sensibles (telles que les informations privées d'un utilisateur) ou des API Chrome ayant accès aux fonctions du navigateur doivent être effectuées dans le service worker des extensions. Évitez d'exposer accidentellement les privilèges d'une extension aux scripts de contenu:

  • Supposons que des messages provenant d'un script de contenu aient été créés par un pirate informatique (par exemple, validez et nettoyez toutes les entrées, et protégez vos scripts contre les scripts intersites).
  • Supposons que toutes les données envoyées au script de contenu puissent fuiter vers la page Web. N'envoyez pas de données sensibles (par exemple, des secrets de l'extension, des données provenant d'autres origines Web, l'historique de navigation) aux scripts de contenu.
  • Limitez la portée des actions privilégiées pouvant être déclenchées par des scripts de contenu. N'autorisez pas les scripts de contenu à déclencher des requêtes vers des URL arbitraires ni à transmettre des arguments arbitraires aux API d'extension (par exemple, n'autorisez pas la transmission d'URL arbitraires aux méthodes fetch() ou chrome.tabs.create()).

Enregistrer et nettoyer les entrées

Protégez une extension contre les scripts malveillants en limitant les écouteurs à ce que l'extension attend, en validant les expéditeurs des données entrantes et en nettoyant toutes les entrées.

Une extension ne doit s'enregistrer pour runtime.onMessageExternal que si elle attend une communication de la part d'un site Web ou d'une extension externe. Vérifiez toujours que l'expéditeur correspond à une 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 pour s'assurer que le 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.");
});