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 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 la protection de ses utilisateurs en adoptant ces pratiques.
Protéger les comptes de développeur
Le code d'extension est importé et mis à jour via les comptes Google. Si les comptes des développeurs sont compromis, un pirate informatique peut envoyer 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é .
Conserver les groupes sélectifs
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 d'utiliser une connexion HTTP. Supposons que toutes les connexions HTTP les écoutes clandestines 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 fichier manifeste. Les extensions doivent minimiser leurs autorisations en n'enregistrant que les API et les sites Web dont 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 inter-origine
Une extension ne peut utiliser XMLHttpRequest que pour obtenir des ressources à partir d'elle-même et des 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 à tout ce qui se trouve sur developer.chrome.com et les sous-domaines de Google en listant "/*"
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. L'attaquant ne pourrait pas accéder à "https://user_bank_info.com"
ou
interagir avec "https://malicious_website.com"
.
Limiter les champs du 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 l'extension s'appuie et fournissez une inscription de champ spécifique.
Connexion 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://*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. Réduisez au maximum ces fichiers.
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 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": "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. À la place, créez 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, telles que 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 à être pris en charge par un pirate informatique si une page Web malveillante compromet le processus de rendu.
Les tâches sensibles doivent être effectuées dans un processus dédié, tel que le script d'arrière-plan de l'extension. Évitez d'exposer accidentellement les privilèges d'une extension aux scripts de contenu :
- Partez du principe que les messages d'un script de contenu peuvent avoir été créés par un pirate informatique (par exemple, validez et nettoyez toutes les entrées et protégez vos scripts contre les attaques par script 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 des scripts.
- Limitez la portée des actions privilégiées pouvant être déclenchées par des 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 APIchrome.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 pour runtime.onRequestExternal
que si elle attend une communication 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 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, '&').replace(/</g, '<').replace(/"/g, '"');
}