Skip to main content

Das sind nicht die npm-Pakete, nach denen Sie suchen

Artikel von
Headshot of DeveloperSteve Coochin

DeveloperSteve Coochin

feature may base

4. Mai 2022

0 Min. Lesezeit

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

npm-Paket-Seite von Electron mit dem Electron-Logo, dem Installationsbefehl „npm i electron“, wöchentlichen Downloads, Version, Lizenz und Projektdetails.

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.

Snyk Advisor-Seite zum npm-Paket Electron mit einem Gesundheitswert von 92/100, Sicherheitsstatus und ähnlichen Paketen.

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.

Wartungs-Dashboard mit dem Status „Healthy“, das die monatliche Commit-Häufigkeit von April 2021 bis April 2022 sowie Repository-Aktivitätsmetriken zeigt.

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.

Abhängigkeitsdiagramm für das npm-Paket fs-extra@8.1.0 mit Paketdetails und Avataren der Maintainer in einer Seitenleiste

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

Terminalausgabe mit einem Abhängigkeitsbaum für npm-Pakete, der Paketnamen und Versionsnummern zeigt.

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.

Terminalausgabe mit dem Befehl npm list --depth=5 und einer Baumstruktur der installierten JavaScript-Paketabhängigkeiten.

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.

Repository-Integrationsoptionen für GitHub, Cloud Foundry, Bitbucket Cloud, CLI, die Überwachung öffentlicher GitHub-Repositories und weitere Quellen

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.

Snyk-Bildschirm zur Auswahl eines GitHub-Repositorys mit der Suche nach „nodejs-goof“ und dem ausgewählten Repository snyk-labs.

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.

Sicherheits-Scan-Dashboard für developersteve/nodejs-goof mit Code-Analyse, Dockerfile- und package.json-Ergebnissen sowie Anzahl der Schweregrade und Testzeiten.

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.

Sicherheits-Dashboard mit 93 Problemen, darunter eine kritische Sicherheitslücke in adm-zip mit CVE-2018-1002204 und CVSS 9,4

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.

Snyk-Abhängigkeitsbaum mit goof@1.0.1 und verschachtelten npm-Paketen, einschließlich Kennzeichnungen für Sicherheitsprobleme und einer Liste mit 565 Abhängigkeiten

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.

Weiterlesen

AI Background min crop
Blog

KI ruft alle Risiken auf den Plan, die Sie akzeptiert haben: Sieben Erkenntnisse aus dem AI Security Panel: Unfiltered

KI macht Angriffe günstiger und schneller und legt Risiken offen, die Unternehmen bereits tragen. Vier Sicherheitsverantwortliche erklären, warum Abwehr in Maschinengeschwindigkeit und schnellere Behebung jetzt unverzichtbar sind.

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 Upgrades von Abhängigkeiten. Eine Behebung zählt nur, wenn die Sicherheitslücke geschlossen ist und Build und 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 ist schneller als herkömmliche Sicherheitsabläufe. Snyks Agentic AppSec setzt Sicherheitsagenten ein, um Schwachstellen kontinuierlich zu finden, zu beheben und zu überprüfen – während Menschen die Maßstäbe festlegen.