DiMaNacho - Nacho Martínez DiMaNacho
Seguridad

npm otra vez en problemas: paquetes comprometidos filtrando datos

Nacho Martínez
#npm #Seguridad #JavaScript
+4 más
Alerta de seguridad en npm con código comprometido

🚨 Atenti devs: npm otra vez en problemas de seguridad

En los últimos días varios paquetes de npm (y de otros manejadores) fueron comprometidos y están tirando datos sensibles online.

Hace rato que viene pasando: tirás un simple npm i o un npm audit y te podés encontrar con sorpresas.

🔍 El problema actual

Paquetes afectados recientemente

Los ataques a la supply chain de npm no son nuevos, pero están aumentando en frecuencia y sofisticación:

  • 📦 Paquetes populares con typosquatting
  • 🔓 Versiones comprometidas de librerías legítimas
  • 🎭 Paquetes maliciosos disfrazados de utilidades
  • 💉 Inyección de código en dependencias transitivas

¿Qué datos están en riesgo?

  • 🔑 Variables de entorno (API keys, tokens)
  • 🗄️ Credenciales de bases de datos
  • 🔐 Secretos de CI/CD
  • 📧 Información de usuarios
  • 💳 Datos de configuración sensibles

🛡️ Recomendaciones rápidas

1. Corré npm audit regularmente

npm audit

Mejor aún: Dejalo automatizado en el CI para dormir más tranquilo.

# .github/workflows/security.yml
name: Security Audit
on: [push, pull_request]
jobs:
  audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: npm audit --audit-level=moderate

2. Revisá GitHub Advisories

Chequeá los paquetes reportados como malware en:

3. Usá npm audit fix con cuidado

# Intenta arreglar automáticamente
npm audit fix

# Si no funciona, forzá actualizaciones (¡cuidado!)
npm audit fix --force

⚠️ Advertencia: --force puede romper cosas. Siempre testeá después.

4. Overrides en package.json

Si npm audit fix no te salva, podés usar overrides:

{
  "overrides": {
    "libreria-vulnerable": "version-segura"
  }
}

Después:

  1. Borrá package-lock.json
  2. Borrá node_modules/
  3. Corré npm install limpito

5. Bajá una versión si es necesario

Si la última versión está comprometida:

{
  "dependencies": {
    "paquete-afectado": "1.2.3" // versión anterior segura
  }
}

🔒 Mejores prácticas de seguridad

1. Lock files siempre commiteados

# Nunca ignores estos archivos
package-lock.json
yarn.lock
pnpm-lock.yaml

Por qué: Garantizan que todos instalen las mismas versiones.

2. Revisá dependencias antes de instalar

# Ver qué se va a instalar
npm install --dry-run paquete-nuevo

# Ver el árbol de dependencias
npm ls paquete-nuevo

3. Usá herramientas de análisis

Snyk

npx snyk test
npx snyk monitor

Socket.dev

npx socket npm audit

npm-check-updates

npx npm-check-updates

4. Configurá .npmrc correctamente

# .npmrc
audit=true
audit-level=moderate
save-exact=true

5. Implementá SCA en CI/CD

Software Composition Analysis automático:

# Ejemplo con Snyk
- name: Run Snyk
  uses: snyk/actions/node@master
  env:
    SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

🚩 Red flags al instalar paquetes

Señales de alerta

Paquete muy nuevo (menos de 1 mes)
Sin README o documentación
Pocos downloads semanales
Sin repositorio de código
Mantenedor desconocido
Nombre muy similar a uno popular (typosquatting)
Versión 0.x.x en producción
Sin tests
Última actualización hace años

Checklist antes de instalar

  • Revisar el repositorio en GitHub
  • Leer el README completo
  • Chequear issues abiertos
  • Ver quién mantiene el paquete
  • Revisar el código fuente (especialmente install scripts)
  • Buscar alternativas más establecidas
  • Verificar downloads semanales
  • Leer reviews y comentarios

🔧 Herramientas útiles

1. npm-audit-resolver

npx npm-audit-resolver

Interfaz interactiva para resolver auditorías.

2. better-npm-audit

npx better-npm-audit audit

Audit mejorado con mejor output.

3. audit-ci

npx audit-ci --moderate

Falla el CI si hay vulnerabilidades.

4. depcheck

npx depcheck

Encuentra dependencias no usadas.

📋 Plan de acción si te afecta

Paso 1: Identificar el alcance

npm ls paquete-comprometido

Paso 2: Verificar qué versión tenés

npm list paquete-comprometido --depth=0

Paso 3: Buscar versión segura

  • Chequear GitHub Advisories
  • Leer el changelog del paquete
  • Buscar en npm security advisories

Paso 4: Actualizar o reemplazar

# Opción 1: Actualizar
npm update paquete-comprometido

# Opción 2: Instalar versión específica
npm install paquete-comprometido@version-segura

# Opción 3: Buscar alternativa
npm uninstall paquete-comprometido
npm install alternativa-segura

Paso 5: Rotar secretos

Si el paquete comprometido tuvo acceso a:

  • 🔑 Rotar API keys
  • 🔐 Cambiar passwords
  • 🎫 Regenerar tokens
  • 📧 Notificar al equipo

Paso 6: Auditar logs

  • Revisar logs de aplicación
  • Chequear tráfico de red inusual
  • Verificar accesos no autorizados

💡 Prevención a largo plazo

1. Política de dependencias

Definir reglas claras:

  • Mínimo de downloads semanales
  • Antigüedad mínima del paquete
  • Mantenimiento activo requerido
  • Proceso de aprobación para nuevas deps

2. Renovate o Dependabot

Automatizar actualizaciones:

// renovate.json
{
  "extends": ["config:base"],
  "vulnerabilityAlerts": {
    "enabled": true
  }
}

3. Monitoreo continuo

  • Alerts de GitHub
  • Snyk monitoring
  • Socket.dev integration
  • npm audit en CI/CD

4. Educación del equipo

  • Capacitación en seguridad
  • Code reviews de dependencias
  • Documentar decisiones
  • Compartir incidentes

💭 Reflexión final

La seguridad en npm no es un problema que se resuelve una vez.

Es un proceso continuo que requiere:

  • 👀 Vigilancia constante
  • 🔄 Actualizaciones regulares
  • 🧠 Conocimiento del ecosistema
  • 🤝 Colaboración del equipo

No está de más: compartilo con tu equipo porque seguro más de uno se va a frustrar un ratito con esto.


¿Tenés otras prácticas o recomendaciones para manejar estos casos?
¿Te tocó lidiar con algún paquete comprometido?

Compartir experiencias nos ayuda a todos a estar más preparados.

Compartir:
← Volver al Blog