Introducción
¿Sabías que un paquete de npm podría mandarte un rm -rf / y borrarte el disco entero? Pues eso es exactamente lo que casi pasa hace nada con el ecosistema de 💡 TanStack Conjunto de librerías muy usadas en el ecosistema JavaScript: TanStack Query, TanStack Router, TanStack Table... Las usan miles de proyectos en producción.
Más info →
.
Después de ver el vídeo de midudev explicando el percal, tengo claro que de momento NPM ya no es seguro por defecto. Así que he pillado a mi Linux Mint Linux Mint Distribución de Linux basada en Ubuntu, muy popular para uso de escritorio por su facilidad y estabilidad. y he migrado todo el entorno a 💡 PNPM Gestor de paquetes para Node.js alternativo a NPM. Más rápido, ahorra espacio gracias a enlaces simbólicos y trae protecciones de seguridad por defecto. Más info → 11. Te pongo en contexto de por qué deberías hacer tú lo mismo y los comandos que he usado.

¿Qué ha pasado con TanStack?
Como cuenta Midu en el vídeo que dejo un poquito más adelante, un atacante metió código malicioso en paquetes bastante usados como TanStack Query o TanStack Router. Lo grave no es solo que robara tokens de AWS o GitHub, que ya es un poco loco, sino que el malware iba más allá.
El bicho dejaba un demonio corriendo en tu máquina y si te dabas cuenta del robo e intentabas revocar revocar Invalidar un token o credencial para que deje de ser válido. Es lo primero que haces cuando crees que te lo han comprometido. los tokens, te lanzaba un rm -rf / para eliminarte todo el disco.
AdvertenciaNPM ejecuta scripts de instalación automáticamente al hacer
npm install. Eso significa que cualquier paquete o subdependencia puede correr código en tu máquina sin que tú hagas absolutamente nada. Y sí, eso incluyerm -rf, entre otros.
Lo peor de todo es que tú no tienes que instalar el paquete malo a propósito. Te basta con que una dependencia de una dependencia de una dependencia lo tenga. Esa cosa que se llama " 💡 supply chain attack Ataque de cadena de suministro. Se mete código malicioso en una librería legítima que millones de proyectos usan como dependencia, propagando el malware a todos ellos. " y que cada vez vemos más.
PNPM 11 para evitar estos casos inseguros.
Podemos evitar estos casos con PNPM 11. No solo es más rápido que NPM y te ahorra gigas en disco gracias a sus enlaces simbólicos, es que además trae las protecciones que NPM debería traer desde hace años.
No instala nada que tenga menos de 24 horas. Es justo la ventana en la que los ataques se suelen detectar y retirar del registro.
No ejecuta postinstall ni código de subdependencias sin tu permiso explícito, así tú decides qué corre en tu máquina.
Reutiliza paquetes entre proyectos con enlaces simbólicos. Si ya tienes React 19 en otro proyecto, no lo descarga otra vez.
Un único store global. Adiós a tener el mismo node_modules de 300MB en 15 proyectos diferentes.
ConsejoLo del bloqueo de 24 horas es perfecto porque si un atacante publica un paquete envenenado a las 10 de la mañana, los bots de seguridad y la comunidad suelen pillarlo en cuestión de horas. Para cuando tú vayas a instalarlo, PNPM ya te lo bloquea por defecto.
Guía para migrar en Linux Mint de NPM a PNPM paso a paso
Si estás en Linux Mint (o Ubuntu, Debian, lo que sea) estos son los comandos que yo he ejecutado para comenzar a usar pnpm en lugar de npm.
1. Instalación limpia con corepack
NO vamos a instalar PNPM usando el propio NPM. Vamos a usar 💡 corepack Herramienta oficial que viene con Node.js a partir de la versión 16.10. Permite gestionar versiones de pnpm, yarn y npm sin instalar nada extra. Más info → , que viene de serie con Node.js:
Y EA, pnpm 11 instalado sin tocar npm.
2. El truco de seguridad con el alias NPM en .bashrc
Esto es importante porque llevamos años escribiendo de forma automática npm install sin pensar y un día se te escapa en un proyecto random y se te instala el una librería con dependencias infectadas y se ha liao parda.
Para evitarlo, vamos a hacer que cuando escribas npm se ejecute pnpm automáticamente. Abre el .bashrc (si usas bash, si no el config del que uses):
nano ~/.bashrc
Y al final del archivo añade esto:
# baibai npm
alias npm="pnpm"
alias npx="pnpm dlx"
Aplica los cambios sin reiniciar la terminal:
source ~/.bashrc
A partir de ahora si escribes npm install lo que se va a ejecutar realmente es pnpm install.
NotaSi usas zsh en lugar de bash, el archivo es
~/.zshrcy la sintaxis del alias es exactamente la misma.
3. Migrando proyectos existentes
Cuando entres en un proyecto viejo no mezcles gestores. No te quedes con el package-lock.json de NPM y a la vez pnpm-lock porque te vas a volver majareta, mejor haz limpieza:
# Desde la raíz del proyecto
rm -rf node_modules package-lock.json
pnpm install
Si el proyecto tenía un yarn.lock, también fuera:
rm -rf node_modules yarn.lock package-lock.json
pnpm install
ImportanteCuando hagas commit, añade el
pnpm-lock.yamlal repo y borra elpackage-lock.jsonsi seguía ahí. Si trabajas en equipo, avisa a la gente de que ahora se usa pnpm, porque si alguien hacenpm installse va a generar el package-lock otra vez y vuelta a empezar.
Mi experiencia tras el cambio
Al principio PNPM puede ser un poco estricto y te suelta cosas que con NPM no veías. Por ejemplo, migrando este mismo blog en Astro 6 me saltaron warnings de dependencias como zod zod Librería de validación de esquemas para TypeScript. La usa Astro internamente para validar el frontmatter de las colecciones de contenido. que NPM me estaba instalando por debajo sin yo declararlas en mi package.json.
- Ves de verdad qué dependencias tienes en tu package.json
- Te ahorras gigas de disco con el store global compartido
- Instalaciones más rápidas, sobre todo en proyectos grandes
- Bloqueo automático de paquetes recién publicados (24h)
- Sin scripts postinstall ejecutándose a tus espaldas
- Dependencias fantasma (las que usabas sin declararlas)
- node_modules de 500MB repetidos en cada proyecto
- npm install muchas veces tarda bastante
- Confiar en que ningún paquete de la cadena tenga un rm -rf escondido
¿Es un problema tener que declarar las dependencias bien? Al revés, nene, es una ventaja. Ahora sé exactamente qué hay en mi package.json, sin sorpresas. Es un sistema más limpio, más rápido y, sobre todo, mucho más seguro.
El vídeo de Midu (vale mucho la pena verlo)
Si quieres la explicación completa con todos los detalles del ataque a TanStack, te dejo el vídeo aquí. Midu lo explica muy bien, como siempre.
Conclusiones finales
A día de hoy seguir usando npm por defecto es como dejar la puerta de casa abierta y rezar para que nadie entre. Funciona, sí, pero hasta que un día no funciona y se te lleva por delante el disco duro o los tokens/keys de la empresa.
PNPM 11 te da prácticamente las mismas funcionalidades, más velocidad, menos espacio y, lo más importante, seguridad. La migración se hace muy muy rápido. El alias en .bashrc te quita la tentación de volver a NPM por costumbre y los proyectos viejos se migran con un rm -rf node_modules && pnpm install.
Nos vemos en los bares! 🍻