In this article
Cómo Snyk detecta vulnerabilidades SSRF en libuv CVE-2024-24806 en el proyecto Node.js
Node.js es un entorno de ejecución potente y ampliamente utilizado que permite a los desarrolladores crear aplicaciones escalables y de alto rendimiento con JavaScript. Sin embargo, muchos desarrolladores quizá no sepan que Node.js depende en gran medida de varios componentes de código abierto de terceros para funcionar correctamente. Entre los más importantes están libuv, OpenSSL y V8. Cada una de estas bibliotecas cumple una función esencial en el ecosistema de Node.js:
libuv: proporciona el modelo de E/S no bloqueante y basado en eventos por el que se conoce a Node.js.
OpenSSL: garantiza una comunicación segura mediante la implementación de protocolos criptográficos.
V8: el motor de JavaScript que compila y ejecuta código JavaScript.
Aunque estos componentes de terceros permiten que Node.js ofrezca sus sólidas funcionalidades, también introducen posibles vulnerabilidades que los actores maliciosos pueden aprovechar. Por ejemplo, una vulnerabilidad en las bibliotecas libuv u OpenSSL puede comprometer todo el entorno de ejecución de Node.js y provocar graves brechas de seguridad. Por eso, es fundamental que los desarrolladores protejan estos componentes para resguardar sus aplicaciones y datos.
Snyk ofrece una potente plataforma de seguridad que ayuda a los desarrolladores a identificar y corregir las vulnerabilidades de sus proyectos, incluidas las que introducen los componentes de terceros. Una de sus funciones más destacadas es la capacidad de Snyk para realizar análisis de código abierto no administrado. Esta función resulta especialmente útil para detectar vulnerabilidades en componentes como libuv, OpenSSL y V8, integrados en el entorno de ejecución de Node.js.
¿Cómo identifica Snyk las vulnerabilidades en las dependencias no administradas?
Snyk convierte los archivos en hashes, los compara con una base de datos de vulnerabilidades conocidas y muestra los problemas que detecta.
La función de libuv en Node.js
El componente de código abierto libuv es una biblioteca multiplataforma que se enfoca en la E/S asíncrona. Proporciona el bucle de eventos y es el motor subyacente de las operaciones asíncronas, como las interacciones con el sistema de archivos, la comunicación de red y los temporizadores, en el entorno de ejecución de Node.js. En esencia, libuv es la base del modelo de E/S no bloqueante de Node.js, que le permite manejar varias operaciones al mismo tiempo sin bloquear el hilo principal de ejecución (a menos que lo provoques, por ejemplo, al escribir expresiones regulares ineficientes).
De manera similar, OpenSSL es otro componente de código abierto de terceros que ofrece un conjunto de herramientas completo y sólido para implementar los protocolos Secure Sockets Layer (SSL) y Transport Layer Security (TLS). En Node.js, OpenSSL proporciona funciones criptográficas que garantizan una comunicación segura a través de redes.
Al igual que las bibliotecas habituales de npm pueden introducir vulnerabilidades de seguridad, las bibliotecas C y C++ integradas en el entorno de ejecución de Node.js, como libuv y OpenSSL, también pueden implicar riesgos de seguridad.
La vulnerabilidad SSRF CVE-2024-24806 de libuv
Las vulnerabilidades de falsificación de solicitudes del lado del servidor (SSRF) permiten que los atacantes realicen solicitudes desde el servidor a destinos no previstos. La vulnerabilidad SSRF CVE-2024-24806 en libuv es un problema crítico que puede explotarse para manipular las solicitudes del servidor y permitir el acceso no autorizado a sistemas internos y datos confidenciales. Esta vulnerabilidad se introduce a través de la biblioteca libuv, específicamente en la versión 1.47.0.
¿Qué es SSRF?
SSRF permite a los atacantes enviar solicitudes manipuladas desde el servidor y, potencialmente, acceder a servicios internos y datos confidenciales.
Los riesgos de seguridad asociados con CVE-2024-24806 son importantes. Si se explota esta vulnerabilidad, los atacantes pueden:
Acceder a recursos de la red interna que no deberían estar disponibles públicamente.
Robar información confidencial, como credenciales, tokens o claves de API internas.
Atacar servicios internos, lo que podría provocar el compromiso total del servidor o la red.
El proyecto Node.js ha tenido varias vulnerabilidades en sus componentes de terceros. Por ejemplo, libuv ha presentado múltiples vulnerabilidades, incluida CVE-2024-24806. OpenSSL, otro componente fundamental, también ha tenido sus propios problemas de seguridad, como el infame error Heartbleed (CVE-2014-0160).
La estructura del árbol de directorios del proyecto Node.js es la siguiente y muestra cómo se incluyen las dependencias de código abierto de terceros en el entorno de ejecución:
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
|── MakefileCómo detectar la vulnerabilidad CVE-2024-24806 de libuv
Para ver cómo Snyk puede detectar la vulnerabilidad SSRF CVE-2024-24806 en el proyecto Node.js, sigue estos pasos:
Clona el repositorio de Node.js:
git clone https://github.com/nodejs/nodeCambia a la versión específica que incluye la biblioteca libuv vulnerable:
git checkout v21.6.0Ejecuta el análisis de código abierto no administrado de Snyk:
snyk test --unmanaged
Los resultados del análisis detectarán la vulnerabilidad SSRF en 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.Este resultado indica que la biblioteca libuv, específicamente la versión 1.47.0, presenta una vulnerabilidad SSRF de gravedad alta (CVE-2024-24806). Esta vulnerabilidad supone un riesgo de seguridad importante, ya que puede permitir que un atacante realice solicitudes no autorizadas desde el servidor.
El investigador de seguridad proporcionó el siguiente código de prueba de concepto, que muestra cómo la función vulnerable uv_getaddrinfo de la biblioteca libuv maneja incorrectamente los nombres de host:
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}
9El análisis de código abierto no administrado de Snyk es una herramienta potente para identificar vulnerabilidades en componentes de terceros que los administradores de paquetes no administran explícitamente. Resulta especialmente útil en proyectos como Node.js, que dependen de bibliotecas de código abierto como libuv, OpenSSL y V8.
La opción de línea de comandos --unmanaged command resulta especialmente útil para proyectos C y C++ que no se administran con un manifiesto de paquetes adecuado que defina sus componentes, ya que analiza todos los archivos para encontrar dependencias de código abierto conocidas.
Cuando ejecutas el comando snyk test --unmanaged, Snyk realiza los siguientes pasos:
Análisis: Snyk analiza todos los archivos del directorio actual.
Hashing: convierte estos archivos en una lista de hashes.
Coincidencias: estos hashes se envían al servidor de análisis de Snyk, que obtiene la lista de dependencias al consultar la base de datos.
Vinculación: el servidor vincula las dependencias identificadas con las vulnerabilidades conocidas.
Visualización: por último, se muestran los resultados y se destacan las vulnerabilidades encontradas.
Este proceso de análisis ayuda a los desarrolladores y a los equipos de operaciones a detectar vulnerabilidades en las primeras etapas del desarrollo y en CI, y garantiza que las versiones personalizadas del entorno de ejecución de Node.js sean seguras frente a amenazas conocidas.
De hecho, como muestra el análisis de Snyk, Node.js v21.6.0 tiene más de una docena de vulnerabilidades de seguridad adicionales atribuidas a V8 y 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.Encontrar estas bibliotecas C y C++ no administradas es el primer paso; luego hay que monitorearlas, algo que Snyk también permite mediante el comando snyk monitor o automáticamente al importar proyectos.
El análisis no administrado de Snyk ofrece varios beneficios:
Detección temprana: permite detectar vulnerabilidades en las primeras etapas del proceso de desarrollo y CI.
Cobertura integral: identifica vulnerabilidades en componentes de terceros que los administradores de paquetes quizá no administren explícitamente.
Mayor seguridad: ayuda a los desarrolladores y a los equipos de operaciones que compilan y crean su propia versión del entorno de ejecución de Node.js desde el código fuente a proteger sus compilaciones.
Proteger Node.js y sus dependencias es fundamental para mantener un entorno de aplicaciones sólido y seguro. El descubrimiento de la vulnerabilidad SSRF CVE-2024-24806 de libuv resalta la importancia de analizar minuciosamente los componentes de código abierto de terceros integrados en el entorno de ejecución de Node.js. Estos componentes, como libuv, OpenSSL y V8, representan una superficie de ataque importante que los actores maliciosos pueden aprovechar.
Al integrar Snyk en tu flujo de trabajo de desarrollo, puedes gestionar y mitigar de forma proactiva los riesgos de seguridad asociados con los componentes de código abierto de terceros. Para empezar a usar Snyk, regístrate aquí.
Protege tus aplicaciones con Snyk
Empieza a usar Snyk para que tus desarrolladores puedan crear de forma segura desde el inicio.