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:
- Gehen wir davon aus, dass Nachrichten von einem Inhaltsskript von einem Angreifer (z.B. alle Eingaben validieren und bereinigen und Ihre Skripts vor Cross-Site-Scripting schützen.
- Angenommen, alle an das Inhaltsskript gesendeten Daten könnten an die Webseite weitergegeben werden. Keine sensiblen Daten senden (z.B. Geheimnisse der Erweiterung, Daten aus anderen Webquellen, Browserverlauf) bis hin zu Inhalten Skripts erstellt.
- Begrenzen Sie den Umfang der privilegierten Aktionen, die durch Inhaltsscripts ausgelöst werden können. Nicht erlauben
Content-Skripts zum Auslösen von Anfragen an beliebige URLs oder zur Übergabe beliebiger Argumente an
Erweiterungs-APIs (z.B. die Weitergabe beliebiger URLs an
fetch
oderchrome.tabs.create
API).
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, '&').replace(/</g, '<').replace(/"/g, '"');
}