In this article
Wie Snyk SSRF-Schwachstellen in libuv (CVE-2024-24806) im Node.js-Projekt aufdeckt
Node.js ist eine leistungsstarke und weit verbreitete Laufzeitumgebung, mit der Entwickler skalierbare und hochperformante Anwendungen mit JavaScript erstellen können. Vielen Entwicklern ist jedoch möglicherweise nicht bewusst, dass Node.js für seine Funktion auf mehrere Open-Source-Komponenten von Drittanbietern angewiesen ist. Dazu gehören insbesondere libuv, OpenSSL und V8. Jede dieser Bibliotheken spielt eine entscheidende Rolle im Node.js-Ökosystem:
libuv: Stellt das ereignisgesteuerte, nicht blockierende E/A-Modell bereit, für das Node.js bekannt ist.
OpenSSL: Sorgt durch die Implementierung kryptografischer Protokolle für sichere Kommunikation.
V8: Die JavaScript-Engine, die JavaScript-Code kompiliert und ausführt.
Diese Komponenten von Drittanbietern ermöglichen Node.js zwar seine leistungsstarken Funktionen, bringen aber auch potenzielle Schwachstellen mit sich, die Angreifer ausnutzen können. Eine Schwachstelle in den Bibliotheken libuv oder OpenSSL kann beispielsweise die gesamte Node.js-Laufzeitumgebung gefährden und zu schwerwiegenden Sicherheitsvorfällen führen. Daher müssen Entwickler diese Komponenten unbedingt absichern, um ihre Anwendungen und Daten zu schützen.
Snyk bietet eine leistungsstarke Sicherheitsplattform, mit der Entwickler Schwachstellen in Projekten erkennen und beheben können – auch solche, die durch Komponenten von Drittanbietern entstehen. Zu den besonderen Funktionen gehört das Scannen nicht verwalteter Open-Source-Komponenten. Damit lassen sich Schwachstellen in Komponenten wie libuv, OpenSSL und V8 erkennen, die in die Node.js-Laufzeitumgebung integriert sind.
Wie identifiziert Snyk Schwachstellen in nicht verwalteten Abhängigkeiten?
Snyk wandelt Dateien in Hashes um, gleicht diese mit einer Datenbank bekannter Schwachstellen ab und zeigt alle erkannten Probleme an.
Die Rolle von libuv in Node.js
Die Open-Source-Komponente libuv ist eine plattformübergreifende Supportbibliothek mit Schwerpunkt auf asynchroner E/A. Sie stellt die Ereignisschleife bereit und bildet die zugrunde liegende Engine für asynchrone Vorgänge wie Dateisystemzugriffe, Netzwerkkommunikation und Timer in der Node.js-Laufzeitumgebung. libuv ist im Grunde das Rückgrat des nicht blockierenden E/A-Modells von Node.js. Dadurch kann Node.js mehrere Vorgänge gleichzeitig verarbeiten, ohne den Hauptausführungsthread zu blockieren – es sei denn, Sie verursachen eine Blockierung, etwa durch ineffiziente reguläre Ausdrücke.
OpenSSL ist ebenfalls eine Open-Source-Komponente eines Drittanbieters. Sie stellt ein robustes, umfassendes Toolkit zur Implementierung der Protokolle Secure Sockets Layer (SSL) und Transport Layer Security (TLS) bereit. In Node.js bietet OpenSSL kryptografische Funktionen und sorgt so für sichere Netzwerkkommunikation.
Wie bei regulären npm-Bibliotheken, die Sicherheitslücken mit sich bringen können, können auch die in die Node.js-Laufzeitumgebung integrierten C- und C++-Bibliotheken wie libuv und OpenSSL Sicherheitsrisiken bergen.
Die SSRF-Schwachstelle CVE-2024-24806 in libuv
SSRF-Schwachstellen (Server-Side Request Forgery) ermöglichen es Angreifern, Anfragen vom Server an unbeabsichtigte Ziele zu senden. Die SSRF-Schwachstelle CVE-2024-24806 in libuv ist ein kritisches Problem, das sich ausnutzen lässt, um Serveranfragen zu manipulieren. Dies kann zu unbefugtem Zugriff auf interne Systeme und sensible Daten führen. Die Schwachstelle wird durch die libuv-Bibliothek eingeführt, konkret in Version 1.47.0.
Was ist SSRF?
SSRF ermöglicht es Angreifern, manipulierte Anfragen vom Server aus zu senden und so möglicherweise auf interne Dienste und sensible Daten zuzugreifen.
Die mit CVE-2024-24806 verbundenen Sicherheitsrisiken sind erheblich. Durch die Ausnutzung dieser Schwachstelle können Angreifer:
Auf interne Netzwerkressourcen zugreifen, die nicht öffentlich erreichbar sein sollen.
Sensible Informationen wie Zugangsdaten, Tokens oder interne API-Schlüssel stehlen.
Angriffe auf interne Dienste durchführen, die möglicherweise zur vollständigen Kompromittierung des Servers oder Netzwerks führen.
Im Node.js-Projekt gab es mehrere Schwachstellen in Komponenten von Drittanbietern. So wies libuv mehrere Schwachstellen auf, darunter CVE-2024-24806. Auch OpenSSL, ein weiteres zentrales Element, war von Sicherheitsproblemen betroffen, etwa von der berüchtigten Heartbleed-Schwachstelle (CVE-2014-0160).
Die Verzeichnisstruktur des Node.js-Projekts sieht wie folgt aus und zeigt, wie Open-Source-Abhängigkeiten von Drittanbietern in die Laufzeitumgebung eingebunden werden:
node
|── doc
|── lib
|── src
|── test
|── deps
|── ada
|── uv
|── docs
|── include
|── m4
|── src
|── test
|── autogen.sh
|── common.gpyi
|── libuv.pc.in
|── Makefile.am
|── uv.gyp
|── v8
|── zlib
|── configure
|── configure.py
|── MakefileDie Schwachstelle CVE-2024-24806 in libuv erkennen
Führen Sie die folgenden Schritte aus, um zu sehen, wie Snyk die SSRF-Schwachstelle CVE-2024-24806 im Node.js-Projekt aufdeckt:
Klonen Sie das Node.js-Repository:
git clone https://github.com/nodejs/nodeWechseln Sie zu der spezifischen Version, die die anfällige libuv-Bibliothek enthält:
git checkout v21.6.0Führen Sie den Snyk-Scan für nicht verwaltete Open-Source-Komponenten aus:
snyk test --unmanaged
Die Scan-Ergebnisse zeigen die SSRF-Schwachstelle in libuv:
Testing /Users/lirantal/projects/repos/node...
Issues:
[High] Server-Side Request Forgery (SSRF)
Introduced through: https://github.com|libuv/libuv@1.47.0
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-LIBUVLIBUV-6234013
Tested 9 dependencies for known issues, found 21 issues.Diese Ausgabe zeigt, dass eine SSRF-Schwachstelle mit hohem Schweregrad (CVE-2024-24806) in der libuv-Bibliothek vorhanden ist, konkret in Version 1.47.0. Diese Schwachstelle stellt ein erhebliches Sicherheitsrisiko dar, da Angreifer dadurch unbefugte Anfragen vom Server aus senden können.
Der Sicherheitsforscher stellte den folgenden Proof-of-Concept-Code bereit. Er zeigt, wie die anfällige Funktion uv_getaddrinfo in der libuv-Bibliothek Hostnamen fehlerhaft verarbeitet:
1function attack() {
2 for (let i = 0; i < 128; i++) {
3 const payload = '0x' + '0'.repeat(246) + '7f000001'
4 fetch(`http://localhost?url=http://${payload}.example.com:3000/secret`)
5 .then((x) => x.text())
6 .then(console.log)
7 }
8}
9Mit dem Snyk-Scan für nicht verwaltete Open-Source-Komponenten lassen sich Schwachstellen in Komponenten von Drittanbietern erkennen, die nicht explizit von Paketmanagern verwaltet werden. Das ist besonders nützlich für Projekte wie Node.js, die auf Open-Source-Bibliotheken wie libuv, OpenSSL und V8 angewiesen sind.
Das Befehlszeilen-Flag --unmanaged command ist besonders nützlich für C- und C++-Projekte, die nicht über ein geeignetes Paketmanifest verfügen, in dem die Komponenten definiert sind. Es scannt alle Dateien nach bekannten Open-Source-Abhängigkeiten.
Wenn Sie den Befehl snyk test --unmanaged ausführen, führt Snyk die folgenden Schritte durch:
Scannen: Snyk scannt alle Dateien im aktuellen Verzeichnis.
Hashing: Die Dateien werden in eine Liste mit Hashes umgewandelt.
Abgleich: Diese Hashes werden an den Snyk-Scan-Server gesendet. Dort wird durch Datenbankabfragen die Abhängigkeitsliste erstellt.
Zuordnung: Der Server ordnet die erkannten Abhängigkeiten bekannten Schwachstellen zu.
Anzeige: Abschließend werden die Ergebnisse angezeigt und alle gefundenen Schwachstellen hervorgehoben.
Mit diesem Scan-Verfahren können Entwicklungs- und Betriebsteams Schwachstellen frühzeitig in der Entwicklung und in CI erkennen. So lässt sich sicherstellen, dass individuell erstellte Node.js-Laufzeitversionen vor bekannten Bedrohungen geschützt sind.
Tatsächlich weist Node.js v21.6.0 mehr als ein Dutzend weitere Sicherheitslücken auf, die auf V8 und OpenSSL zurückzuführen sind, wie der Snyk-Scan zeigt:
snyk test --unmanaged
Testing /Users/lirantal/projects/repos/node...
Issues:
✗ [Low] Uncontrolled Resource Consumption ('Resource Exhaustion')
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6592764
✗ [Low] Uncontrolled Resource Consumption
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6913421
✗ [Medium] Uncontrolled Resource Consumption ('Resource Exhaustion')
Introduced through: https://github.com|nodejs/node@21.6.0
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-NODEJSNODE-6478265
✗ [Medium] Denial of Service (DoS)
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6050293
✗ [Medium] Use of a Broken or Risky Cryptographic Algorithm
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6149450
✗ [Medium] Resource Exhaustion
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6157247
✗ [Medium] NULL Pointer Dereference
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6210213
✗ [Medium] Observable Timing Discrepancy
Introduced through: https://openssl.org|openssl@3.0.12
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-OPENSSL-6277384
✗ [Medium] Improper Input Validation
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-2365614
✗ [Medium] Improper Input Validation
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-2365619
✗ [High] Server-Side Request Forgery (SSRF)
Introduced through: https://github.com|libuv/libuv@1.47.0
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-LIBUVLIBUV-6234013
✗ [High] Security Features
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-2365596
✗ [High] Out-of-Bounds
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-2365620
✗ [High] Out-of-Bounds
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-6672126
✗ [High] Improper Restriction of Operations within the Bounds of a Memory Buffer
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-6672127
✗ [High] NULL Pointer Dereference
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-6672131
✗ [High] Denial of Service (DoS)
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-6672137
✗ [High] Heap-based Buffer Overflow
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-6672138
✗ [High] Type Confusion
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-7015516
✗ [High] Access of Resource Using Incompatible Type ('Type Confusion')
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-7086414
✗ [Critical] Type Confusion
Introduced through: https://github.com|v8/v8@11.8.172.17-pgo
URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-V8V8-6672130
Tested 9 dependencies for known issues, found 21 issues.Das Auffinden dieser nicht verwalteten C- und C++-Bibliotheken ist der erste Schritt. Anschließend müssen sie überwacht werden. Auch das unterstützt Snyk – über den Befehl snyk monitor oder automatisch beim Importieren von Projekten.
Der Scan nicht verwalteter Komponenten mit Snyk bietet mehrere Vorteile:
Früherkennung: Schwachstellen frühzeitig im Entwicklungs- und CI-Prozess erkennen.
Umfassende Abdeckung: Schwachstellen in Komponenten von Drittanbietern erkennen, die möglicherweise nicht explizit von Paketmanagern verwaltet werden.
Mehr Sicherheit: Entwicklungs- und Betriebsteams unterstützen, die ihre eigene Node.js-Laufzeitversion aus dem Quellcode kompilieren und erstellen, damit sie ihre Builds absichern können.
Die Absicherung von Node.js und seinen Abhängigkeiten ist entscheidend für eine robuste und sichere Anwendungsumgebung. Die Entdeckung der SSRF-Schwachstelle CVE-2024-24806 in libuv unterstreicht, wie wichtig es ist, in die Node.js-Laufzeitumgebung integrierte Open-Source-Komponenten von Drittanbietern genau zu prüfen. Diese Komponenten wie libuv, OpenSSL und V8 stellen eine erhebliche Angriffsfläche dar, die Angreifer ausnutzen können.
Wenn Sie Snyk in Ihren Entwicklungsworkflow integrieren, können Sie Sicherheitsrisiken im Zusammenhang mit Open-Source-Komponenten von Drittanbietern proaktiv verwalten und minimieren. Melden Sie sich hier an, um mit Snyk loszulegen.
Sichern Sie Ihre Anwendungen mit Snyk
Starten Sie mit Snyk und ermöglichen Sie Ihren Entwicklern, von Anfang an sicher zu entwickeln.