Verhinderung von Supply-Chain-Angriffen auf das JavaScript-Ökosystem
Supply-Chain-Angriffe sind ein großes Problem für das JavaScript-Ökosystem. In diesem kurzen Beitrag werde ich eine unkomplizierte Sicherheitsmaßnahme skizzieren, die von allen JavaScript-Laufzeiten implementiert werden kann, sowohl im Browser als auch außerhalb des Browsers. Dadurch werden die meisten Supply-Chain-Angriffe verhindert, die das JavaScript-Ökosystem heute plagen.
Problem: Berechtigungsvererbung
Hier ist ein aktueller Vorfall, bei dem Websites gehackt wurden:
- Forscher bringen den Polyfill-Lieferkettenangriff mit einem riesigen Netzwerk von Nachahmer-Glücksspielseiten in Verbindung
Der Kern des Problems besteht darin, dass JavaScript-Module die Berechtigungen der Anwendung oder des Moduls erben, die sie aufgerufen haben. Dies ist sowohl für Laufzeiten im Browser als auch für Laufzeiten außerhalb des Browsers ein Problem.
Dieses Problem wird noch dadurch verkompliziert, dass sich die Modulversion, von der eine Anwendung abhängt, ändern kann, ohne dass der Autor der Anwendung es weiß. Selbst wenn also die Codes aller Abhängigkeiten gründlich überprüft wurden (was an sich schon ein enormer Aufwand ist), ist dieser Aufwand vergeblich, wenn die Abhängigkeitsversionen nicht gesperrt wurden.
Warum nicht Versionen sperren und semantische Abhängigkeiten verwenden? Das liegt vor allem daran, dass es besser ist, den festen Code zu verwenden, wenn ein Modulherausgeber Fehlerbehebungen veröffentlicht. Und das ist einer der Hauptgründe, warum JavaScript-CDNs wie esm.sh Semvers unterstützen.
? Wie Websites betroffen sind
Webbrowser sind Sandbox-Ausführungsumgebungen, sodass ein von einer Website importiertes JavaScript-Modul (3JM) eines Drittanbieters keinen Schaden auf dem Gerät des Endbenutzers anrichten kann.
Trotzdem kann ein 3JM ohne Zustimmung der Website die Rechenressourcen des Geräts nutzen und Netzwerkanfragen für Bitcoin-Mining usw. stellen.
? Wie sich dies auf JavaScript-Anwendungen außerhalb des Browsers auswirkt
Einige Off-Browser-Laufzeitumgebungen wie Deno implementieren Maßnahmen, um die einer JavaScript-/TypeScript-Anwendung erteilten Berechtigungen einzuschränken. Diese Maßnahmen greifen jedoch aus folgenden Gründen zu kurz:
- Selbst wenn ein Berechtigungssystem wie das von Deno durchgesetzt wird, erlauben sie JS-Modulen dennoch, die Berechtigungen des Aufrufers ohne Einschränkungen zu erben. Das bedeutet, dass, wenn eine Anwendung über vollständige Schreibberechtigungen verfügt, ein E-Mail-Adressvalidator, der keinen Zugriff auf Ressourcen außer Rechenressourcen haben sollte, Benutzerdateien löschen kann, ohne dass der Betriebssystembenutzer es weiß.
- Anwendungen werden häufig mit den vollen Berechtigungen des Betriebssystembenutzers ausgeführt. Beispielsweise ist es für Code, der unter einem Tool wie MDRB ausgeführt wird, derzeit nicht möglich, Berechtigungen auf den ausgeführten Code zu beschränken.
Die aktuelle Lösung
Derzeit haben Sicherheitsteams automatisierte Prozesse zur Suche nach Schwachstellen in Modulen eingerichtet, die in bekannten Registern wie NPM veröffentlicht werden. Diese Sicherheitsmaßnahme weist mehrere Mängel auf:
- Das Scannen aller Versionen aller bekannten veröffentlichten Module ist unglaublich ressourcenintensiv.
- Es gibt keine Garantie dafür, dass alle verfügbaren Module gescannt wurden.
? Lösung: Berechtigungen pro Modul
Um diese Probleme zu beheben, schlage ich ein neues Berechtigungssystem pro Modul vor, das abwärtskompatibel mit der aktuellen Funktionsweise von JS/TS-Anwendungen ist.
Dabei handelt es sich um eine neue optionale Berechtigungskonfiguration, die jede Anwendung und jedes Modul in ihren Dateien deno.json / deno.jsonc / package.json deklarieren kann. Berechtigungen bestehen aus 2 Teilen:
- Permissions.self – Hier deklariert die Anwendung oder das Modul die Berechtigungen, die sie und ihre Abhängigkeiten benötigen.
- Berechtigungen.imports – Hier deklariert die Anwendung oder das Modul die Berechtigungen, die es seinen Abhängigkeiten zuweist. Dies ist eine Obermenge der Berechtigungen, die jede Abhängigkeit erfordern darf.
So würden Berechtigungen von der JS/TS-Laufzeit verwendet werden:
- Wenn eine Anwendung oder ein Modul ein Modul M importiert, prüft die Laufzeit, ob die Berechtigungen von M innerhalb der Grenzen liegen, die der Importer M. Der Import wirft einen Fehler (z. B. PermissionError), wenn dies nicht der Fall ist. Ein Laufzeitfehler wird auch ausgelöst (z. B. PermissionError), wenn ein Modul oder eine Anwendung versucht, etwas zu tun, wozu es nicht berechtigt ist. Dieser Laufzeitfehler kann abgefangen und behandelt werden, ohne dass die Anwendung abgebrochen werden muss.
{ "self": { "read": {"allow": [], "deny": []}, "write": {"allow": [], "deny": []}, "net": {"allow": [], "deny": []}, "env": {"allow": [], "deny": []}, "run": {"allow": [], "deny": []} }, "imports": { "jsr:@org/module@1.0.0": { "read": {"allow": [], "deny": []}, "write": {"allow": [], "deny": []}, "net": {"allow": [], "deny": []}, "env": {"allow": [], "deny": []}, "run": {"allow": [], "deny": []} }, "https://cdn.example/org/module@1.0.0": { "read": {"allow": [], "deny": []}, "write": {"allow": [], "deny": []}, "net": {"allow": [], "deny": []}, "env": {"allow": [], "deny": []}, "run": {"allow": [], "deny": []} }, "[default]": { "read": {"allow": [], "deny": []}, "write": {"allow": [], "deny": []}, "net": {"allow": [], "deny": []}, "env": {"allow": [], "deny": []}, "run": {"allow": [], "deny": []} } } }
- Leichtgewicht – Veröffentlichte Module müssen nicht gescannt werden.
- Gründlich – Berechtigungen werden zur Laufzeit erzwungen. Wenn also die richtige JS/TS-Engine verwendet wird, können selbst unbekannte Module nicht durchs Raster fallen.
Das scheint sehr einfach zu sein. An den JS/TS-Sprachen sind keine Änderungen erforderlich. Und wenn die Berechtigungskonfiguration fehlt, greifen wir auf die aktuelle Situation zurück, in der die Anwendung und ihr Abhängigkeitsdiagramm alle über die Berechtigungen verfügen, die durch die Befehlszeilenargumente bereitgestellt wurden ∎
Das obige ist der detaillierte Inhalt vonVerhinderung von Supply-Chain-Angriffen auf das JavaScript-Ökosystem. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

Die Verschiebung von C/C zu JavaScript erfordert die Anpassung an dynamische Typisierung, Müllsammlung und asynchrone Programmierung. 1) C/C ist eine statisch typisierte Sprache, die eine manuelle Speicherverwaltung erfordert, während JavaScript dynamisch eingegeben und die Müllsammlung automatisch verarbeitet wird. 2) C/C muss in den Maschinencode kompiliert werden, während JavaScript eine interpretierte Sprache ist. 3) JavaScript führt Konzepte wie Verschlüsse, Prototypketten und Versprechen ein, die die Flexibilität und asynchrone Programmierfunktionen verbessern.

Zu den Hauptanwendungen von JavaScript in der Webentwicklung gehören die Interaktion der Clients, die Formüberprüfung und die asynchrone Kommunikation. 1) Dynamisches Inhaltsaktualisierung und Benutzerinteraktion durch DOM -Operationen; 2) Die Kundenüberprüfung erfolgt vor dem Einreichung von Daten, um die Benutzererfahrung zu verbessern. 3) Die Aktualisierung der Kommunikation mit dem Server wird durch AJAX -Technologie erreicht.

Die Anwendung von JavaScript in der realen Welt umfasst Front-End- und Back-End-Entwicklung. 1) Zeigen Sie Front-End-Anwendungen an, indem Sie eine TODO-Listanwendung erstellen, die DOM-Operationen und Ereignisverarbeitung umfasst. 2) Erstellen Sie RESTFUFFUPI über Node.js und express, um Back-End-Anwendungen zu demonstrieren.

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

Sowohl Python als auch JavaScripts Entscheidungen in Entwicklungsumgebungen sind wichtig. 1) Die Entwicklungsumgebung von Python umfasst Pycharm, Jupyternotebook und Anaconda, die für Datenwissenschaft und schnelles Prototyping geeignet sind. 2) Die Entwicklungsumgebung von JavaScript umfasst Node.JS, VSCODE und WebPack, die für die Entwicklung von Front-End- und Back-End-Entwicklung geeignet sind. Durch die Auswahl der richtigen Tools nach den Projektbedürfnissen kann die Entwicklung der Entwicklung und die Erfolgsquote der Projekte verbessert werden.

C und C spielen eine wichtige Rolle in der JavaScript -Engine, die hauptsächlich zur Implementierung von Dolmetschern und JIT -Compilern verwendet wird. 1) C wird verwendet, um JavaScript -Quellcode zu analysieren und einen abstrakten Syntaxbaum zu generieren. 2) C ist für die Generierung und Ausführung von Bytecode verantwortlich. 3) C implementiert den JIT-Compiler, optimiert und kompiliert Hot-Spot-Code zur Laufzeit und verbessert die Ausführungseffizienz von JavaScript erheblich.
