Skip to main content

¿Cuánto sabemos realmente sobre el comportamiento de los paquetes en el registro npm?

Escrito por
How much do you really know about the npm package registry

22 de abril de 2019

0 minutos de lectura

En el Informe sobre el estado de la seguridad del código abierto de 2019 compartimos detalles sobre el crecimiento de los repositorios de paquetes por lenguaje durante los últimos años. Como mostramos, npm supera ampliamente a los demás cada año.

Cuando se escribió este artículo, npm contaba con más de 960.000 paquetes y registró la incorporación de más de 250.000 paquetes tan solo en 2018.

Con esto en mente, ¿te has preguntado cuánto sabes sobre el comportamiento de los paquetes en el ecosistema de npm? ¿Cuántos paquetes están conectados entre sí?

¡Exploremos el mayor registro de paquetes de código abierto de la actualidad!

En su trabajo de investigación publicado recientemente, K. Vaidya, Ruturaj & De Carli, Lorenzo & Davidson, Drew & Rastogi, Vaibhav. (2019). Security Issues in Language-based Sofware [sic] Ecosystems, los autores estudian los ataques de seguridad contra repositorios de lenguajes de código abierto, como npm y PyPI. Se centran principalmente en los paquetes maliciosos y en cómo influyen en ellos las características particulares de cada ecosistema de lenguaje.

Me pareció muy interesante el estudio y quise convertir algunos de sus datos en preguntas para publicar en un medio público como Twitter y conocer la percepción de los desarrolladores de JavaScript sobre el estado de los paquetes y sus conexiones con otros paquetes en el ecosistema de npm.

Ideas equivocadas sobre los paquetes del registro npm

A partir de este artículo de investigación, extraje datos relacionados con las siguientes preguntas para publicar una encuesta general:

  1. ¿Qué porcentaje de los paquetes de npm no tiene dependencias ni paquetes que dependan de ellos?

  2. ¿Cuál es la profundidad promedio de una cadena de dependencias de paquetes en npm?

  3. ¿Cuántos paquetes de npm podrían considerarse *abandonados? (* según una métrica como la falta de versiones nuevas en los últimos 12 meses)

Después de elegir estas preguntas interesantes, publiqué las encuestas en Twitter y recopilé las respuestas.

Paquetes huérfanos en npm

Primera pregunta: ¿Qué porcentaje de los paquetes de npm no tiene dependencias ni paquetes que dependan de ellos?

¿959.567 en npm?
¿Qué porcentaje de los paquetes de #npm no tiene dependencias ni paquetes que dependan de ellos?#javascript #nodejs #npmjs¡Compártelo!

— Liran Tal (@liran_tal) 15 de abril de 2019

La respuesta correcta es: el 28% de los paquetes de npm no tiene dependencias ni paquetes que dependan de ellos.

Como se puede ver, el 66% de las personas cree que el registro npm es una red muy compleja de conexiones entre paquetes. Sin embargo, según el artículo de investigación, solo el 28% de todos los paquetes del registro npm no tiene dependencias ni paquetes que dependan de ellos; apenas el 7% de las personas encuestadas eligió esa respuesta.

En el repositorio PyPI, esta cifra aumenta al 36%.

Profundidad de las cadenas de dependencias en npm

Segunda pregunta: ¿Cuál es la profundidad promedio de una cadena de dependencias de paquetes en npm?

#npmjs tiene 961.600
La profundidad promedio de una cadena de dependencias de paquetes en npm es:#javascript #nodejs #npmjs¡Compártelo!

— Liran Tal (@liran_tal) 17 de abril de 2019

La respuesta correcta es: en promedio, una cadena de dependencias de paquetes en npm tiene una profundidad de 4,39 paquetes.

El informe indica que la profundidad del árbol de dependencias, es decir, la longitud de la cadena de dependencias más larga, es de más de cuatro paquetes en promedio. En PyPI, en cambio, la cifra es de apenas 1,7.

Tabla 3 que compara los grafos de dependencias de paquetes de npm y PyPI según la cantidad de nodos, el grado de salida promedio, el tamaño del árbol de dependencias y la profundidad del árbol.

Una conclusión posible es que los desarrolladores de JavaScript prefieren crear unidades de código más pequeñas y reutilizables, y que efectivamente las reutilizan en distintos proyectos.

Paquetes abandonados en npm

Tercera pregunta: ¿Cuántos paquetes de npm podrían considerarse abandonados?

¡Una última encuesta interesante!
¿Cuántos paquetes de #npm podrían considerarse abandonados[1]?

[1] Según una métrica como la falta de una versión nueva en los últimos 12 meses. Compártelo. #javascript #nodejs #npmjs #opensource— Liran Tal (@liran_tal) 18 de abril de 2019

La respuesta correcta es: el 61% de los paquetes de npm no publicó una versión nueva en los últimos 12 meses.

Como continuación de investigaciones anteriores, este estudio definió los paquetes abandonados según una métrica basada en las publicaciones de versiones. En otras palabras, se consideró abandonado un paquete cuyo responsable no había publicado ninguna versión nueva en los últimos 12 meses.

No es fácil distinguir entre los paquetes sin mantenimiento y los que ya completaron sus funciones y llegaron a una etapa de madurez en la que no necesitan más versiones. Aunque algunas personas podrían cuestionar esta métrica, las cifras son impactantes.

El informe encontró que unos 496.000 paquetes de npm (de un total aproximado de 801.000 en el momento del estudio) no habían tenido ninguna versión nueva en los últimos 12 meses. Eso representa el 61% de los paquetes de npm, sin ninguna versión nueva.

En el repositorio PyPI, la cifra es similar: el 57% de todos los paquetes no tuvo ninguna versión nueva en los últimos 12 meses.

¿Se descargan con menos frecuencia los paquetes abandonados? No necesariamente.

Como muestra el informe, las descargas acumuladas se acercan a los miles de millones en ambos ecosistemas.

El siguiente gráfico muestra 20 de los paquetes más descargados que, según el informe, consideramos abandonados. Estos paquetes, como wordwrap e is-object, suman cientos de millones de descargas al año.

Gráfico de barras que muestra las descargas de paquetes npm abandonados. Wordwrap y lodash encabezan la lista, y los valores tienden a disminuir entre los 20 paquetes.

Resumen

A medida que crece el software de código abierto, podemos esperar más estudios sobre repositorios públicos de paquetes basados en lenguajes y su seguridad.

Gráfico de líneas que muestra el total de paquetes indexados en Maven Central, npm, NuGet, PyPI y RubyGems desde enero de 2017 hasta enero de 2019.

El estudio concluye lo siguiente:

  • Se recomienda mejorar los repositorios de paquetes y los administradores de paquetes. Por ejemplo, en el contexto de los ataques de typosquatting, se recomienda avisar a los usuarios cuando instalen paquetes equivocados que no tenían intención de instalar.

  • La naturaleza de estos ecosistemas indica que están «expuestos a la explotación y que el número de incidentes solo aumentará en el futuro», según el informe.

Usa código abierto. Mantente seguro.

Empieza con los desafíos de Capture the Flag

Aprende a resolver desafíos de captura la bandera con nuestro taller virtual introductorio a pedido.