Geschützt bleiben

Erweiterungen haben Zugriff auf spezielle Berechtigungen im Browser, was sie zu einem attraktiven Ziel für Angreifer macht. Wenn eine Erweiterung manipuliert wird, ist jeder Nutzer dieser Erweiterung anfällig für böswillige und unerwünschte Eingriffe. Mit den folgenden Maßnahmen können Sie die Sicherheit einer Erweiterung erhöhen und ihre Nutzer schützen.

Entwicklerkonten schützen

Erweiterungscode wird über Google-Konten hochgeladen und aktualisiert. Wenn die Konten von Entwicklern manipuliert werden, kann ein Angreifer böswilligen Code direkt an alle Nutzer senden. Schützen Sie diese Konten, indem Sie spezielle Entwicklerkonten erstellen und die 2‑Faktor-Authentifizierung aktivieren, vorzugsweise mit einem Sicherheitsschlüssel .

Gruppen selektiv halten

Wenn Sie die Gruppenveröffentlichung verwenden, beschränken Sie die Gruppe auf vertrauenswürdige Entwickler. Nehmen Sie keine Mitgliedschaftsanfragen von unbekannten Personen an.

HTTP niemals verwenden

Vermeiden Sie beim Anfordern oder Senden von Daten eine HTTP-Verbindung. Gehen Sie davon aus, dass alle HTTP-Verbindungen abgehört werden oder Änderungen enthalten. HTTPS sollte immer bevorzugt werden, da es integrierte Sicherheitsfunktionen bietet, die die meisten Man-in-the-Middle-Angriffe verhindern.

Mindestberechtigungen anfordern

Der Chrome-Browser beschränkt den Zugriff einer Erweiterung auf Berechtigungen, die im Manifest explizit angefordert wurden. das Manifest. 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.

Wenn Sie die Berechtigungen einer Erweiterung einschränken, begrenzen Sie auch, was ein potenzieller Angreifer ausnutzen kann.

Ursprungsübergreifende XMLHttpRequest-Anfragen

Eine Erweiterung kann XMLHttpRequest nur 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 Unterdomains von Google an, indem sie "/*" und "https://*google.com/" in den Berechtigungen auflistet. Wenn die Erweiterung manipuliert würde, hätte sie weiterhin nur die Berechtigung, mit Websites zu interagieren, die dem Muster entsprechen. Der Angreifer könnte nicht auf "https://user_bank_info.com" zugreifen oder mit "https://malicious_website.com" interagieren.

Manifestfelder einschränken

Wenn Sie unnötige Registrierungen in das Manifest aufnehmen, entstehen Sicherheitslücken und die Erweiterung wird besser sichtbar. Beschränken Sie die Manifestfelder auf die Felder, auf die die Erweiterung angewiesen ist, und geben Sie eine spezifische Feldregistrierung an.

Extern verbindbar

Verwenden Sie das externally_connectable Feld, um anzugeben, mit welchen externen Erweiterungen und Webseiten die Erweiterung Informationen austauschen soll. Beschränken Sie die externen Verbindungen der Erweiterung auf vertrauenswürdige Quellen.

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

Webzugängliche Ressourcen

Wenn Sie Ressourcen unter web_accessible_resources für das Web zugänglich machen, können Websites und Angreifer die Erweiterung erkennen.

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

Je mehr webzugängliche Ressourcen verfügbar sind, desto mehr Möglichkeiten hat ein potenzieller Angreifer, diese auszunutzen. Beschränken Sie diese Dateien auf ein Minimum.

Explizite Content Security Policy einfügen

Fügen Sie im Manifest eine Content Security Policy für die Erweiterung ein, um Cross-Site Scripting-Angriffe zu verhindern. Wenn die Erweiterung nur Ressourcen von 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 eingefügt 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 ist zwar einfacher, HTML-Elemente dynamisch mit document.write() und innerHTML zu erstellen, aber die Erweiterung und die Webseiten, von denen die Erweiterung abhängig ist, sind anfällig für Angriffe, bei denen böswillige Skripts eingefügt werden. Erstellen Sie stattdessen DOM-Knoten manuell 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. eval() führt jeden Code aus, der an sie übergeben wird, und dieser Code kann böswillig sein.

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

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

Content-Skripts mit Bedacht verwenden

Content-Skripts werden zwar in einer isolierten Umgebung ausgeführt, sind aber nicht immun gegen Angriffe:

  • Content-Skripts sind der einzige Teil einer Erweiterung, der direkt mit der Webseite interagiert. Aus diesem Grund können feindselige Webseiten Teile des DOM manipulieren, von denen das Content-Skript abhängig ist, oder überraschendes Verhalten von Webstandards ausnutzen, z. B. benannte Elemente.
  • Um mit dem DOM von Webseiten zu interagieren, müssen Content-Skripts im selben Renderer-Prozess wie die Webseite ausgeführt werden. Dadurch sind Content-Skripts anfällig für Datenlecks über Side-Channel-Angriffe (z.B. Spectre) und können von einem Angreifer übernommen werden, wenn eine böswillige Webseite den Renderer-Prozess manipuliert.

Sensible Aufgaben sollten in einem separaten Prozess ausgeführt werden, z. B. im Hintergrund skript der Erweiterung. Vermeiden Sie, dass Erweiterungsberechtigungen versehentlich für Content-Skripts verfügbar gemacht werden:

  • Gehen Sie davon aus, dass Nachrichten von einem Content-Skript von einem Angreifer erstellt wurden (z.B. validieren und bereinigen Sie alle Eingaben und schützen Sie Ihre Skripts vor Cross-Site-Scripting).
  • Gehen Sie davon aus, dass alle Daten, die an das Content-Skript gesendet werden, an die Webseite weitergegeben werden können. Senden Sie keine sensiblen Daten (z.B. Geheimnisse aus der Erweiterung, Daten aus anderen Web-Ursprüngen, Browserverlauf) an Content-Skripts.
  • Beschränken Sie den Umfang der privilegierten Aktionen, die von Content-Skripts ausgelöst werden können. Es ist nicht zulässig, dass Content-Skripts Anfragen an beliebige URLs auslösen oder beliebige Argumente an Erweiterungs-APIs übergeben (z.B. ist es nicht zulässig, beliebige URLs an die APIs fetch oder chrome.tabs.create zu übergeben).

Eingaben registrieren und bereinigen

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

Eine Erweiterung sollte sich nur für runtime.onRequestExternal registrieren, wenn sie Kommunikation von einer externen Website oder Erweiterung erwartet. Prüfen Sie immer, ob der Absender eine vertrauenswürdige Quelle ist.

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

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

Auch Nachrichten über das Ereignis runtime.onMessage aus der Erweiterung selbst sollten überprüft werden, um sicherzustellen, dass der MessageSender nicht von einem manipulierten Content-Skript stammt.

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

Verhindern Sie, dass eine Erweiterung das Skript eines Angreifers ausführt, indem Sie Nutzereingaben und eingehende Daten bereinigen, auch wenn sie von der Erweiterung selbst und genehmigten Quellen stammen. Vermeiden Sie ausführbare APIs.

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