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 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 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, '&').replace(/</g, '<').replace(/"/g, '"');
}