Snyk descubre actividades de código malicioso en la cadena de suministro de software de código abierto en el registro de npm
5 de mayo de 2021
0 minutos de lecturaEl código abierto ayuda a los desarrolladores a crear más rápido. Pero ¿quién se asegura de que estas dependencias de código abierto (algunas sin desarrollo desde hace años) sigan siendo seguras? En una investigación reciente sobre la seguridad de npm, Snyk descubrió un total de 8 paquetes de npm que coincidían con un vector de ataque específico de código malicioso. Este vector de ataque específico de los paquetes maliciosos incluía paquetes con scripts de preinstalación y posinstalación, que les permitían ejecutar comandos arbitrarios al instalarse.
Los paquetes maliciosos son los siguientes:
Después de identificar los paquetes anteriores, Snyk los reportó al equipo de seguridad de npm para que los marcara como maliciosos y los eliminara del registro de npm, evitando así poner en riesgo a los usuarios finales. El ecosistema de npm es abierto por naturaleza y permite que cualquiera envíe sus paquetes. Esto incluye incluso los que no son de código abierto a través de un repositorio, o los que pueden incluir puertas traseras u otro código malicioso. Con más de 1.5 millones de paquetes en npm, no es fácil monitorearlos y detectarlos a todos a tiempo, lo que crea un terreno de juego lucrativo para los atacantes.
Ahora que los paquetes están marcados, veamos cómo operaban estos paquetes maliciosos de npm y qué intentaban hacer.
Qué podemos aprender al analizar paquetes maliciosos de npm
Empecemos con radar-cms. Primero, empleaba una técnica interesante para ocultarse: el tamaño total del paquete tarball superaba 1 MB, lo que probablemente buscaba pasar desapercibido para algunos sistemas, incluida la pestaña Explore de npm al explorar paquetes en npmjs.com. En la captura de pantalla a continuación puedes ver que el tamaño aumentado del paquete malicioso radar-cms no se muestra para inspección en la página del paquete de npm:

Una vez instalado, el payload malicioso de radar-cms tenía como objetivo específico exfiltrar información de los equipos host. Este es el script postinstall original del paquete malicioso que encontramos en su archivo package.json:
Entonces, ¿cómo podrías haber prevenido este ataque? (Si ya leíste mi blog sobre buenas prácticas de seguridad para npm, seguro que lo sabes).
Una buena práctica para instalar paquetes de forma segura es evitar que los paquetes de npm ejecuten comandos arbitrarios durante la instalación. Así que, la próxima vez que instales un paquete de npm, considera usar el siguiente argumento de línea de comandos para protegerte de los paquetes que ejecutan comandos arbitrarios:
O, si usas yarn:
A continuación, encontramos un conjunto de paquetes de npm llamados paychex-*. Estos paquetes estaban diseñados para robar datos de las variables de entorno al instalarse —esta vez mediante un hook de script preinstall— y enviarlos a un servidor remoto. Vemos que todos están marcados como paquetes maliciosos en la base de datos de Snyk:

Por último, el paquete malicioso rcenodejs tenía un script preinstall similar que creaba una shell inversa para que atacantes remotos se conectaran.
En todos estos casos, puedes evitar que se ejecute código arbitrario durante la instalación del paquete con solo usar:
¿Qué puedo hacer para proteger la cadena de suministro de software en npm?
Lo primero es poder identificar si un paquete de npm es malicioso. Esto quizá no resulte evidente en las páginas de paquetes de npmjs y, una vez que instalas el paquete, ya es demasiado tarde.
Para ayudarte con esto, Snyk Advisor puede mostrarte claramente si se determinó que un paquete es malicioso y no debes instalarlo. Por ejemplo, esta es la página de Advisor del paquete de npm rcenodejs, que muestra una vulnerabilidad de seguridad maliciosa CWE-506.

Cuanto más software se crea, mayor es el riesgo de seguridad que asumimos. Para prepararte mejor con buenas prácticas y herramientas que te ayuden a reducir el riesgo o mitigar por completo este tipo de incidentes de seguridad, te recomiendo lo siguiente:
Consulta estas 10 buenas prácticas de seguridad para npm para asegurarte de seguir convenciones seguras al trabajar con software de código abierto. Estas incluyen habilitar la autenticación de dos factores en npmjs, desactivar la ejecución de comandos arbitrarios por parte de software de código abierto desconocido de terceros y mucho más.
Si estás creando contenedores Docker para Node.js, sigue los pasos descritos en el blog sobre buenas prácticas de seguridad de nivel de producción para crear contenedores basados en Node.js.



