Un vistazo de Snyk al informe sobre el estado de la seguridad del código abierto en Node.js y npm de 2019
9 de octubre de 2019
0 minutos de lecturaEn el informe sobre el estado de la seguridad del código abierto de 2019, nos propusimos evaluar la situación de la seguridad del código abierto en los distintos ecosistemas de lenguajes de programación. Analizamos las respuestas de más de 500 usuarios y mantenedores de proyectos de código abierto, quienes compartieron información sobre sus procesos, sus conocimientos de los riesgos de seguridad del código abierto y el nivel de habilidad de los mantenedores en general.
Además de obtener información de las personas encuestadas, analizamos datos de varias fuentes públicas y privadas, incluida la base de datos de vulnerabilidades de Snyk, para evaluar cómo varían los problemas de seguridad entre los lenguajes, cuánto tardan los usuarios en adoptar actualizaciones de versión que incluyen correcciones de seguridad y mucho más. En el informe de este año, también investigamos cómo afectan las vulnerabilidades a quienes usan Docker y qué debes saber para mitigar el riesgo de seguridad.
Haz una prueba rápida para detectar vulnerabilidades conocidas en repositorios públicos de GitHub y paquetes de npm.
El ecosistema de npm
Al consultar Snyk Vulnerability Database, identificamos varios tipos de vulnerabilidades con una presencia particular y significativa en los ecosistemas de JavaScript y Node.js. El primer grupo corresponde a las vulnerabilidades de recorrido de rutas y directorios (Path and Directory Traversal), que se destacan en el ecosistema de npm y alcanzaron cifras récord en 2017 y 2018: 146 y 143 divulgaciones, respectivamente. Los demás ecosistemas están muy por detrás… ¿o debería decir por delante? En cualquier caso, que se reporten menos vulnerabilidades es positivo para ellos.
Cientos de estas vulnerabilidades se pueden atribuir a las investigaciones de seguridad que Snyk realizó en colaboración con Liang Gong, investigador de seguridad en Facebook y doctorando en ciencias de la computación en Berkeley. La investigación descubrió decenas de vulnerabilidades de recorrido de directorios en el ecosistema de npm. Además, demostró que los servidores web estáticos y dinámicos son comunes en el registro de npm, ya que muchos casos de uso de desarrollo requieren este tipo de servidores.

Otro tipo de vulnerabilidad interesante, casi exclusivo de Node.js, es la denegación de servicio mediante expresiones regulares (ReDoS). Este tipo de ataque aprovecha las vulnerabilidades de complejidad no lineal en el peor de los casos que pueden provocar algunos patrones de expresiones regulares. En un entorno de ejecución de un solo hilo, esto puede ser devastador, por lo que Node.js se ve especialmente afectado por este tipo de vulnerabilidad. Es posible que esto cambie, por supuesto, con el aumento de popularidad de las tecnologías sin servidor. Con un modelo de pago por uso, un ataque ReDoS puede provocar que el sistema escale dinámicamente, lo que podría resultar muy costoso para el propietario del servicio; quizá incluso en una situación de denegación de fondos.
El entorno de ejecución de Node.js tiene muchas fortalezas. Una de ellas es el bucle de eventos de un solo hilo, que también puede ser su punto más débil si se usa incorrectamente. Esto ocurre con más frecuencia de lo que se podría pensar. En marzo de 2018, una actualización de seguridad del entorno de ejecución oficial de Node.js incluyó un parche para corregir una vulnerabilidad ReDoS de gravedad alta en el módulo principal path, que afectaba a las versiones de Node.js 4.x. La corrección de la vulnerabilidad, descubierta por James Davis de Virginia Tech, también se incorporó a Node.js 6.x y versiones posteriores para mitigar el problema.
Para destacar lo particular que es esta vulnerabilidad en Node.js, examinamos otros ecosistemas entre 2016 y 2019 y descubrimos que en PHP solo se reportó una vulnerabilidad ReDoS en 2017. En los ecosistemas de Java y Ruby se reportó una vulnerabilidad en cada uno en 2018. En cambio, en Node.js se reportaron 116 vulnerabilidades en total durante los últimos tres años, y la tasa de divulgación muestra una tendencia al alza. Dicho esto, es importante distinguir entre las vulnerabilidades que existen en el código y las que realmente se reportan. Estas cifras no indican cuántas vulnerabilidades se incorporaron a las bases de código durante este período, sino cuántas se descubrieron y eliminaron de ellas. También podríamos haber visto este gráfico con satisfacción al comprobar que se está poniendo el foco en encontrar y eliminar vulnerabilidades ReDoS, lo que significaría que probablemente veremos menos problemas en el futuro.

Sigue leyendo para conocer más hallazgos del informe y consulta el nuevo Informe sobre el estado de la seguridad del código abierto de 2020.