Skip to main content

Experimentelle Integritätsrichtlinien für Node.js

Artikel von

21. März 2019

0 Min. Lesezeit

Eine kürzlich eingeführte experimentelle Funktion für Integritätsrichtlinien wurde in Node.js Core 11.8.0 aufgenommen. Diese Funktion, die bislang in keiner LTS-Version verfügbar ist, überprüft die Integrität einer Node.js-Laufzeitumgebung beim Laden von Modulen, um sicherzustellen, dass der Code der Module nicht manipuliert wurde.

Bradley Farias führte diese Änderung im Oktober 2018 ein und ließ sich dabei von einer ähnlichen Sicherheitsfunktion für Browser inspirieren: Subresource Integrity.

Subresource Integrity

Das World Wide Web Consortium (W3C) schlug ein neues Feld integrity für die HTML-Spezifikation vor, mit dem sich Subressourcen in einem HTML-Dokument überprüfen lassen. Webseiten können den Browser anweisen, Ressourcen über ein script- oder ein link-Tag zu laden. Wird für solche HTML-Elemente jedoch kein Feld „integrity“ verwendet, lässt sich nicht überprüfen, ob eine Ressource manipuliert wurde.

Webseiten laden eigene oder Drittanbieter-Ressourcen von einem Remote-Server, meist über ein Content Delivery Network (CDN). Bei solchen Ressourcen trägt die Überprüfung der Integrität der Ressourcendateien zum Schutz vor böswilligen Akteuren bei. Dazu gehören beispielsweise:

  • Ein kompromittierter Remote-Server, der möglicherweise veränderte Kopien der Ressourcendatei bereitstellt

  • Ein kompromittierter Übertragungsweg und dessen Ressourcendatei

Integritätsrichtlinien für Node.js-Module

Angeregt durch den Sicherheitsmechanismus von Browsern zur Durchsetzung der Ressourcenintegrität: Was wäre, wenn Node.js dasselbe für Drittanbieter-Module durchsetzen könnte, die vom Programmcode eingebunden werden, und sie überprüft, bevor sie in den Speicher geladen und ausgeführt werden?

Die neue experimentelle Richtlinienfunktion in Node.js 11.8.0 ermöglicht es, dieses Verhalten über das Befehlszeilen-Flag --experimental-policy durchzusetzen. Dafür muss ein Richtlinienmanifest für alle Ressourcen eines Projekts angegeben werden. Sehen wir uns an, wie das funktioniert!

Ein Node.js-Richtlinienmanifest

Version 11.8.0 bietet lediglich die Durchsetzung durch den Modul-Loader. Node.js kann das Richtlinienmanifest derzeit jedoch nicht verarbeiten. Zum Verwalten der Richtliniendatei können wir Bradleys eigenes node-policy CLI-Hilfsprogramm verwenden:

npm install -g @bradleymeck/node-policy

Mit dem Befehl integrity:add von node-policy können wir das Richtlinienmanifest erstellen, das die kryptografischen Hashes aller Dateien im aktuellen Verzeichnis enthält. Dazu gehört alles vom Verzeichnis .git/ bis zum gesamten Inhalt von node_modules/. Sie sollten also etwas Zeit für die Erstellung einplanen.

Um zu zeigen, wie das funktioniert, verwenden wir das Tool mit einem CLI-Node.js-Modul, das ich erstellt habe, um Ergebnisse von typeform-Umfragen zu exportieren.

Rufen Sie node-policy auf, um eine Integritätsmanifestdatei für alle Dateien im aktuellen Verzeichnis zu erstellen (der letzte Punkt gibt dieses Verzeichnis an), und legen Sie einen Algorithmus für die kryptografische Hashfunktion fest. Zur Auswahl stehen sha256, sha384 und sha512. Diese entsprechen der HTML-Spezifikation für Subresource Integrity.

Terminal mit einem node-policy-Integritätsbefehl und der Bestätigung, dass 37.945 Integritätswerte zu einer Datei namens .node-policy.json hinzugefügt wurden.

Die generierte Richtliniendatei für das Projekt wird im Home-Verzeichnis des Benutzers gespeichert. Hier sehen Sie einen kurzen Ausschnitt aus .node-policy.json, der den Aufbau einer Manifestdatei mit den Datei-URLs und den zugehörigen Integritäts-Hashes veranschaulicht:

"resources": {
    "./projects/repos/typeform-export-excel/.git/COMMIT_EDITMSG": {
      "integrity": "sha256-dMEh66Uy32Nr8wO5fy3FAEsZjTeqpBghe9o48gYgZfM="
    },
    "./projects/repos/typeform-export-excel/.git/FETCH_HEAD": {
      "integrity": "sha256-NsU93Hbe+fB2KxZIzQnA299sQRl/4Fg1wk9M0FSYe7E="
    },
    "./projects/repos/typeform-export-excel/node_modules/zip-stream/index.js": {
      "integrity": "sha256-JUKnwX/rS+DRZ0tEQjTl4B/qb3/z7DRMqYiPy9EJpOg="
    },
    "./projects/repos/typeform-export-excel/package.json": {
      "integrity": "sha256-8YN17NVVfPPW+CWsQ2j5LF9MbcnTu6ny/MFkVj/pXjI="
    },
    "./projects/repos/typeform-export-excel/src/constants.js": {
      "integrity": "sha256-wGKtyPIeYuAc0D5L7SrPeiXOqvZYNgqJLkxi8aA/OiQ="
    },
    "./projects/repos/typeform-export-excel/src/index.js": {
      "integrity": "sha256-eJnVeGBKu6vVMHPVS2PKpK6/adC6YLiAEyoIqQwwOjI="
    }

Wenn wir die node-policy-CLI für andere Projektverzeichnisse ausführen, fügt sie der Richtlinienmanifestdatei weitere Dateien hinzu. Das ist die Implementierung von node-policy und keine Spezifikation oder Richtlinie.

Warum erstellt node-policy die Richtliniendatei im Home-Verzeichnis des Benutzers? Umfassende Best Practices für Integritätsrichtlinien sind zwar noch nicht standardisiert. Da diese Datei jedoch als maßgebliche Quelle für vertrauenswürdige Ressourcen dient, liegt es in unserem Interesse, sie vor Manipulationen zu schützen. Zu den Best Practices gehört, die Datei schreibgeschützt zu machen und außerhalb aller Verzeichnisse abzulegen, auf die potenziell zugegriffen werden kann.

Um die Manipulation einer Datei zu simulieren und zu zeigen, wie Node.js das erkennt, habe ich den Code in bin/cli.js, einer Datei des CLI-Projekts, geringfügig geändert. Beim Aufruf von Node.js zum Ausführen des ausführbaren CLI-JavaScript-Codes stellt das System fest, dass der Hash abweicht, bevor es dieses CommonJS-Modul lädt, und gibt einen Fehler aus, woraufhin Node.js zur Eingabeaufforderung zurückkehrt.

Terminal mit einem fehlgeschlagenen Node.js-Befehl und dem Fehler ERR_MANIFEST_ASSERT_INTEGRITY für bin/cli.js.

Die aktuelle Implementierung ermöglicht es, Abweichungen bei der Integrität zu protokollieren, anstatt einen Fehler auszulösen oder das Programm zu beenden. Möglich macht dies eine Eigenschaft onerror, die dem Objekt auf oberster Ebene der Richtlinienmanifestdatei hinzugefügt werden kann.

Zusammenfassung

Die kontinuierliche Arbeit daran, Sicherheitsfunktionen in Node.js zu integrieren, ist vielversprechend. Wir werden in naher Zukunft sicher noch mehr davon sehen. Beachten Sie, dass die Funktion für Integritätsrichtlinien weiterhin experimentell und außerdem nur ab Node.js 11.8.0 verfügbar ist.

Starten Sie mit Capture-the-Flag

Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Challenges lösen.

Weiterlesen

blog feature ai violet
Blog

VulnBump: Können KI-Agenten anfällige Abhängigkeiten beheben, ohne den Build zu beschädigen?

VulnBump testet KI-Agenten anhand von 307 realen Dependency-Upgrades. Eine Lösung zählt nur, wenn die Sicherheitslücke behoben ist und Build sowie Tests weiterhin erfolgreich sind.

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSec: Sicherheit, die mit der KI-Entwicklung Schritt hält

KI-gestützte Entwicklung überholt herkömmliche Security-Workflows. Snyk Agentic AppSec setzt Security-Agenten ein, die Schwachstellen kontinuierlich finden, beheben und überprüfen – während Menschen die Maßstäbe festlegen.

Blog

Frontier-Modelle fanden die Schwachstellen. Nur der Angreifer fand die Angriffsketten.

Die statische Analyse fand die Schwachstellen, doch erst Live-Angriffstests bewiesen, wie sie sich zu Angriffen verketten lassen. Ein Vergleich von Evo COS, Claude Security und Claude Code Security.