In this article
Comment Snyk détecte les vulnérabilités SSRF CVE-2024-24806 de libuv dans le projet Node.js
Node.js est un environnement d’exécution puissant et largement utilisé, qui permet aux développeurs de créer des applications évolutives et performantes avec JavaScript. Cependant, beaucoup ignorent peut-être que Node.js dépend fortement de plusieurs composants open source tiers pour fonctionner efficacement. Parmi les plus importants figurent libuv, OpenSSL et V8. Chacune de ces bibliothèques joue un rôle essentiel dans l’écosystème Node.js :
libuv : fournit le modèle d’E/S événementiel et non bloquant qui caractérise Node.js.
OpenSSL : sécurise les communications en mettant en œuvre des protocoles cryptographiques.
V8 : le moteur JavaScript qui compile et exécute le code JavaScript.
Bien que ces composants tiers permettent à Node.js d’offrir ses fonctionnalités robustes, ils introduisent également des vulnérabilités potentielles que des acteurs malveillants peuvent exploiter. Par exemple, une vulnérabilité dans les bibliothèques libuv ou OpenSSL peut compromettre l’ensemble de l’environnement d’exécution Node.js et entraîner de graves failles de sécurité. Il est donc essentiel que les développeurs sécurisent ces composants afin de protéger leurs applications et leurs données.
Snyk propose une plateforme de sécurité puissante qui aide les développeurs à détecter et à corriger les vulnérabilités de leurs projets, y compris celles introduites par des composants tiers. Parmi ses fonctionnalités phares, Snyk peut effectuer une analyse des composants open source non gérés. Cette fonctionnalité est particulièrement utile pour détecter les vulnérabilités des composants comme libuv, OpenSSL et V8 intégrés à l’environnement d’exécution Node.js.
Comment Snyk identifie-t-il les vulnérabilités dans les dépendances non gérées ?
Snyk convertit les fichiers en empreintes numériques, les compare à une base de données de vulnérabilités connues et affiche les problèmes détectés.
Le rôle de libuv dans Node.js
Le composant open source libuv est une bibliothèque multiplateforme axée sur les E/S asynchrones. Elle fournit la boucle d’événements et constitue le moteur sous-jacent des opérations asynchrones de l’environnement d’exécution Node.js, notamment les interactions avec le système de fichiers, les communications réseau et les minuteries. En somme, libuv est au cœur du modèle d’E/S non bloquant de Node.js : elle lui permet de gérer plusieurs opérations simultanément sans bloquer le thread d’exécution principal (sauf si vous provoquez ce blocage, par exemple en écrivant des expressions régulières inefficaces).
De même, OpenSSL est un autre composant open source tiers qui fournit une boîte à outils complète et robuste pour mettre en œuvre les protocoles Secure Sockets Layer (SSL) et Transport Layer Security (TLS). Dans Node.js, OpenSSL fournit des fonctionnalités cryptographiques qui sécurisent les communications sur les réseaux.
Tout comme les bibliothèques npm classiques peuvent introduire des vulnérabilités de sécurité, les bibliothèques C et C++ intégrées à l’environnement d’exécution Node.js, telles que libuv et OpenSSL, peuvent également présenter des risques pour la sécurité.
La vulnérabilité SSRF CVE-2024-24806 de libuv
Les vulnérabilités de falsification de requête côté serveur (SSRF) permettent aux attaquants d’envoyer des requêtes depuis le serveur vers des destinations non prévues. La vulnérabilité SSRF CVE-2024-24806 de libuv est un problème critique qui peut être exploitée pour manipuler les requêtes du serveur et potentiellement obtenir un accès non autorisé aux systèmes internes et aux données sensibles. Cette vulnérabilité est introduite par la bibliothèque libuv, plus précisément dans la version 1.47.0.
Qu’est-ce que la SSRF ?
La SSRF permet aux attaquants d’envoyer des requêtes conçues à cet effet depuis le serveur, ce qui peut leur donner accès à des services internes et à des données sensibles.
Les risques de sécurité associés à CVE-2024-24806 sont importants. L’exploitation de cette vulnérabilité peut permettre aux attaquants de :
Accéder à des ressources du réseau interne qui ne sont pas destinées à être accessibles au public.
Voler des informations sensibles, telles que des identifiants, des jetons ou des clés API internes.
Lancer des attaques contre des services internes, pouvant entraîner la compromission complète du serveur ou du réseau.
Le projet Node.js a connu plusieurs vulnérabilités dans ses composants tiers. libuv a notamment présenté plusieurs vulnérabilités, dont CVE-2024-24806. OpenSSL, autre composant essentiel, a également connu des problèmes de sécurité, comme la célèbre faille Heartbleed (CVE-2014-0160).
L’arborescence du projet Node.js est présentée ci-dessous. Elle montre comment les dépendances open source tierces sont intégrées à l’environnement d’exécution :
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
|── MakefileDétecter la vulnérabilité CVE-2024-24806 de libuv
Pour voir comment Snyk peut détecter la vulnérabilité SSRF CVE-2024-24806 dans le projet Node.js, suivez ces étapes :
Clonez le dépôt Node.js :
git clone https://github.com/nodejs/nodeConsultez la version précise qui inclut la bibliothèque libuv vulnérable :
git checkout v21.6.0Lancez l’analyse Snyk des composants open source non gérés :
snyk test --unmanaged
Les résultats de l’analyse révèlent la vulnérabilité SSRF de 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.Cette sortie indique la présence d’une vulnérabilité SSRF de gravité élevée (CVE-2024-24806) dans la bibliothèque libuv, plus précisément dans la version 1.47.0. Cette vulnérabilité représente un risque de sécurité important, car elle peut permettre à un attaquant d’envoyer des requêtes non autorisées depuis le serveur.
Le chercheur en sécurité a fourni le code de validation de concept suivant. Il montre comment la fonction vulnérable uv_getaddrinfo de la bibliothèque libuv traite incorrectement les noms d’hôte :
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}
9L’analyse Snyk des composants open source non gérés est un outil puissant pour détecter les vulnérabilités dans les composants tiers qui ne sont pas explicitement gérés par les gestionnaires de paquets. Elle est particulièrement utile pour les projets comme Node.js, qui dépendent de bibliothèques open source telles que libuv, OpenSSL et V8.
L’option de ligne de commande --unmanaged command est particulièrement utile pour les projets C et C++ qui ne sont pas gérés à l’aide d’un manifeste de paquets adapté répertoriant leurs composants : elle analyse tous les fichiers à la recherche de dépendances open source connues.
Lorsque vous exécutez la commande snyk test --unmanaged, Snyk effectue les étapes suivantes :
Analyse : Snyk analyse tous les fichiers du répertoire courant.
Hachage : les fichiers sont convertis en une liste d’empreintes.
Correspondance : ces empreintes sont envoyées au serveur d’analyse Snyk, qui établit la liste des dépendances en interrogeant la base de données.
Association : le serveur associe les dépendances détectées aux vulnérabilités connues.
Affichage : enfin, les résultats s’affichent et mettent en évidence les vulnérabilités détectées.
Ce processus d’analyse aide les développeurs et les équipes d’exploitation à détecter les vulnérabilités dès les premières étapes du développement et de l’intégration continue (CI), afin de garantir que toutes les versions personnalisées de l’environnement d’exécution Node.js sont protégées contre les menaces connues.
En fait, comme le montre l’analyse Snyk, Node.js v21.6.0 présente plus d’une douzaine d’autres vulnérabilités de sécurité attribuées à V8 et OpenSSL :
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.La détection de ces bibliothèques C et C++ non gérées constitue une première étape. Il faut ensuite les surveiller, ce que Snyk permet également de faire avec la commande snyk monitor ou automatiquement lors de l’importation de projets.
L’analyse des composants non gérés de Snyk présente plusieurs avantages :
Détection précoce : détectez les vulnérabilités dès les premières étapes du développement et de l’intégration continue (CI).
Couverture complète : détectez les vulnérabilités dans les composants tiers qui ne sont pas explicitement gérés par les gestionnaires de paquets.
Sécurité renforcée : aidez les développeurs et les équipes d’exploitation qui compilent et construisent leur propre version de l’environnement d’exécution Node.js à partir des sources à sécuriser leurs builds.
Sécuriser Node.js et ses dépendances est essentiel pour préserver la robustesse et la sécurité de votre environnement applicatif. La découverte de la vulnérabilité SSRF CVE-2024-24806 de libuv souligne l’importance d’examiner attentivement les composants open source tiers intégrés à l’environnement d’exécution Node.js. Ces composants, comme libuv, OpenSSL et V8, constituent une surface d’attaque importante que des acteurs malveillants peuvent exploiter.
En intégrant Snyk à votre workflow de développement, vous pouvez gérer de manière proactive les risques de sécurité associés aux composants open source tiers et les atténuer. Pour commencer avec Snyk, inscrivez-vous ici.
Sécurisez vos applications avec Snyk
Lancez-vous avec Snyk pour permettre à vos développeurs de créer en toute sécurité dès le départ.