Experimentelle Integritätsrichtlinien für Node.js
21. März 2019
0 Min. LesezeitEine 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:
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.

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:
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.

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.



