npm v12 Fortalece la Cadena de Suministro Contra Ataques de 'npm install'
GitHub implementará importantes mejoras de seguridad con npm v12 el próximo mes, abordando directamente la creciente amenaza de los ataques a la cadena de suministro. La actualización alterará fundamentalmente el funcionamiento del comando 'npm install', requiriendo aprobación explícita para la ejecución de código y fuentes de dependencias no registradas que antes se confiaban por defecto. Esta medida busca reducir drásticamente los vectores de ataque comúnmente explotados por actores maliciosos.

**GitHub** ha anunciado una importante revisión de seguridad para **npm v12**, programada para su lanzamiento el próximo mes. Estos cambios están diseñados específicamente para contrarrestar los ataques a la cadena de suministro que aprovechan los comportamientos activados por el ubicuo comando `'npm install'`.
`'npm install'` es el comando responsable de descargar e instalar las dependencias de un proyecto y ejecutar cualquier script de instalación asociado. Los desarrolladores lo utilizan con frecuencia después de clonar proyectos, obtener actualizaciones o durante los procesos de compilación de CI/CD. Los atacantes han apuntado a este comando durante mucho tiempo debido a su potencial para la ejecución automatizada de código durante la instalación de paquetes.
El principio fundamental detrás de esta actualización es un cambio de la confianza implícita a la aprobación explícita para la ejecución de código y las fuentes de dependencias no registradas durante las operaciones de `npm install`.
**GitHub** detalló los siguientes cambios clave en su anuncio:
1. **Restricciones de Ejecución de Scripts**: A partir de **npm v12**, los scripts `preinstall`, `install` y `postinstall` de las dependencias ya no se ejecutarán automáticamente a menos que se aprueben explícitamente. Esta restricción también se extiende a las compilaciones de módulos nativos iniciadas a través de **node-gyp** y a los scripts `prepare` de dependencias de Git, archivos locales y enlazadas.
2. **Resolución de Dependencias de Git**: `npm install` dejará de obtener automáticamente dependencias de repositorios de Git, ya sean directas o transitivas, sin permiso explícito. **GitHub** señala que esto cierra una ruta crítica de ejecución de código donde el archivo `.npmrc` de una dependencia de Git podría ser manipulado para alterar el ejecutable de Git utilizado, incluso si los scripts de instalación estaban deshabilitados.
3. **Resolución de Dependencias de URL Remotas**: Las dependencias instaladas desde URL remotas, como tarballs HTTPS, ya no se resolverán automáticamente. Esto se aplica tanto a dependencias directas como transitivas.
Se espera que estas modificaciones mitiguen significativamente los riesgos de la cadena de suministro al eliminar la ejecución automática de scripts de instalación de dependencias, la resolución automática de dependencias basadas en Git y la resolución automática de dependencias de URL remotas.
Tales nuevos valores predeterminados habrían evitado varios ataques recientes a la cadena de suministro, incluidas campañas maliciosas de scripts `preinstall`/`postinstall` dirigidas a **eslint-config-prettier**, los **paquetes Picasso de Toptal** y numerosos paquetes de **npm** que roban datos. También habrían contrarrestado el abuso de dependencias de Git como se documentó en los ataques de **Shai-Hulud**.
Los proyectos que dependen legítimamente de cualquiera de estos comportamientos deberán optar explícitamente antes de actualizar a **npm v12**.
**GitHub** aconseja a los desarrolladores que se preparen actualizando a **npm 11.16.0** o una versión más reciente. Esta versión mostrará advertencias para todas las acciones que se verán afectadas por **v12**, permitiendo a los desarrolladores identificar y abordar dependencias o flujos de trabajo que requieran aprobación explícita antes de realizar la actualización completa.
Una vez actualizado a **npm v12**, solo los scripts y las fuentes de dependencias aprobados explícitamente funcionarán automáticamente.
Se ha iniciado una [discusión comunitaria](https://github.com/orgs/community/discussions/198547) para que los desarrolladores proporcionen comentarios y sugerencias sobre estos próximos cambios.