Extensies hebben toegang tot speciale privileges binnen de browser, waardoor ze een aantrekkelijk doelwit zijn voor aanvallers. Als een extensie wordt gehackt, worden alle gebruikers van die extensie kwetsbaar voor kwaadaardige en ongewenste indringing. Houd een extensie veilig en de gebruikers ervan beschermd door deze maatregelen te nemen.
Bescherm ontwikkelaarsaccounts
Extensiecode wordt geüpload en bijgewerkt via Google-accounts. Als de accounts van ontwikkelaars worden gehackt, kan een aanvaller kwaadaardige code rechtstreeks naar alle gebruikers verspreiden. Bescherm deze accounts door specifieke ontwikkelaarsaccounts aan te maken en tweefactorauthenticatie in te schakelen, bij voorkeur met een beveiligingssleutel .
Houd groepen selectief
Als u groepspublicatie gebruikt, beperk de groep dan tot vertrouwde ontwikkelaars. Accepteer geen lidmaatschapsverzoeken van onbekende personen.
Gebruik nooit HTTP, nooit.
Vermijd HTTP-verbindingen bij het opvragen of verzenden van gegevens. Ga ervan uit dat HTTP-verbindingen afluisteraars bevatten of gemanipuleerd kunnen worden. HTTPS heeft altijd de voorkeur, omdat het ingebouwde beveiliging biedt die de meeste man-in-the-middle-aanvallen omzeilt.
Vraag om minimale machtigingen
De Chrome-browser beperkt de toegang van een extensie tot privileges die expliciet in het manifest zijn aangevraagd. Extensies moeten hun machtigingen minimaliseren door alleen API's en websites te registreren waarvan ze afhankelijk zijn. Willekeurige code moet tot een minimum beperkt worden.
Door de privileges van een extensie te beperken, wordt de mogelijkheid voor een potentiële aanvaller om misbruik te maken van de kwetsbaarheid ervan beperkt.
Cross-origin XMLHttpRequest
Een extensie kan XMLHttpRequest alleen gebruiken om resources van zichzelf en van domeinen die in de machtigingen zijn gespecificeerd, op te halen.
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"permissions": [
"/*",
"https://*.google.com/"
],
"manifest_version": 2
}
Deze extensie vraagt toegang tot alles op developer.chrome.com en subdomeinen van Google door "/*" en "https://*google.com/" in de machtigingen op te nemen. Als de extensie gehackt zou worden, zou deze nog steeds alleen toegang hebben tot websites die aan het opgegeven patroon voldoen. De aanvaller zou geen toegang krijgen tot "https://user_bank_info.com" en zou niet kunnen communiceren met "https://malicious_website.com" .
Beperk manifestvelden
Het opnemen van onnodige registraties in het manifest creëert kwetsbaarheden en maakt een extensie beter zichtbaar. Beperk de velden in het manifest tot die velden waar de extensie op vertrouwt en geef specifieke veldregistraties op.
Extern aansluitbaar
Gebruik het veld externally_connectable om aan te geven met welke externe extensies en webpagina's de extensie informatie zal uitwisselen. Beperk de externe verbindingen van de extensie tot vertrouwde bronnen.
{
"name": "Super Safe Extension",
"externally_connectable": {
"ids": [
"iamafriendlyextensionhereisdatas"
],
"matches": [
"/*",
"https://*google.com/"
],
"accepts_tls_channel_id": false
},
...
}
Webtoegankelijke bronnen
Door bronnen via het web toegankelijk te maken onder de noemer web_accessible_resources , wordt een extensie detecteerbaar voor websites en aanvallers.
{
...
"web_accessible_resources": [
"images/*.png",
"style/secure_extension.css",
"script/secure_extension.js"
],
...
}
Hoe meer online bronnen er beschikbaar zijn, hoe meer mogelijkheden een potentiële aanvaller heeft om ze te misbruiken. Beperk het aantal van deze bestanden tot een minimum.
Neem een expliciet beleid voor inhoudsbeveiliging op.
Voeg een contentbeveiligingsbeleid voor de extensie toe aan het manifest om cross-site scripting-aanvallen te voorkomen. Als de extensie alleen resources van zichzelf laadt, registreer dan het volgende:
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"content_security_policy": "default-src 'self'"
"manifest_version": 2
}
Als de extensie scripts van specifieke hosts moet bevatten, kunnen deze worden toegevoegd:
{
"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
}
Vermijd uitvoerbare API's.
API's die code uitvoeren, moeten worden vervangen door veiligere alternatieven.
document.write() en innerHTML
Hoewel het wellicht eenvoudiger is om dynamisch HTML-elementen te creëren met document.write() en innerHTML , maakt dit de extensie, en de webpagina's waarvan de extensie afhankelijk is, kwetsbaar voor aanvallers die kwaadaardige scripts willen invoegen. Maak in plaats daarvan handmatig DOM-nodes aan en gebruik innerText om dynamische inhoud in te voegen.
function constructDOM() {
let newTitle = document.createElement('h1');
newTitle.innerText = host;
document.appendChild(newTitle);
}
eval()
Vermijd het gebruik van eval() waar mogelijk om aanvallen te voorkomen, aangezien eval() alle eraan doorgegeven code uitvoert, wat kwaadaardig kan zijn.
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();
Geef in plaats daarvan de voorkeur aan veiligere en snellere methoden zoals 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();
Gebruik contentscripts zorgvuldig.
Hoewel contentscripts in een geïsoleerde wereld bestaan, zijn ze niet immuun voor aanvallen:
- Contentscripts zijn het enige onderdeel van een extensie dat rechtstreeks met de webpagina communiceert. Hierdoor kunnen kwaadwillende webpagina's delen van de DOM manipuleren waar het contentscript van afhankelijk is, of onverwacht gedrag van webstandaarden misbruiken, zoals benoemde items .
- Om met de DOM van webpagina's te interageren, moeten contentscripts in hetzelfde rendererproces worden uitgevoerd als de webpagina zelf. Dit maakt contentscripts kwetsbaar voor het lekken van gegevens via sidechannel-aanvallen (bijvoorbeeld Spectre ) en voor overname door een aanvaller als een kwaadwillende webpagina het rendererproces compromitteert.
Gevoelige taken moeten worden uitgevoerd in een speciaal daarvoor bestemd proces, zoals het achtergrondscript van de extensie. Voorkom dat extensierechten per ongeluk worden blootgesteld aan inhoudsscripts:
- Ga ervan uit dat berichten van een content-script mogelijk door een aanvaller zijn opgesteld ( valideer en zuiver bijvoorbeeld alle invoer en bescherm uw scripts tegen cross-site scripting ).
- Ga ervan uit dat alle gegevens die naar het contentscript worden verzonden, mogelijk op de webpagina terechtkomen. Verstuur geen gevoelige gegevens (bijv. geheimen van de extensie, gegevens van andere websites, browsegeschiedenis) naar contentscripts.
- Limit the scope of privileged actions that can be triggered by content scripts. Do not allow content scripts to trigger requests to arbitrary URLs or pass arbitrary arguments to extension APIs (eg, do not allow passing arbitrary URLs to
fetchorchrome.tabs.createAPI).
Invoer registreren en desinfecteren
Bescherm een extensie tegen kwaadaardige scripts door het aantal luisteraars te beperken tot alleen datgene wat de extensie verwacht, de afzenders van inkomende gegevens te valideren en alle invoer te zuiveren.
Een extensie mag zich alleen registreren voor runtime.onRequestExternal als deze communicatie verwacht van een externe website of extensie. Controleer altijd of de afzender overeenkomt met een vertrouwde bron.
// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";
chrome.runtime.onMessageExternal.addListener(
function(request, sender, sendResponse) {
if (sender.id === kFriendlyExtensionId)
doSomething();
});
Zelfs berichten die via de runtime.onMessage- gebeurtenis vanuit de extensie zelf worden verzonden, moeten worden gecontroleerd om er zeker van te zijn dat de MessageSender niet afkomstig is van een gecompromitteerd contentscript .
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.allowedAction)
console.log("This is an allowed action.");
});
Voorkom dat een extensie een script van een aanvaller uitvoert door gebruikersinvoer en inkomende gegevens te valideren, zelfs vanuit de extensie zelf en goedgekeurde bronnen. Vermijd uitvoerbare API's .
function sanitizeInput(input) {
return input.replace(/&/g, '&').replace(/</g, '<').replace(/"/g, '"');
}