1
Resumen Ejecutivo
3
Crítico
Historial confirmado de supply chain attack o CVE 9.0+
3
Alto
2+ factores de riesgo sin incidente confirmado
5
Medio
1 factor de riesgo, requiere monitoreo
12
Sin riesgo
Mantenidas, populares, sin CVEs críticos
Distribución de factores de riesgo detectados
| Factor de riesgo | Dependencias afectadas | Total |
|---|---|---|
| Supply chain attack documentado | event-stream colors ua-parser-js | 3 |
| CVEs críticos / altos activos | jsonwebtoken serialize-javascript flat PyYAML | 4 |
| Mantenedor único / anónimo | event-stream colors flat pdfkit bull | 5 |
| Abandonado / sin mantenimiento | event-stream colors lodash | 3 |
| Sin contacto de seguridad | bull pdfkit flat colors event-stream ua-parser-js dotenv | 7 |
| Baja popularidad relativa | flat event-stream | 2 |
| TOTAL (ocurrencias) | — | 24 |
2
CVEs Activos Detectados
| CVE | Paquete | CVSS | Tipo | Versión afectada | Estado parche |
|---|---|---|---|---|---|
| CVE-2022-23529 | jsonwebtoken | 9.6 CRÍTICO | Remote Code Execution via JWKS path traversal | < 9.0.0 | Parcheado en 9.0.0 ✓ |
| CVE-2022-23540 | jsonwebtoken | 7.6 ALTO | Algorithm confusion (RS/HS256 key confusion) | < 9.0.0 | Parcheado en 9.0.0 ✓ |
| CVE-2020-7660 | serialize-javascript | 9.8 CRÍTICO | XSS / Arbitrary Code Injection en serialización de RegExp | < 3.1.0 | Usar ≥ 6.0.1 recomendado |
| CVE-2021-43138 | flat | 7.8 ALTO | Prototype Pollution — manipulación de Object.prototype | ≤ 5.0.2 | Sin parche en rama 5.x ⚠ |
| CVE-2020-14343 | PyYAML | 9.8 CRÍTICO | Arbitrary code execution con yaml.load() sin Loader seguro | < 5.4 | Usar yaml.safe_load() o ≥ 6.0 ✓ |
3
Dependencias de Alto Riesgo — Detalle
event-stream
npm
CRÍTICO
Stars en GitHub
~3.1k
Último commit
Dic 2018 (>7 años)
Mantenedor
dominictarr (traspasado a anónimo)
Issues abiertos
~312 sin respuesta
Supply chain attack confirmado
Abandonado (7+ años)
Mantenedor único anónimo
Sin SECURITY.md
Incidente documentado (Nov 2018): El paquete fue transferido voluntariamente por su autor original (dominictarr) a un usuario anónimo (right9ctrl), quien publicó la versión 3.3.6 con un backdoor que robaba fondos de carteras Bitcoin Copay. Es el caso de supply chain attack en npm más citado en la literatura de seguridad. El paquete lleva más de 7 años sin mantenimiento real. Pese a ello, aún se instala ~2M veces/semana por dependencias transitivas históricas.
Alternativa recomendada: through2 o readable-stream — through2 (~13k stars, activo, mantenido por rvagg/Node.js Foundation contributors) ofrece la misma API de transformación de streams. Para streams en Node.js 16+ se recomienda directamente la API nativa
stream.pipeline / stream.Transform sin dependencia externa.
colors
npm
CRÍTICO
Stars en GitHub
~5.1k
Último commit
Ene 2022 (versión saboteada)
Mantenedor
Marak (identidad real, pero hostil)
Issues abiertos
~180 (repo archivado)
Supply chain attack (sabotaje intencional)
Repo archivado / abandonado
Mantenedor único
Incidente documentado (Ene 2022): Marak publicó intencionadamente la versión 1.4.44-liberty-2 con un bucle infinito que imprimía caracteres aleatorios (AMERICA) para protestar contra el uso gratuito de código OSS por empresas. Esto rompió miles de proyectos. El repositorio fue archivado. La versión 1.4.0 (la usada por FlowMetrics) no está directamente afectada por el bucle, pero el paquete carece de mantenimiento y no recibirá parches futuros.
Alternativa recomendada: chalk v5 — chalk (~21k stars) es el estándar de facto para colorear salida de terminal en Node.js. Mantenido por Sindre Sorhus (contribuidor prolífico y verificado). Migración trivial:
chalk.red('texto') en lugar de 'texto'.red.
ua-parser-js
npm
CRÍTICO
Stars en GitHub
~8.9k
Último commit
2024 (activo actualmente)
Mantenedor
faisalman (único, recuperó control)
Issues abiertos
~23
Supply chain attack previo (2021)
Mantenedor único
Sin contacto de seguridad formal
Incidente documentado (Oct 2021): La cuenta npm de faisalman fue comprometida. Las versiones 0.7.29, 0.8.0 y 1.0.0 publicadas por el atacante contenían un cryptominer (Linux/macOS) y un troyano de robo de contraseñas (Windows). GitHub publicó CVE-2021-27292. La cuenta fue recuperada y las versiones maliciosas eliminadas, pero la versión 1.0.37 actualmente en uso fue publicada tras el incidente. El riesgo principal es el patrón de mantenedor único con precedente de takeover.
Alternativa recomendada: @ua-parser/browser-detector (v2 oficial) o bowser — Para analítica de user-agent en backend, bowser (~5.3k stars, org. lancedikson, activo) es más ligero. Si la funcionalidad es necesaria en la API, valorar mover el parsing al cliente (no hay datos sensibles del servidor en riesgo).
flat
npm
ALTO
Stars en GitHub
~1.0k
Último commit
Mar 2022 (~4 años)
Mantenedor
nicolo-ribaudo (único)
Issues abiertos
~18 (sin respuesta)
CVE-2021-43138 (Prototype Pollution)
Mantenedor único
Baja popularidad relativa (~1k stars)
Sin mantenimiento activo
CVE-2021-43138 (CVSS 7.8): Prototype pollution en
unflatten() permite a un atacante que controla los datos de entrada contaminar Object.prototype. En el contexto de FlowMetrics, si flat se usa para procesar datos de eventos de usuarios o payloads JSON externos, existe un vector de ataque real. La versión 5.0.2 no tiene parche disponible en la rama 5.x; la rama 6.x solucionó el problema pero tiene breaking changes de API.
Alternativa recomendada: flat v6.0.1+ o dot-prop — flat v6 corrige el prototype pollution pero requiere migración a ESM. dot-prop (~9.2k stars, Sindre Sorhus, activo) es más popular y mejor mantenido para acceso a propiedades anidadas; para aplanado plano valorar implementación nativa con
Object.fromEntries.
jsonwebtoken
npm
ALTO
Stars en GitHub
~17.5k
Último commit
2024 (activo)
Organización
auth0 (Okta)
Issues abiertos
~94
CVE-2022-23529 (RCE, CVSS 9.6)
CVE-2022-23540 (Alg. Confusion)
Features de alto riesgo (criptografía, auth)
Nota: La versión 9.0.0 (actualmente en uso por FlowMetrics: ^9.0.0) parchea ambos CVEs. Sin embargo, por ser una librería de autenticación, su superficie de ataque es inherentemente alta. Es crítico verificar que el código de FlowMetrics no use el algoritmo 'none', que siempre rechace tokens sin firma, y que el secret se gestione via variable de entorno con suficiente entropía (≥256 bits). Revisar también que la validación de
issuer y audience esté habilitada en todos los puntos de verificación.
Sin cambio de librería necesario — La versión actual (^9.0.0) cubre los CVEs. Se recomienda una revisión de uso en código: confirmar parámetros de verificación estrictos y rotación de secrets. Para nuevos proyectos, jose (~10k stars, panva, activo) ofrece soporte completo de JOSE/JWK estándar moderno.
bull
npm
MEDIO
Stars en GitHub
~15.3k
Último commit
2024 (mantenimiento mínimo)
Mantenedor
manast1 (único, activo)
Issues abiertos
~420
Mantenedor único
Sin SECURITY.md / contacto seguridad
bull es popular y funcional, pero su mantenedor lo marcó como "legacy" en favor de BullMQ (su sucesor oficial). Recibe solo correcciones críticas. El riesgo principal es la dependencia de mantenedor único sin canal de reporte de seguridad formal.
Alternativa recomendada: BullMQ — BullMQ es el sucesor oficial de bull, mantenido por la misma persona pero con soporte activo y mejor arquitectura. La migración es directa. También soporta grupos de workers y reintentos mejorados.
4
Recomendaciones
P0 — Inmediato
Eliminar event-stream, colors y ua-parser-js del proyecto
Estas tres dependencias tienen historial confirmado de supply chain attacks. Aunque las versiones actuales no estén comprometidas, su presencia indica un patrón de gestión de riesgo inadecuado. Sustituir por through2/stream nativo, chalk v5 y bowser respectivamente antes del pentest externo.
P1 — Esta semana
Migrar flat a v6.0.1+ o eliminar la dependencia
CVE-2021-43138 (Prototype Pollution, CVSS 7.8) no tiene parche en la rama 5.x actualmente instalada. Si flat procesa inputs externos (eventos de usuario, webhooks), el riesgo de explotación es real. Migrar a v6 (breaking change de ESM) o reemplazar por dot-prop o implementación nativa.
P1 — Esta semana
Auditoría de uso de PyYAML — verificar yaml.safe_load() en todo el código
CVE-2020-14343 (CVSS 9.8) solo es explotable si se usa yaml.load() sin Loader explícito. La versión 6.0.1 instalada es segura por defecto, pero es imprescindible verificar que ningún worker usa yaml.load() heredado. Ejecutar:
grep -rn "yaml.load(" --include="*.py" .P2 — Este mes
Revisar configuración de jsonwebtoken en producción
La versión ^9.0.0 cubre los CVEs conocidos. Realizar code review específico: verificar que algorithms está explícitamente definido (no permitir 'none'), que issuer/audience se validan, y que los secrets tienen ≥256 bits de entropía y se rotan periódicamente.
P2 — Este mes
Migrar bull a BullMQ
bull está en modo legacy. BullMQ es el sucesor oficial con mantenimiento activo y mejor soporte de TypeScript. La migración es directa y reduce el riesgo de mantenedor único en un componente crítico (cola de jobs).
P3 — Siguiente sprint
Implementar dependabot + npm audit / pip-audit en CI/CD
Este análisis cubre dependencias directas; las transitivas requieren herramientas automatizadas. Configurar GitHub Dependabot alerts y añadir
npm audit --audit-level=high y pip-audit en el pipeline de CI para detección continua de nuevos CVEs.