Geschützt bleiben

Erweiterungen haben Zugriff auf spezielle Berechtigungen im Browser, was sie zu einem attraktiven Ziel für zu erkennen. Wenn eine Erweiterung manipuliert wird, kann jeder Nutzer dieser Erweiterung anfällig für bösartigen und unerwünschten Eindringlingen. Schützen Sie eine Erweiterung und ihre Nutzer, indem Sie diese Best Practices anwenden.

Entwicklerkonten schützen

Der Erweiterungscode wird über Google-Konten hochgeladen und aktualisiert. Wenn die Konten sind könnte ein Angreifer schädlichen 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 klein halten

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

Nie HTTP verwenden

Vermeiden Sie beim Anfordern oder Senden von Daten eine HTTP-Verbindung. dass alle HTTP-Verbindungen abhören oder Veränderungen enthalten. HTTPS sollte immer bevorzugt werden, da es eine integrierte Sicherheit bietet, die die meisten Man-in-the-Middle-Angriffe verhindert.

Mindestberechtigungen anfordern

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

Wenn Sie die Berechtigungen einer Erweiterung einschränken, wird die Angriffsfläche für potenzielle Angreifer verringert.

Ursprungsübergreifende 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 auf Subdomains von Google an, indem "/*" und "https://*google.com/" in den Berechtigungen aufgeführt werden. Selbst wenn die Erweiterung manipuliert würde, hätte sie weiterhin nur die Berechtigung, mit Websites zu interagieren, die dem Abgleichsmuster entsprechen. Der Angreifer könnte nicht auf "https://user_bank_info.com" zugreifen oder mit "https://malicious_website.com" interagieren.

Manifestfelder begrenzen

Die Aufnahme unnötiger Registrierungen in das Manifest führt zu Sicherheitslücken und macht eine Erweiterung die Sichtbarkeit erhöhen. Manifest-Felder auf diejenigen beschränken, auf die die Erweiterung angewiesen ist, und ein bestimmtes Feld angeben Registrierung.

Extern erreichbar

Verwenden Sie das Feld externally_connectable, um anzugeben, für welche externen Erweiterungen und Webseiten die mit der die Erweiterung Informationen austauscht. Einschränken, mit wem die Erweiterung extern eine Verbindung herstellen kann vertrauenswürdigen Quellen.

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

Webzugriff

Die Bereitstellung von Ressourcen über das Web gemäß der web_accessible_resources Erweiterung, die von Websites und Angreifern erkannt werden kann.

{
  ...
  "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. Notizen auf ein Minimum zu beschränken.

Eine explizite Inhaltssicherheitsrichtlinie hinzufügen

Füge im Manifest eine Content Security Policy für die Erweiterung hinzu, um websiteübergreifende Interaktionen zu verhindern. Scripting-Angriffe. 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 so eingebunden 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 mit document.write() und innerHTML dynamisch zu erstellen, aber dadurch sind die Erweiterung und die Webseiten, von denen sie abhängt, anfällig für Angreifer, die schädliche Scripts einschleusen. Erstellen Sie stattdessen manuell DOM-Knoten und fügen Sie mit innerText dynamische Inhalte ein.

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 übergebenen Code ausführt, der ggf. 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();

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

Inhaltsscripts mit Bedacht verwenden

Auch wenn Content-Scripts in einer abgeschotterten Umgebung laufen, sind sie nicht vor Angriffen gefeit:

  • Inhaltsskripte sind der einzige Teil einer Erweiterung, der direkt mit der Webseite interagiert. Aus diesem Grund können feindselige Webseiten Teile des DOMs manipulieren, von dem das Content-Skript abhängt, oder unerwartete Webstandards ausnutzen, z. B. benannte Elemente.
  • Um mit dem DOM von Webseiten zu interagieren, müssen Inhaltsskripte im selben Renderer-Prozess ausgeführt werden wie der Webseite. Dadurch werden Inhaltsskripte anfällig für Datenlecks durch Side-Channel-Angriffe. (z.B. Spectre) und von einem Angreifer übernommen werden, wenn eine schädliche Webseite manipuliert wird. des Renderer-Prozesses.

Sensibles Arbeiten sollte in einem speziellen Prozess ausgeführt werden, z. B. im Hintergrundskript der Erweiterung. Vermeiden Sie, versehentlich Erweiterungsberechtigungen an Inhaltsskripte weiterzugeben:

Eingaben registrieren und bereinigen

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

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

// 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 von der Erweiterung selbst sollten auf mögliche Achten Sie darauf, dass MessageSender nicht von einem Script für manipulierte Inhalte 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 Script eines Angreifers ausführt, indem Sie Nutzereingaben und eingehende Daten bereinigen, auch von der Erweiterung selbst und aus genehmigten Quellen. Ausführbare APIs vermeiden.

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