Detectan paquetes npm maliciosos en varios servicios de Red Hat Cloud Services
(github.com/RedHatInsights)- El issue está abierto y, al momento del texto, no hay responsable, milestone, ni ramas o PR vinculados
- Se registró como un issue de seguridad porque se detectaron versiones maliciosas en varios releases de npm dentro del alcance de
@redhat-cloud-services/ - Como material de referencia se presentan el análisis de StepSecurity y los resultados de búsqueda de OSS Security Feed
- La lista de impacto actualizada incluye 32 paquetes, entre ellos
@redhat-cloud-services/chrome,frontend-components,rbac-client,typesyvulnerabilities-client - La mayoría de las versiones comprometidas que aparecen en la tabla son 3 por paquete, mientras que
@redhat-cloud-services/vulnerabilities-clientincluye solo las versiones2.1.9y2.1.11 - Tomando como base toda la tabla, se pueden contabilizar 95 versiones comprometidas, y el título de un PR externo mencionado por separado también apunta a
95 versions - También se incluyen la familia
@redhat-cloud-services/frontend-components-*y varios paquetes*-client, por lo que no se trata de un solo paquete sino de un problema de releases en todo el mismo scope - En los comentarios, ante la pregunta “What are these?”, respondieron “all that module is pwned”, dejando claro que se entiende que toda la lista fue comprometida
- DanielRuf dejó constancia de que añadió este incidente a supply-chain-incidents
- En la actividad de GitHub se ven un resumen de contenido que referencia este issue y un PR relacionado con la detección, pero en el texto todavía no se presentan el diagnóstico de Red Hat, medidas de mitigación, eliminación ni versiones corregidas
1 comentarios
Comentarios de Hacker News
Espero que esté bien retomar el hilo para hablar de la configuración de cooldown. Axios, TanStack, @redhat-cloud-services y varios ataques recientes a la cadena de suministro de npm se habrían podido evitar con un cooldown
Si usas Artifactory/Nexus, probablemente ya lo tengas, y aunque no, es fácil de configurar. La mayoría de los compromisos de npm o PyPI se dieron de baja en cuestión de horas, así que basta con ignorar paquetes con menos de N días desde su publicación. Incluso 1 día ayuda, 3 días está bien y 7 días es algo excesivo, pero funciona
Las versiones recientes de pnpm ya incluyen por defecto un cooldown de 1 día: https://pnpm.io/supply-chain-security
Si quieres resolverlo con un clic, puedes usar https://depsguard.com. Es un CLI que agrega cooldown y configuraciones recomendadas para npm, pnpm, yarn, bun, uv y dependabot; yo soy su mantenedor
También está https://cooldowns.dev, más enfocado en cooldowns, y tiene scripts para ayudar con la configuración local. Todo es open source/gratis
Si sabes editar directamente
~/.npmrcy similares, realmente no lo necesitas, pero si conoces gente a la que solo le hace falta un arreglo de un clic, podría ayudarles a evitar el próximo ataqueEso sí, cuando haya que parchear un CVE crítico nuevo, hay que poder saltarse el cooldown, y cada herramienta tiene su forma de hacerlo. No tengo cifras exactas de los últimos meses, pero incluso en esta era de descubrimiento de vulnerabilidades al estilo Mythos, el riesgo parece mayor por ataques a la cadena de suministro de software como la distribución de versiones maliciosas que por CVE zero-day nuevos
~/.npmrcy agregar una línea, los casos en que se necesita un arreglo de un clic me parecen un grupo muy pequeñoEs perfectamente razonable decir: “un parche de seguridad solo debe incluir cambios de seguridad y no meter otras funciones”. Eso hace que tanto para investigadores de seguridad como para las herramientas sea más fácil auditar
A los lanzamientos normales se les puede aplicar cooldown, y a los parches de seguridad se les puede quitar o poner uno mucho más corto
Vale la pena tomar como referencia esquemas como Debian, con servidores muy estables y la posibilidad de configurar unattended upgrades para que solo aplique parches de seguridad. Este tipo de nuevos lanzamientos de paquetes también son más fáciles de auditar para investigadores de seguridad
En cada hilo como este hay muchos comentarios que actúan como si este tipo de ataque existiera solo en npm, o se burlan como si no se hubiera hecho nada, pero no me parece justo.
También hay muchos comentarios que mencionan buenas funciones introducidas para proteger a los consumidores de paquetes, como delay line y pnpm.
De lo que se habla menos es de las herramientas para mantenedores de paquetes. MFA para publicación: https://docs.npmjs.com/requiring-2fa-for-package-publishing-..., y trusted publishers, disponible desde hace cerca de un año: https://docs.npmjs.com/trusted-publishers
Recientemente también apareció staged publishing, que combina las ventajas de ambas funciones: https://docs.npmjs.com/staged-publishing
Ahora se puede publicar desde CI sin credenciales estáticas y exigir que el mantenedor lo apruebe con MFA antes de que realmente se haga público en el registro. Si se quiere, también se pueden exigir aprobaciones múltiples o retrasos de tiempo del lado de CI con la protección de GitHub Actions Environments.
Hay que alentar a la comunidad a adoptar este tipo de protecciones para la publicación; de lo contrario, este problema va a seguir.
Entonces los paquetes maliciosos también habrían recibido la estrellita verde y habrían tranquilizado a los usuarios con eso de que “fueron compilados y firmados con prueba de procedencia”.
[1] https://lwn.net/Articles/1075742/
Es excelente que se esté trabajando para frenarlo, pero igual sigue pasando. Da risa en el sentido de “ah, otra vez esto”.
Desde afuera, el desarrollo web tiene una energía de Lejano Oeste caótico. Hay mutabilidad, tipado dinámico, estándares y frameworks que cambian todo el tiempo, despliegue continuo, CDN, campañas A/B en tiempo real, muchas dependencias y datos sensibles de usuarios dispersos por varias infraestructuras.
No digo que esta mirada sea correcta ni que la actitud de “ya ves” sea la adecuada, pero entiendo de dónde viene.
En particular, ninguna de las dos habría impedido que el backdoor de xz-utils entrara en la distribución del paquete. xz-utils sigue siendo el punto de referencia de un compromiso upstream sofisticado.
El error aquí no es que debamos autenticar mejor a un upstream en el que ya confiábamos, sino que no se puede confiar en upstream como fuente única de seguridad. Upstream es un grupo de hackers a los que les interesa poco la ingeniería de releases robusta y tampoco son muy buenos en eso.
Pero sí hay gente que lo hace bien. La solución del mundo Linux, y la forma en que nos salvó en xz-utils, es que existe una segunda capa humana que revisa, audita, empaqueta y personaliza para los usuarios el upstream hecho por hackers.
Esa gente tiene otros ojos, otras necesidades de los consumidores y otros estándares de calidad, y detecta bugs y malas intenciones que upstream no está preparado para detectar.
NPM, cargo, PyPI y compañía siguen pensando que pueden esquivar la necesidad de ese trabajo humano, pero no pueden. En el ecosistema de NPM esto se ve con más frecuencia que en Python o Rust, sobre todo porque hay muchos desarrolladores web acostumbrados a releases muy rápidos, requisitos de compatibilidad laxos y reutilización extrema.
En nuestra empresa usamos yarn 4, y hay una opción para bloquear la instalación de paquetes de npm durante los primeros días después de que se publican. Parece que la mayoría de estos ataques se detectan dentro de ese periodo (1 a 3 días)
https://gist.github.com/mcollina/b294a6c39ee700d24073c0e5a4e...
El paquete axios fue comprometido, y también robaron las credenciales del autor, así que cada intento de corregirlo volvía a ser neutralizado: https://www.trendmicro.com/en_us/research/26/c/axios-npm-pac...
La utilidad xz tuvo un backdoor durante 2 meses: https://gigazine.net/gsc_news/en/20240403-timeline-of-xz-ope...
Un estudiante investigador tomó el control del mantenimiento de los paquetes Python ctx y PHPass, distribuyó cambios maliciosos, y tardaron más de 7 días en detectarlo y corregirlo: https://infosecwriteups.com/how-i-hacked-ctx-and-phpass-modu...
Kaspersky descubrió varios paquetes de PyPI que fueron explotados durante más de un año: https://www.kaspersky.com/about/press-releases/kaspersky-unc...
El paquete “LoftyLife” fue explotado durante varios meses: https://securelist.com/lofylife-malicious-npm-packages/10701...
Si la ventana de ataque cambia a 7 días, todos estos ataques nuevos terminarán incluyendo una bomba de tiempo que no se active hasta el día 8
pnpmtambién tiene la misma función, y viene activada por defecto desdev11: https://pnpm.io/settings#minimumreleaseageHay algunas propuestas. Un cooldown de dependencias de 1 a 2 días parece muy efectivo sin perjudicar la capacidad de aplicar parches de CVE
Todos los lugares donde se ejecuta código, como
npm installynpm test, deberían correr en entornos sin privilegios. En GitHub Actions es relativamente sencillo separar los trabajos que construyen y prueban artefactos de los trabajos que hacen despliegue, firmado, etc. Si usas IA, basta con agregar una skill/guía que fuerce este patrónSi usas GitHub Actions, instalar la versión más reciente de zizmor mejora mucho la postura de seguridad
La segunda medida hace que ya no pueda “propagarse como un gusano”, lo que reduce una gran parte del problema actual. La primera les da a las empresas tiempo para responder a los ataques. También vale la pena evaluar algunos proveedores en esta área
Dio risa como chiste, justo después de decir que hay que retrasar los paquetes nuevos
Corremos un proxy local de Maven, y todos los builds se hacen dentro de contenedores. Python, npm y Go solo usan repositorios públicos, así que estos builds también se hacen en contenedores, pero sin necesidad de proxy de repositorio
Justo el mismo día en que Red Hat e IBM anunciaron Project Lightwell para ayudar a detectar y corregir vulnerabilidades de la cadena de suministro
https://www.redhat.com/en/lightwell
Hace unos días vi este rant interesante: https://github.com/uNetworking/uWebSockets.js/blob/master/mi...
Tiene algo de razón la idea de que la forma correcta es hacer fork de todas las dependencias que usas e instalarlas desde tu propio repositorio, revisando y fusionando cambios de upstream cuando haga falta. Aunque suena increíblemente tedioso
Sirve para reducir o eliminar la dependencia de proveedores externos de hosting de dependencias, meter las dependencias dentro de tu propia herramienta de revisión de código y garantizar builds reproducibles a largo plazo
Packj(https://github.com/ossillate-inc/packj) detecta dependencias maliciosas en PyPI/NPM/Ruby/PHP y otros mediante análisis de comportamiento. Escanea indicadores de compromiso como ejecución de shell, uso de claves SSH, comunicación de red y uso de decode+eval con análisis estático y dinámico de código. También revisa varias propiedades de metadatos para encontrar actores maliciosos, como typosquatting
Hace como una semana borré Node de mi laptop y me sentí bien
Incluso si me toca un exploit por mala suerte, estoy tratando de hacer todo dentro de contenedores de desarrollo u otros sandboxes para reducir el radio de daño. El atacante podría robarse un token de Claude, pero no va a poder escaparse del contenedor tan fácilmente para husmear en mi directorio home
Los cooldowns y las allowlists de scripts de instalación son capas extra útiles para defensa en profundidad, especialmente en CI. Pero, en el fondo, creo que lo que tiene que cambiar es el modelo de permisos del sistema operativo. El valor por defecto de confiar en software de terceros con todos los permisos del usuario ya no funciona
Supongo que debería poner el link de la publicación original
https://www.stepsecurity.io/blog/multiple-redhat-cloud-servi...
Ahora ya tengo la costumbre de usar la bandera
--before=2026-05-30al instalar paquetes. Hace que elija versiones publicadas antes de la fecha indicada, y normalmente pongo unos 5 días anteshttps://docs.npmjs.com/cli/v11/using-npm/config#min-release-...
pnpmy configuro unminimumReleaseAgebastante ampliohttps://pnpm.io/settings#minimumreleaseage
Por suerte, viene activado por defecto desde la v11
min-release-age=5en el.npmrcde la raíz del proyectoNPM está roto desde el diseño, y el síndrome NIH tan extendido en la comunidad impide incluso tomar medidas simples
Como se adoptan muchos paquetes externos en vez de desarrollar internamente, los proyectos de npm tienden a tener árboles de dependencias grandes y complejos. Desde hace tiempo hay quejas de que paquetes como https://www.npmjs.com/package/is-windows crean vulnerabilidades potenciales y dolores de cabeza de mantenimiento, aunque sería facilísimo escribir ese mismo código directamente
Pero obviamente no hace falta reimplementar toda la funcionalidad, solo la que necesitas
Además, cuando codificas una sola función, tampoco necesitas crear abstracciones ni interfaces extra. Así que sale más barato y probablemente se integra mejor
Otro error es pensar que vas a introducir bugs y vulnerabilidades. Si eres mal programador, puede pasar, pero sí puedes evitar toda una categoría de vulnerabilidades que aparece en los límites de integración entre dos librerías que no fueron diseñadas para encajar exactamente entre sí. Y eso pasa mucho