Geschützt bleiben

Erweiterungen haben Zugriff auf spezielle Berechtigungen innerhalb des Browsers, was sie zu einem attraktiven Ziel für Angreifer macht. Wenn eine Erweiterung manipuliert wird, wird jeder Nutzer dieser Erweiterung anfällig für schädliche und unerwünschte Angriffe. Durch die Einbindung dieser Praktiken können Sie die Sicherheit einer Erweiterung und ihrer Nutzer aufrechterhalten.

Entwicklerkonten schützen

Der Erweiterungscode wird über Google-Konten hochgeladen und aktualisiert. Wenn Entwicklerkonten manipuliert werden, könnte ein Angreifer schädlichen Code direkt an alle Nutzer senden. Schützen Sie diese Konten, indem Sie Entwicklerkonten erstellen und die 2-Faktor-Authentifizierung aktivieren, vorzugsweise mit einem Sicherheitsschlüssel .

Gruppenauswahl beibehalten

Wenn Sie die Gruppenveröffentlichung verwenden, beschränken Sie sich auf vertrauenswürdige Entwickler. Akzeptieren Sie keine Beitrittsanfragen von unbekannten Personen.

HTTP nie verwenden

Vermeiden Sie beim Anfordern oder Senden von Daten eine HTTP-Verbindung. Wir gehen davon aus, dass HTTP-Verbindungen abgefangen oder Änderungen daran vorgenommen werden. HTTPS sollte immer bevorzugt werden, da es integrierte Sicherheitsfunktionen bietet, die die meisten Man-in-the-Middle-Angriffe umgehen.

Mindestberechtigungen anfordern

Im Chrome-Browser wird der Zugriff einer Erweiterung auf Berechtigungen beschränkt, die explizit im Manifest angefordert wurden. Erweiterungen sollten ihre Berechtigungen minimieren, indem sie nur APIs und Websites registrieren, von denen sie abhängig sind. Beliebiger Code sollte auf ein Minimum beschränkt werden.

Durch das Einschränken der Berechtigungen für Erweiterungen wird eingeschränkt, was ein potenzieller Angreifer ausnutzen kann.

Ursprungsübergreifender XMLHttpRequest

Eine Erweiterung kann nur XMLHttpRequest verwenden, um Ressourcen von sich selbst und von Domains abzurufen, die in den Berechtigungen angegeben sind.

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "permissions": [
    "/*",
    "https://*.google.com/"
  ],
  "manifest_version": 2
}

Diese Erweiterung fordert Zugriff auf alle Inhalte auf developer.chrome.com und Subdomains von Google an. Dazu werden "/*" und "https://*google.com/" in den Berechtigungen aufgeführt. Wenn die Erweiterung manipuliert würde, hat sie weiterhin nur die Berechtigung zur Interaktion mit Websites, die dem Übereinstimmungsmuster entsprechen. Der Angreifer kann nicht auf "https://user_bank_info.com" zugreifen oder mit "https://malicious_website.com" interagieren.

Manifestfelder beschränken

Wenn Sie unnötige Registrierungen in das Manifest aufnehmen, entstehen Sicherheitslücken und Erweiterungen werden besser sichtbar. Beschränken Sie Manifestfelder auf diejenigen, die von der Erweiterung benötigt werden, und geben Sie spezifische Feldregistrierungen an.

Extern verbunden

Im Feld externally_connectable können Sie angeben, mit welchen externen Erweiterungen und Webseiten die Erweiterung Informationen austauschen soll. Beschränken Sie auf vertrauenswürdige Quellen, mit wem die Erweiterung extern eine Verbindung herstellen kann.

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

Über das Web zugängliche Ressourcen

Wenn Ressourcen über das Web unter der web_accessible_resources zugänglich gemacht werden, wird eine Erweiterung von Websites und Angreifern erkannt.

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

Je mehr über das Internet zugängliche Ressourcen zur Verfügung stehen, desto mehr Möglichkeiten stehen potenziellen Angreifern zur Verfügung. Beschränken Sie diese Dateien auf ein Minimum.

Eine explizite Content Security Policy hinzufügen

Fügen Sie dem Manifest eine Content Security Policy für die Erweiterung hinzu, um Cross-Site-Scripting-Angriffe zu verhindern. Wenn die Erweiterung Ressourcen nur aus sich selbst lädt, registrieren Sie Folgendes:

{
  "name": "Very Secure Extension",
  "version": "1.0",
  "description": "Example of a Secure Extension",
  "content_security_policy": "default-src 'self'"
  "manifest_version": 2
}

Wenn die Erweiterung Skripts von bestimmten Hosts enthalten muss, können diese verwendet werden:

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

Ausführbare APIs vermeiden

APIs, die Code ausführen, sollten durch sicherere Alternativen ersetzt werden.

„document.write()“ und „innerHTML“

Es mag zwar einfacher sein, HTML-Elemente mit document.write() und innerHTML dynamisch zu erstellen, doch dabei bleibt die Erweiterung sowie Webseiten, von denen die Erweiterung abhängig ist, offen für Angreifer, die schädliche Skripts einfügen. Erstellen Sie stattdessen manuell DOM-Knoten und verwenden Sie innerText, um dynamische Inhalte einzufügen.

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

eval()

Vermeiden Sie nach Möglichkeit die Verwendung von eval(), um Angriffe zu verhindern, da eval() jeden an ihn übergebenen Code ausführt, der möglicherweise schädlich ist.

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();

Bevorzugen Sie stattdessen sicherere und schnellere Methoden wie 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();

Inhaltsskripte mit Bedacht verwenden

Inhaltsskripts befinden sich zwar in einer isolierten Welt, sind aber nicht vor Angriffen geschützt:

  • Content-Skripts sind der einzige Teil einer Erweiterung, die direkt mit der Webseite interagiert. Daher können feindselige Webseiten Teile des DOMs manipulieren, von dem das Inhaltsskript abhängt, oder unerwartetes Webstandardverhalten, wie benannte Elemente, ausnutzen.
  • Um mit dem DOM von Webseiten zu interagieren, müssen Inhaltsskripts im selben Rendererprozess wie die Webseite ausgeführt werden. Dies macht Inhaltsskripte anfällig für Datenlecks durch Side-Channel-Angriffe (z.B. Spectre) und wird von einem Angreifer übernommen, wenn eine schädliche Webseite den Renderer-Prozess gefährdet.

Sensible Aufgaben sollten in einem eigenen Prozess ausgeführt werden, z. B. im Hintergrundskript der Erweiterung. Vermeiden Sie es, versehentlich Erweiterungsberechtigungen für Inhaltsskripte freizugeben:

  • Sie gehen davon aus, dass Nachrichten von einem Inhaltsskript von einem Angreifer erstellt wurden. Prüfen und bereinigen Sie beispielsweise alle Eingaben und schützen Sie Ihre Skripts vor websiteübergreifendem Scripting.
  • Gehen Sie davon aus, dass Daten, die an das Inhaltsskript gesendet werden, an die Webseite gelangen könnten. Senden Sie keine sensiblen Daten (z.B. Secrets von der Erweiterung, Daten von anderen Webursprüngen, der Browserverlauf) an Inhaltsskripte.
  • Beschränken Sie den Umfang privilegierter Aktionen, die von Content-Skripts ausgelöst werden können. Erlauben Sie nicht, dass Inhaltsskripts Anfragen an beliebige URLs auslösen oder beliebige Argumente an Erweiterungs-APIs übergeben. So ist es beispielsweise nicht zulässig, beliebige URLs an fetch oder die chrome.tabs.create API zu übergeben.

Eingaben registrieren und bereinigen

Schützen Sie eine Erweiterung vor schädlichen Skripts, indem Sie Listener auf das beschränken, was die Erweiterung erwartet, die Absender eingehender Daten validieren und alle Eingaben bereinigen.

Eine Erweiterung sollte nur dann für runtime.onRequestExternal registriert werden, wenn die Kommunikation von einer externen Website oder Erweiterung erwartet wird. Prüfen Sie immer, ob der Absender mit einer vertrauenswürdigen Quelle übereinstimmt.

// The ID of an external extension
const kFriendlyExtensionId = "iamafriendlyextensionhereisdatas";

chrome.runtime.onMessageExternal.addListener(
  function(request, sender, sendResponse) {
    if (sender.id === kFriendlyExtensionId)
      doSomething();
});

Sogar Nachrichten, die über ein runtime.onMessage-Ereignis von der Erweiterung selbst gesendet wurden, sollten geprüft werden, um sicherzustellen, dass MessageSender nicht aus einem manipulierten Inhaltsskript stammt.

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

Sie können verhindern, dass eine Erweiterung das Skript eines Angreifers ausführt, indem Sie Nutzereingaben und eingehende Daten bereinigen, auch von der Erweiterung selbst und genehmigten Quellen. Vermeiden Sie ausführbare APIs.

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