A la luz del malware reciente en los paquetes npm existentes, me gustaría tener un mecanismo que me permita realizar algunas comprobaciones básicas antes de instalar nuevos paquetes o actualizar los existentes. Mi principal problema son los paquetes que instalo directamente y también los que instalo indirectamente.
En general, quiero obtener una lista de la versión del paquete que npm instalaría antes de instalarlo. Más específicamente, quiero la antigüedad de los paquetes que se instalarían, para poder generar una advertencia si alguno de ellos tiene menos de un día.
Si pudiera hacer eso directamente con npm, sería genial, pero me temo que necesito hacer algunas secuencias de comandos al respecto.
caso de uso específico:
Si npm install react-native-gesture-handler el 2021-10-22, habría ejecutado el gancho posterior a la instalación de una versión maliciosa de ua-parser y mi computadora se habría visto comprometida, que es algo que me gustaría evitar.
Cuando ingreso npm install react-native-gesture-handler --dry-run , solo me dice qué versión de react-native-gesture-handler habría instalado, pero no me dice que instalaría una versión de ua-parser que se lanzó ese día.
Notas adicionales:
npm i --dry-run , pero solo muestra los paquetes directos.npm list , pero solo muestra paquetes después de la instalación (y, por lo tanto, después de que los ganchos de instalación ya hayan hecho daño)Primero instale los paquetes de forma segura, luego use npm list npm view para obtener la antigüedad de los paquetes de instalación.
Opción 1: instalar con --ignore-scripts
npm i --ignore-scripts npm list --depth=100 | awk '{ print $NF }'| tail -n +2 | grep -v "deduped" | xargs -I {} bash -c "npm view {} time.modified _id|tr '\n' ' ' && echo "|sortOpción 2: instalar en docker
docker run -v $PWD/package.json:/a/package.json -v $PWD/package-lock.json:/a/package-lock.json --rm -it node:lts-buster bash cd a && npm i npm list --depth=100 | awk '{ print $NF }'| tail -n +2 | grep -v "deduped" | xargs -I {} bash -c "npm view {} time.modified _id|tr '\n' ' ' && echo "|sortexplicación del script, que imprime las fechas:
npm list --depth=100 obtener una lista de paquetes instalados| awk '{ print $NF }' extrae el id del paquete de cada línea| tail -n +2 coloca la primera línea, que se refiere a la carpeta actual| grep -v "deduped" elimina líneas que se refieren a duplicados| xargs -I {} bash -c para cada subcapa abierta de líneanpm view {} time.modified _id get time y package-id|tr '\n' ' ' && echo elimina el salto de línea entre la hora y el id, y agrega el salto de línea al final|sort ordenar líneas alfabéticamente nota: dado npm view obtiene 1 paquete a la vez a través de la red, la secuencia de comandos tarda aproximadamente 1 s por paquete instalado, lo que sumará un par de minutos para proyectos de tamaño mediano.
Para descubrir el paquete malicioso, necesitará un script que verifique si su paquete tiene vulnerabilidades contra la base de datos nacional de vulnerabilidades .
La base de datos nacional de vulnerabilidades incluye bases de datos de referencias de listas de verificación de seguridad, fallas de software relacionadas con la seguridad, configuraciones incorrectas, nombres de productos y métricas de impacto.
La mayoría de las empresas de software utilizan herramientas de seguridad de aplicaciones como Veracode , Snyk o Checkmarx que, por lo general, lo hacen en una etapa antes de la implementación en la canalización de CICD.
Si está buscando lograr esto localmente, puede probar
npm auditPero esto auditará las dependencias instaladas y también sus subdependencias en su proyecto contra el registro predeterminado ( nexus o artefacto o registro npm ) y obtendrá la lista de vulnerabilidades conocidas con los detalles de la versión en la que está disponible el parche.
npm view le proporcionará los siguientes detalles sobre el paquete, incluso cuando no esté instalado .
las comprobaciones de versión antes de la instalación necesitarían una secuencia de comandos para hacer lo necesario en la preinstalación, sugeriría tener un proyecto dedicado para las comprobaciones de seguridad (reutilizable para todos los proyectos), y
linkopublishy luego configurarlo en las secuencias de comandos de su proyecto como se muestra a continuación,
Proyecto de seguridad:
Esto tendrá la secuencia de comandos para verificar vulnerabilidades, aprovechar npm view npm version y auditar el módulo y luego devolver los resultados.
Proyecto principal:
Aquí configure los scripts en package.json para usar el proyecto publicado anteriormente y verifique las vulnerabilidades antes de la instalación.
npx security-project vulnerabilities scripts: { vulnerability: npx security-project vulnerabilities preinstall: npx security-project vulnerabilities or preinstall: "sh ./checkVulnerabilities.sh" // this script can take package name through command line flags like --package axios } Snyk toma su package.json y escaneará todos los módulos en busca de vulnerabilidades de seguridad. También puede buscar un módulo específico y verificar el puntaje de salud de una versión.
https://snyk.io/advisor/check/npm
Alternativamente, puede usar la extensión Snyk en su IDE para lo mismo.
Tenemos la extensión Chrome RetireJS para escanear la versión vulnerable del módulo JS con vulnerabilidades en la aplicación.
Buena referencia: - 6-herramientas-que-puede-usar-para-verificar-las-vulnerabilidades-en-nodo-js
Arriba están las ideas que se me ocurrieron, espero que ayude.