Blijf veilig

Extensies hebben toegang tot speciale privileges binnen de browser, waardoor ze een aantrekkelijk doelwit zijn voor aanvallers. Als een extensie wordt gecompromitteerd, wordt elke gebruiker van die extensie kwetsbaar voor kwaadaardige en ongewenste indringing. Houd een extensie veilig en de gebruikers ervan beschermd door deze praktijken op 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 sturen. Bescherm deze accounts door specifiek ontwikkelaarsaccounts aan te maken en tweefactorauthenticatie in te schakelen, bij voorkeur met een beveiligingssleutel .

Houd groepen selectief

Als u groepspublicatie gebruikt, zorg er dan voor dat de groep beperkt blijft tot vertrouwde ontwikkelaars. Accepteer geen lidmaatschapsverzoeken van onbekende personen.

Gebruik nooit HTTP, ooit

Vermijd bij het opvragen of verzenden van gegevens een HTTP-verbinding. Stel dat alle HTTP-verbindingen afluisteraars hebben of wijzigingen bevatten. HTTPS verdient altijd de voorkeur, omdat het een ingebouwde beveiliging heeft die de meeste man-in-the-middle-aanvallen omzeilt.

Vraag minimale rechten aan

De Chrome-browser beperkt de toegang van een extensie tot rechten die expliciet zijn aangevraagd in het manifest . Extensies moeten hun machtigingen minimaliseren door alleen API's en websites te registreren waarvan ze afhankelijk zijn. Willekeurige code moet tot een minimum worden beperkt.

Het beperken van de privileges van een extensie beperkt wat een potentiële aanvaller kan misbruiken.

Cross-origin XMLHttpRequest

Een extensie kan alleen XMLHttpRequest gebruiken om bronnen op te halen van zichzelf en van domeinen die zijn opgegeven in de machtigingen.

{
  "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 te vermelden. Als de extensie gecompromitteerd zou worden, zou deze nog steeds alleen toestemming hebben om te communiceren met websites die voldoen aan het matchpatroon . De aanvaller zou geen toegang kunnen krijgen tot "https://user_bank_info.com" of kunnen communiceren met "https://malicious_website.com" .

Beperk manifestvelden

Het opnemen van onnodige registraties in het manifest zorgt voor kwetsbaarheden en maakt een extensie beter zichtbaar. Beperk manifestvelden tot de velden waarvan de extensie afhankelijk is en geef specifieke veldregistratie.

Extern aansluitbaar

Gebruik het externally_connectable veld om aan te geven met welke externe extensies en webpagina's de extensie informatie zal uitwisselen. Beperk met wie de extensie extern verbinding kan maken met vertrouwde bronnen.

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

Webtoegankelijke bronnen

Door bronnen toegankelijk te maken via internet, wordt onder web_accessible_resources een extensie detecteerbaar gemaakt door websites en aanvallers.

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

Hoe meer via internet toegankelijke bronnen beschikbaar zijn, hoe meer mogelijkheden een potentiële aanvaller kan benutten. Beperk deze bestanden tot een minimum.

Neem een ​​expliciet inhoudsbeveiligingsbeleid op

Neem een ​​inhoudsbeveiligingsbeleid voor de extensie op in het manifest om cross-site scripting-aanvallen te voorkomen. Als de extensie alleen bronnen 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 opgenomen:

{
  "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 misschien eenvoudiger is om dynamisch HTML-elementen te maken met document.write() en innerHTML , laat het de extensie, en webpagina's waarvan de extensie afhankelijk is, open voor aanvallers die kwaadaardige scripts invoegen. Maak in plaats daarvan handmatig DOM-knooppunten en gebruik innerText om dynamische inhoud in te voegen.

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

evaluatie()

Vermijd waar mogelijk het gebruik eval() om aanvallen te voorkomen, aangezien eval() alle code zal uitvoeren die erin wordt doorgegeven en die schadelijk 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 inhoudsscripts zorgvuldig

Hoewel inhoudsscripts in een geïsoleerde wereld leven, zijn ze niet immuun voor aanvallen:

  • Inhoudsscripts zijn het enige onderdeel van een extensie dat rechtstreeks met de webpagina communiceert. Hierdoor kunnen vijandige webpagina's delen van de DOM manipuleren waarvan het inhoudsscript afhankelijk is, of verrassend webstandaardgedrag exploiteren, zoals benoemde items .
  • Om met de DOM van webpagina's te kunnen communiceren, moeten inhoudsscripts in hetzelfde rendererproces worden uitgevoerd als de webpagina. Dit maakt inhoudscripts kwetsbaar voor het lekken van gegevens via zijkanaalaanvallen (bijvoorbeeld Spectre ) en voor overname door een aanvaller als een kwaadaardige webpagina het rendererproces in gevaar brengt.

Gevoelig werk moet worden uitgevoerd in een speciaal proces, zoals het achtergrondscript van de extensie. Voorkom dat per ongeluk extensierechten worden blootgesteld aan inhoudsscripts:

  • Stel dat berichten uit een inhoudsscript mogelijk door een aanvaller zijn gemaakt ( valideer en zuiver bijvoorbeeld alle invoer en bescherm uw scripts tegen cross-site scripting ).
  • Stel dat gegevens die naar het inhoudsscript worden verzonden, naar de webpagina kunnen lekken. Stuur geen gevoelige gegevens (bijvoorbeeld geheimen van de extensie, gegevens van andere webbronnen, browsegeschiedenis) naar inhoudsscripts.
  • Beperk het bereik van bevoorrechte acties die kunnen worden geactiveerd door inhoudsscripts. Sta niet toe dat inhoudsscripts verzoeken naar willekeurige URL's activeren of willekeurige argumenten doorgeven aan extensie-API's (sta bijvoorbeeld niet toe dat willekeurige URL's worden doorgegeven aan fetch of chrome.tabs.create -API).

Registreer en reinig invoer

Bescherm een ​​extensie tegen kwaadaardige scripts door luisteraars te beperken tot alleen 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 er communicatie wordt 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 via de runtime.onMessage- gebeurtenis van de extensie zelf moeten nauwkeurig worden onderzocht om er zeker van te zijn dat de MessageSender niet afkomstig is van een gecompromitteerd inhoudsscript .

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

Voorkom dat een extensie het script van een aanvaller uitvoert door gebruikersinvoer en binnenkomende gegevens op te schonen, zelfs vanuit de extensie zelf en goedgekeurde bronnen. Vermijd uitvoerbare API's .

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