🚨 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:
- Borrá
package-lock.json - Borrá
node_modules/ - Corré
npm installlimpito
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.