Das sind nicht die npm-Pakete, nach denen Sie suchen
DeveloperSteve Coochin
4. Mai 2022
0 Min. LesezeitIm Laufe der Jahre habe ich als Entwickler viele Anwendungen entwickelt und bereitgestellt – bei Digitalagenturen, für Nebenprojekte, Start-ups und als Freiberufler. Bei knappen Fristen, Kundenerwartungen und Lieferterminen stand Sicherheit beim Installieren eines Open-Source-Pakets mit npm meist nicht im Vordergrund. Das führte häufig zu Nacharbeiten und Bereinigungen bei Deployments, in die bekannte Schwachstellen gelangt waren – und damit zu immer längeren Zeitplänen und enttäuschten Kunden.
Zu Beginn des Jahres wurden über 500 schädliche Pakete in das npm-Ökosystem eingeschleust, um in Anwendungen Dependency Confusion zu verursachen. Diese Pakete schleusten entweder direkt unerwünschten Code und Funktionen ein oder führten schädlichen Code über eine direkte oder über eine Abhängigkeit vermittelte Injection einer Open-Source-Bibliothek ein.
Wie in den ursprünglichen Star-Wars-Filmen versuchten diese schädlichen Pakete, sich mit einem Jedi-Gedankentrick Zugang zu unseren Anwendungen zu verschaffen. Da solche Vorfälle zunehmen, müssen wir uns unbedingt die nötige Zeit nehmen und die erforderlichen Vorsichtsmaßnahmen treffen, um unsere Deployments zu schützen.
Sehen wir uns einige Möglichkeiten an, Anwendungen vor Dependency Injection zu schützen.
Sorgfältige Prüfung
Es ist immer wichtig, auf jeder Entwicklungsstufe zu verstehen, was Ihre Anwendung verwendet. Rund 80 % der Schwachstellen im npm-Ökosystem entstehen durch anfällige Pfade in der Dependency Injection. Deshalb ist eine sorgfältige Prüfung so wichtig. Um die Sicherheit zu gewährleisten, müssen wir verstehen, wie die von uns ausgewählten Open-Source-Pakete erstellt wurden und welcher Support dahintersteht.
Eine Möglichkeit dafür ist, die Funktionalität der Bibliothek auf der npm-Seite des Pakets oder im Git-Repository zu prüfen. So können Sie die Anzahl der Releases ermitteln, den Umfang des Supports einschätzen und sehen, welche Abhängigkeiten das Paket benötigt.

Eine weitere praktische Möglichkeit ist Snyk Advisor. Dort finden Sie nützliche Informationen zum Zustand des Pakets und zu den Schwachstellen, die im Laufe seiner Geschichte aufgetreten sind.
Besonders hilfreich an der Seite von Snyk Advisor ist der ganzheitliche Überblick über das gesamte Projekt. Dazu gehört auch ein Zustandswert, der auf Community, Beliebtheit, Sicherheit und Wartung basiert.

Auf dieser Seite finden Sie außerdem praktische Zeitdiagramme mit Beliebtheitsstatistiken, etwa Downloads im Wochenverlauf, die Zahl der Commits aus der Community und die Anzahl offener Issues. So lässt sich neben der Akzeptanz im Ökosystem auch die Aktivität der Community einschätzen.

Beide Diagramme zeigen, wie schnell eine Community zusammenarbeiten würde, um auftretende Sicherheitsprobleme im Projekt zu beheben.
Dependency-Bäume erstellen
Ein einziges npm install kann Hunderte von Bibliotheken in Ihre Node-Anwendung einbringen. Electron hat beispielsweise drei Hauptabhängigkeiten, von denen einige ihrerseits Abhängigkeiten haben, die automatisch zu einer Electron-basierten App hinzugefügt werden.
Dependency-Bäume helfen dabei, Pakete zu erkennen, die über eine Bibliothek oder Abhängigkeit hinzugefügt wurden. Noch wichtiger: Sie erleichtern das Erstellen einer SBOM (Software Bill of Materials), indem sie die in Ihrer Anwendung verwendeten Komponenten identifizieren.
Es gibt mehrere Möglichkeiten, einen Dependency-Baum zu erstellen, zum Beispiel:
Mit einem visuellen Mapping-Tool
Visuelle Mapping-Tools eignen sich gut zum Erstellen von Dependency-Maps, da sie alle Open-Source-Komponenten, die Ihre Anwendung verwendet, grafisch darstellen.
Ein visuelles Mapping-Tool, das ich verwendet habe, ist npmgraph.an. Es erstellt eine 2D-Ansicht des Dependency-Baums auf Grundlage einer einzelnen npm-Bibliothek. Anschließend können Sie auf die Baumknoten klicken, die Abhängigkeiten darstellen, um weitere Informationen in einem Fenster links anzuzeigen.

npm über die Kommandozeile verwenden
Ich schätze, wie vielseitig npm ist: Damit können Sie eine globale Bibliothek wie die Snyk CLI installieren oder eine Liste von Bibliotheken und Abhängigkeiten erstellen.
Um einen Dependency-Baum zu erstellen, wechseln Sie in das Stammverzeichnis eines Projekts mit einem Paketmanifest und geben Sie npm list ein. Dadurch wird eine nicht grafische Ausgabe aller Top-Level-Bibliotheken angezeigt, die eine npm-basierte Anwendung verwendet. Weitere Informationen zu einem bestimmten Paket erhalten Sie mit npm list [package].

Der vorherige Befehl zeigt jedoch keine verschachtelten Abhängigkeiten an. Dafür benötigen wir das Tag --depth. Wenn Sie beispielsweise im Stammverzeichnis eines npm-Projekts npm list --depth=5 ausführen, erhalten Sie einen umfassenderen Baum.

Sie können die Tiefe auch für ein bestimmtes Paket festlegen, indem Sie npm list [package] --depth=5 verwenden. Ein Nachteil dieser Methode zum Sortieren von Paketen ist, dass die Navigation schwierig sein kann. In einem großen Dependency-Map verliert man leicht den Überblick.
Snyk Open Source verwenden
Diese Methode kombiniert die Baumansicht der Kommandozeile mit einer visuellen Darstellung und bietet zusätzlich die Erkennung von Schwachstellen.
Legen Sie zunächst ein kostenloses Snyk-Konto an und melden Sie sich an. Verbinden Sie dann das Repository, in dem Ihre App gespeichert ist, mit Snyk und führen Sie einen Scan aus. Klicken Sie dazu auf die Schaltfläche Add Project und wählen Sie das gewünschte Repository aus.

Folgen Sie den Schritten zum Verbinden des Repositorys und erteilen Sie Snyk die Berechtigung, darauf zuzugreifen.
Praktischer Tipp: Bei den meisten Plattformen funktioniert der Scan sowohl mit öffentlichen als auch mit privaten Repositorys.
Suchen Sie nach der Verbindung das App-Repository, für das Sie einen Baum erstellen möchten, und wählen Sie es aus. Klicken Sie dann oben rechts auf die Schaltfläche Add selected repositories, um den Scan zu starten.

Nach Abschluss des Scans sehen Sie eine zusammengefasste Ansicht der Ergebnisse. Wenn Sie die oberste Ebene mit dem Dropdown-Pfeil aufklappen, wird eine Aufschlüsselung aller Elemente angezeigt, die der Scan erkannt hat.

Für diese Übung suchen wir nach einigen Einträgen im npm-Paketmanifest package.json. Klicken Sie auf die Zeile package.json, um die Liste aufzuklappen und erkannte anfällige Pfade in bestimmten Bibliotheken, weitere Informationen zu empfohlenen Korrekturen und mehr anzuzeigen.

Hier entfaltet sich die Jedi-Magie erst richtig. Klicken Sie auf den Tab Dependencies, um eine Liste der Projektabhängigkeiten anzuzeigen. Klicken Sie oben rechts auf das Symbol für die Baumstruktur, um Details wie die Beziehungen zwischen den Bibliotheken und den Ort erkannter Schwachstellen zu sehen.

Jetzt haben Sie einen interaktiven Bibliotheks- und Dependency-Baum, der Ihnen zeigt, wo die anfälligen Pfade beginnen.
Das Beste daran, mit Snyk einen Dependency-Baum zu erstellen, sind die fortlaufenden Scans. Sie informieren Sie über neu auftretende Schwachstellen und schlagen Abhilfemaßnahmen vor, etwa Versionsaktualisierungen oder benutzerdefinierte Patches. Sie können sogar automatische Pull Requests in Ihrem Repository einrichten, damit Schwachstellen noch schneller behoben werden.
Möge die (Open) Source mit Ihnen sein
Die regelmäßige Überprüfung Ihrer Open-Source-Komponenten ist ein wichtiger Bestandteil der Anwendungssicherheit. Dependency-Bäume sind ein guter Ausgangspunkt, um zu verstehen, was Sie verwenden. Ebenso wichtig ist es jedoch, Ihre Anwendung kontinuierlich mit einem Software-Composition-Analysis-Tool (SCA) wie Snyk Open Source zu scannen.
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.



