Próximos cambios incompatibles en npm v12
(github.blog)- En npm v12, los valores predeterminados relacionados con la seguridad de
npm installcambiarán de ejecución e interpretación automáticas a un esquema de autorización explícita, y se pueden revisar con anticipación mediante advertencias en npm 11.16.0 o superior - El valor predeterminado de
allowScriptscambiará a desactivado, bloqueando la ejecución de scriptspreinstall,installypostinstallde dependencias que no hayan sido autorizadas explícitamente, así como elnode-gyp rebuildimplícito y los scriptspreparede dependenciasgit,fileylink - Con
npm approve-scripts --allow-scripts-pendingse pueden revisar los paquetes que serán bloqueados, y luego usarnpm approve-scriptsynpm deny-scriptspara decidir qué se permite o bloquea; la allowlist generada debe confirmarse enpackage.json - El valor predeterminado de
--allow-gitcambiará anone, por lo que se dejará de resolver dependencias Git directas y transitivas que no hayan sido autorizadas explícitamente con--allow-git - Se bloquea una ruta de ejecución de código por la que el
.npmrcde dependencias Git podía sobrescribir el ejecutable de Git incluso cuando se usaba--ignore-scripts - El valor predeterminado de
--allow-remotecambiará anone, por lo que se dejarán de resolver dependencias por URL remota, como tarballs https, que no hayan sido autorizadas explícitamente con--allow-remote - Los valores predeterminados de
--allow-filey--allow-directoryno cambian en npm v12 - El procedimiento de preparación consiste en actualizar a npm 11.16.0 o superior, ejecutar una instalación normal para revisar las advertencias y aprobar solo los paquetes de confianza; después de la actualización, solo seguirán ejecutándose los scripts aprobados
- Documentación relacionada:
npm approve-scripts,npm deny-scripts,allow-scriptsconfig
1 comentarios
Comentarios de Hacker News
No sé cómo se me pasó que npm fue adquirido por GitHub, pero de repente muchas cosas empiezan a tener sentido
Cuesta pensar en un peor hogar para una parte tan importante del ecosistema de Node
https://github.blog/news-insights/company-news/npm-is-joinin...
Es “adoptar, extender y extinguir”
https://en.wikipedia.org/wiki/Embrace,_extend,_and_extinguis...
Los scripts de postinstall debieron eliminarse hace mucho tiempo; son como un cáncer en los paquetes de NPM
Hay demasiados
postinstallprofundos, anidados y sin control ejecutándose aleatoriamente cuando traes cualquier cosaNo sé quién pensó en algún momento que esto era una buena idea
Normalmente igual vas a ejecutar en algún momento el código de dependencias empaquetado, y por lo general con los mismos permisos que en el proceso de instalación
Entonces esos scripts de configuración, para bien o para mal, solo moverían el punto de entrada desde npm al lugar donde ocurra un
importorequireA menos que todo el ecosistema se mueva a un entorno sandbox tipo Deno, como mucho esto parece un pequeño obstáculo. Aunque quizás ese sea el plan
El ejemplo que se me viene de inmediato es https://www.npmjs.com/package/patch-package
Ojalá la histeria actual no lleve a decisiones inútiles de este tipo
Esto probablemente se ha discutido cientos de veces dentro de NPM desde que se reportó públicamente hace 10 años
Por culpa de Shai Halud, ahora ya es demasiado grande para ignorarlo
“Lo arreglamos pronto” casi siempre termina siendo “mierda, ahora sí hay que arreglarlo”
Me pregunto si las versiones actuales LTS de Node, si no recuerdo mal 22, 24 y 26, planean subir el npm incluido a v12 para beneficiarse de esta corrección de seguridad
Ahora mismo todas incluyen npm v11
En v18.19.0[1] y v20.10.0[2] subieron npm de 9 a 10
[1]: https://nodejs.org/en/blog/release/v18.19.0#npm-updated-to-v...
[2]: https://nodejs.org/en/blog/release/v20.10.0
Como dice el artículo, solo hace falta configurar los valores correctos por defecto
Lo mejor de este cambio es que, al cambiar el valor por defecto, vamos a ver romperse de inmediato esos paquetes molestos que asumen que estas configuraciones estarán activadas cuando un desarrollador nuevo simplemente corra install
Por ejemplo, podría hacer que se abandone la práctica de asumir que se pueden ejecutar scripts
No queda claro solo leyendo el artículo, pero parece que la lista de scripts permitidos no es una configuración global sino que admite permisos por paquete
Parece que será más fácil mantener reglas organizacionales que solo permitan scripts para paquetes específicos
Me pregunto si existe algún linter que sirva para evitar valores inseguros por defecto en configuraciones del gestor de paquetes
grep?Me pregunto si todavía hay alguna razón para usar Yarn
No sé si Yarn también implementó protecciones para frenar ataques a la cadena de suministro
Hasta ahora solo conocía pnpm, así que está bien que npm también se esté poniendo al día
La rama actual de Yarn, 4.x, garantiza un comportamiento determinista hasta un grado quizá excesivo, y puedes esperar consistencia en todo el equipo
En funciones, tiene muchos pequeños detalles que, una vez que te acostumbras, se acumulan y terminan marcando una gran diferencia
La próxima versión mayor también seguirá empujando en esa misma dirección, con mejor rendimiento y funciones que hasta ahora no se habían podido implementar precisamente por depender de esas mejoras de rendimiento
Por cierto, soy el maintainer principal de Yarn
También tiene funciones de protección de la cadena de suministro
Al final ya no lo soportamos y migramos a pnpm; las instalaciones quedaron mucho más rápidas tanto en CI como en las máquinas locales
La migración nos tomó como un día con ayuda de un LLM
node_moduleshttps://yarnpkg.com/features/pnp
Se parece bastante a usar
.jaren Java en vez de un árbol de directorios de archivos.classAunque es un poco hacky, y el soporte en editores y herramientas es irregular
Como reduce muchísimo la cantidad de archivos pequeños, puede ser especialmente más rápido si te toca trabajar en Windows sí o sí
Incluso puedes meter los archivos comprimidos en el repositorio git, eliminando la dependencia de Internet y del registro de paquetes
De verdad no sé la respuesta
No sabía que npm era propiedad de GitHub
Eso explica varias cosas
Algunas partes resultan interesantes de leer con el paso del tiempo
El comentario más votado decía: “Microsoft no hace todo bien, pero honestamente la adquisición de GitHub ha salido mucho mejor de lo que esperaba. En lugar de imponer políticas centradas en Microsoft a GitHub, Microsoft ha adoptado más cosas de GitHub desde la perspectiva de producto. GitHub sigue operando como si fuera una empresa separada”
Había levantado capital de riesgo, pero no encontró un modelo de negocio sostenible
GitHub la adquirió para salvar el ecosistema, y esa adquisición tampoco es que le haya dado grandes beneficios a GitHub
Y Microsoft movió GitHub a Azure
Me pregunto si la lista permitida en
package.jsonfija también la versión del paquete, o solo el nombre del paqueteQué bueno que
allowScriptsvenga desactivado por defecto[mira el reloj] ¿Apenas 18 meses detrás de pnpm?
¿Qué propósito tiene esto del lado de JavaScript?