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öswilligen 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. Diese Konten schützen durch Sie erstellen spezielle Entwicklerkonten und aktivieren die Zwei-Faktor-Authentifizierung , vorzugsweise mit einem Sicherheitsschlüssel .

Gruppen selektiv halten

Wenn Sie die Gruppenveröffentlichung verwenden, beschränken Sie die Gruppe auf vertrauenswürdige Entwickler. Nicht akzeptieren Beitrittsanfragen 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 HTTPS bereits integriert ist. die die meisten Man-in-the-Middle-Angriffe umgehen.

Minimale Berechtigungen anfordern

Der Chrome-Browser schränkt den Zugriff einer Erweiterung auf Berechtigungen ein, die ausdrücklich in Manifest. 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.

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

Ursprungsübergreifende XMLHttpRequest

Erweiterungen können Ressourcen nur mit XMLHttpRequest von sich selbst und von Domains abrufen. 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, Dabei sind "/*" und "https://*google.com/" in den Berechtigungen aufgeführt. Wenn die Erweiterung kompromittiert wurde, hätte sie weiterhin nur die Berechtigung, mit Websites zu interagieren, die den Übereinstimmungsmuster 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 anschließbar

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
  },
  ...
}

Über das Internet zugängliche Ressourcen

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 über das Internet zugängliche Ressourcen zur Verfügung stehen, desto mehr Wege können potenzielle Angreifer ausnutzen. 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, verlässt sie die Erweiterung und die Webseiten, von denen die Erweiterung abhängt, sind offen für Angreifer, die bösartige Skripts. 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 übergebenen Code ausführt was schädlich sein könnte.

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

Stattdessen bevorzugen Sie 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

Content-Scripts befinden sich zwar in einer isolierten Welt, sind aber nicht vor Angriffen gefeitigt:

  • 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 bösartige Webseite gehackt wird. des Renderer-Prozesses.

Sensible Aufgaben sollten in einem eigenen Prozess ausgeführt werden, etwa der Hintergrund der Erweiterung. skript. Vermeiden Sie, versehentlich Erweiterungsberechtigungen an Inhaltsskripte weiterzugeben:

Eingaben registrieren und bereinigen

Schützen Sie eine Erweiterung vor schädlichen Skripts, indem Sie Hörer auf die Erweiterung beschränken der eingehenden Daten zu erwarten, die Absender eingehender Daten zu validieren und alle Eingaben zu bereinigen.

Erweiterungen sollten nur dann für runtime.onRequestExternal registriert werden, wenn Folgendes erwartet wird: Kommunikation von einer externen Website oder Erweiterung. Überprüfen Sie immer, ob der Absender mit einer vertrauenswürdigen Quelle.

// 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 Skript eines Angreifers ausführt, indem Sie Nutzereingaben und eingehende Daten bereinigen selbst aus 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;');
}