"No hay forma de evitarlo": así habla el único gestor de paquetes donde estas cosas pasan con regularidad
(kevinpatel.xyz)- Un ataque a la cadena de suministro del registro de npm expuso millones de aplicaciones empresariales y miles de millones de registros de usuarios, pero el ecosistema lo asume como si fuera algo inevitable
- El Senior Frontend Engineer Mark Vance critica la realidad de depender de 40 niveles de dependencias anidadas de paquetes no verificados incluso para convertir una cadena a mayúsculas
- La toma de control de un paquete utilitario abandonado durante años, que termina inyectando un crypto-miner en builds de producción en todo el mundo, se trata como si fuera un desastre natural
- El ecosistema de Node.js acepta la ejecución remota de código maliciosa como una tragedia impredecible, mientras los equipos de DevOps se dedican a rotar claves de AWS
- Los ecosistemas de Go, Rust y las Web API nativas sirven de contraste al reducir la dependencia de terceros con una biblioteca estándar sólida y verificación criptográfica
Sátira sobre el ataque a la cadena de suministro en npm
- Un ataque a la cadena de suministro del registro de npm comprometió millones de aplicaciones empresariales y expuso miles de millones de registros de usuarios, pero los desarrolladores del ecosistema JavaScript lo asumen como algo “completamente imposible de evitar”
- El Senior Frontend Engineer Mark Vance ve como el costo del desarrollo moderno de aplicaciones web la realidad de depender de un árbol de 40 niveles de dependencias anidadas de paquetes no verificados para convertir una sola cadena a mayúsculas
- La toma de control de un paquete utilitario abandonado durante mucho tiempo, que termina inyectando un crypto-miner en builds de producción en todo el mundo, se trata como si fuera un desastre natural
- El ecosistema de Node.js acepta la ejecución remota de código maliciosa como una tragedia impredecible y envía “pensamientos y oraciones” a los equipos de DevOps ocupados rotando claves de AWS
El contraste entre otros ecosistemas y npm
- Los ecosistemas de Go, Rust y las Web API nativas reducen de forma importante la dependencia de código de terceros gracias a una biblioteca estándar sólida e incluyen verificación criptográfica estricta en su toolchain principal
- En esos ecosistemas, el contraste se plantea como que hoy hubo 0 casos en los que “un proyecto de fin de semana de un desertor universitario” arruinó la infraestructura logística global
- Un vocero de npm remarca que, en un mundo donde existen actores maliciosos, esto simplemente debe aceptarse y que no hay políticas del registro ni guardrails de sandboxing de builds que puedan impedirlo
- Se retrata al registro de npm como un registro open source que ejecuta por defecto scripts de instalación arbitrarios en la máquina local, alineando las declaraciones del vocero con el riesgo estructural
- Al final, aunque expresa consuelo a las víctimas, cierra con la idea de que hay que mantener la resiliencia hasta “la próxima violación inevitable” de mañana por la mañana
1 comentarios
Comentarios en Hacker News
Cada quien tendrá su opinión sobre los períodos de enfriamiento, pero muchos de los ataques recientes a la cadena de suministro de npm, incluidos axios y tanstack, probablemente se habrían evitado con uno
Si usas Artifactory / Nexus, es muy probable que ya tengas un período de enfriamiento, y si no, es fácil configurarlo
Como la mayoría de las intrusiones en npm o PyPI se bajaron en cuestión de horas, la idea del período de enfriamiento es “ignorar paquetes publicados hace menos de N días”. Incluso 1 día ayuda, 3 días está bien y 7 días es un poco excesivo, pero funciona
Para configurarlo, puedes usar la versión reciente de pnpm, que ya incluye por defecto un período de enfriamiento de 1 día, o https://pnpm.io/supply-chain-security; si quieres arreglarlo de una sola vez, puedes usar https://depsguard.com, que añade períodos de enfriamiento y configuraciones recomendadas a npm, pnpm, yarn, bun, uv y dependabot. Yo soy el mantenedor
O también está https://cooldowns.dev, más enfocado específicamente en períodos de enfriamiento, con scripts para ayudarte a configurar lo local. Todo es open source o gratis
Si sabes editar directamente
~/.npmrcy similares, realmente no hace falta, pero para gente cercana a ti que necesite una solución de un clic, probablemente les ayude a evitar el próximo ataqueEso sí, si necesitas parchear un CVE crítico nuevo, tendrás que saltarte el período de enfriamiento, y cada herramienta tiene su forma de hacerlo. No tengo cifras exactas, pero en las últimas semanas parece que el riesgo más grande ha venido de ataques a la cadena de suministro de software más que de CVE de día cero nuevos
Lo mismo aplica para actualizaciones periódicas de dependencias. Claro, a veces hay que subir de versión de inmediato, por ejemplo para responder a una vulnerabilidad, pero en ese caso me parece bien que el desarrollador tenga que indicar explícitamente la nueva versión que quiere
Si todo el mundo pone un período de enfriamiento de 7 días, ¿no explotaría simplemente más tarde?
Pensándolo mejor mientras escribo, igual sí estoy de acuerdo con un período de enfriamiento de 10 días para no instalar nada publicado en los últimos 10 días. Solo que no creo que deba esperarse que sea la única mitigación
Me pregunto qué garantizan realmente Go o Rust frente a Python/npm. También puede ser que Python/npm simplemente sean un blanco más atractivo
Cada vez intento evitar más todos los paquetes de terceros
Maven Central existe desde hace décadas, pero los incidentes de robo de espacios de nombres han sido muy pocos
No puedes subir un paquete con el groupId "com.ycombinator" sin verificar que eres dueño del dominio ycombinator.com. Y una vez publicado, el paquete es 100% inmutable, incluso si contiene malware. Claro, esas librerías quedan marcadas por todos lados como vulnerables
No entiendo cómo NPM no logró copiar desde hace tanto estas protecciones tipo Maven Central
En vez de tener un conjunto de librerías confiables distribuidas junto con el lenguaje, las aplicaciones tienen que construirlas ellas mismas o traerlas de un repositorio de paquetes de terceros. Como nos han enseñado constantemente a evitar el NIH, la gente termina tomando paquetes
Eso no es necesariamente malo por sí mismo, pero muchas veces termina arrastrando mucho más código del necesario. El ecosistema de JS además favorece módulos pequeños, así que hacen falta muchos, y todos vuelven a apilar cosas encima, haciendo gigantesco el grafo de dependencias. Sea intencional o no, la superficie para que algo salga mal es enorme
Otros lenguajes traen mucho más de serie. No es que no hayan tenido bugs o problemas de seguridad, pero comparado con lo que se ve en el ecosistema de JS, es poquísimo. El grafo de dependencias externas es mucho menor y la funcionalidad central viene de terceros de confianza
Eso no excusa a NPM; de hecho, solo suma otro factor en su contra
También podría decirse que estos ataques muestran aún más la diferencia entre desarrolladores frontend y backend, pero no voy a llegar tan lejos
En varios trabajos me tocó sufrir bastante instalando una configuración global segura de npm en todas las máquinas de desarrollo, pidiéndole a la gente que no la desactivara y verificándolo con herramientas MDM
Una configuración predeterminada más segura debió existir desde hace mucho
postinstallpor defecto, y el cambio es increíblemente sencilloNo hay una razón legítima para que existan scripts de postinstall. El equipo de npm ya debería estar lo bastante maduro como para declarar: “a partir de cierta versión de npm, los scripts de postinstall solo se ejecutarán para versiones de paquetes publicadas antes de ${today}”
Esto pasa porque cadenas de herramientas de desarrollo como esbuild están hechas en lenguajes compilados y se distribuyen como binarios a través del repositorio de npm. Si usas una versión reciente de Node/npm y un OS/plataforma modernos y comunes, deberías poder desactivar todos los scripts de postinstall sin problemas legítimos
El código instalado desde npm casi sin excepción termina ejecutándose
Pero lo mismo aplica al código normal dentro de ese paquete. Aunque no se ejecute al momento de instalarlo, tarde o temprano algo de ahí va a correr. Si no, ni siquiera habría terminado como dependencia
Pensar que eliminar los scripts de postinstall va a tener un impacto más que momentáneo en la tasa de abuso es señal de que no se pensó el problema hasta el final. Por desgracia, esto es mucho más sutil de lo que da a entender el artículo original
No es un problema tipo “no pongamos el botón que hace caer las alas junto al interruptor de la luz”, sino que el punto es que no hay forma, salvo con un trabajo manual muy pesado, de distinguir entre “código malo de otros ejecutándose en mi computadora”, que queremos evitar, y “código bueno de otros ejecutándose en mi computadora”, que sí queremos. Y justamente ejecutamos código de otros para evitar ese trabajo manual pesado
Todos los proyectos de Node.js empiezan con
npm install, y de pronto aparecen 500 paquetes que ni querías. La mitad de ellos no se tocan desde hace añosHay un problema cultural de querer actualizar a los paquetes más recientes todo lo que ya funciona bien. A veces ni siquiera leen el changelog para ver si el cambio aplica
El período de enfriamiento es solo una forma de obligar a los mantenedores a tener un poco de paciencia, y sí funciona
Un paquete de Lisp puede usarse perfectamente durante 15 años sin cambios, pero si un paquete de JS no se mantiene se trata como si fuera una catástrofe. Aunque ya estuviera terminado hace 15 años, para seguir pareciendo “mantenido” en npm y GitHub terminan subiendo versiones sin agregar nada o, a veces, hasta metiendo cambios rompientes. Y entonces todo se actualiza
Un período de enfriamiento de 7 días se siente como una solución provisional barata de implementar. La solución real probablemente sean builds reproducibles y certificaciones firmadas, pero la mayoría de los equipos no va a pagar ese costo hasta después de haber sido víctima
Esto se lee como un artículo de The Onion
Este enlace es claramente una versión lavada con IA de un chiste que Xe Iaso lleva haciendo desde hace tiempo. Qué lástima
https://xeiaso.net/shitposts/no-way-to-prevent-this/CVE-2024...
https://news.ycombinator.com/item?id=40438408
[0]: https://en.wikipedia.org/wiki/%27No_Way_to_Prevent_This,%27_...
https://en.wikipedia.org/wiki/%27No_Way_to_Prevent_This,%27_...