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 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

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.

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

Cross-origin ophalen()

Een extensie kan alleen fetch() en XMLHttpRequest() gebruiken om bronnen op te halen van de extensie en van domeinen die zijn opgegeven in de machtigingen. Houd er rekening mee dat oproepen naar beide worden onderschept door de ophaalhandler in de servicemedewerker.

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

Deze extensie in het bovenstaande voorbeeld vraagt ​​toegang tot alles op developer.chrome.com en subdomeinen van Google door "https://developer.chrome.com/*" en "https://*.google.com/*" te vermelden in de machtigingen. 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 slechts beperkte mogelijkheden hebben om toegang te krijgen tot "https://user_bank_info.com" of om te communiceren met "https://malicious_website.com" .

Beperk manifestvelden

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

Extern aansluitbaar

Gebruik het veld "externally_connectable" 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://developer.chrome.com/*",
      "https://*.google.com/*"
    ],
    "accepts_tls_channel_id": false
  },
  ...
}

Webtoegankelijke bronnen

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

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

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": {
    "extension_pages": "default-src 'self'"
  },
  "manifest_version": 3
}

Als de extensie webassemblage moet gebruiken, of de beperkingen op sandbox-pagina's moet verhogen, kunnen deze worden toegevoegd:

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

Vermijd 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);
}

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.

Bewerkingen waarbij gebruik wordt gemaakt van gevoelige gegevens (zoals de privégegevens van een gebruiker) of Chrome API's met toegang tot de functies van de browser moeten worden uitgevoerd in de servicemedewerker van de extensies. 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 de methoden fetch() of chrome.tabs.create() .

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.onMessageExternal 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.");
});