CULTIVA IA — Servicio de Seguridad
Informe Confidencial

Supply Chain Risk Report

FlowMetrics · analytics-backend · Node.js + Python Stack
Fecha de escaneo
2026-06-16 09:41:22
Dependencias analizadas
23
Alto riesgo
6
CVEs activos
4
Duración del análisis
14 min 38 s
⚠️
Se detectaron dependencias con ataques de supply chain documentados
event-stream (npm) y colors (npm) tienen historial confirmado de compromisos por mantenedor malicioso. Se recomienda eliminación o sustitución antes del pentest. Adicionalmente, ua-parser-js sufrió un ataque de takeover en 2021 que publicó versiones con cryptominer. Estas tres dependencias deben ser abordadas con prioridad P0.
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
Mantenedor único
35%
Sin contacto seguridad
52%
CVEs críticos/altos
26%
Abandono / stale
22%
Supply chain attack
13%
Baja popularidad
17%
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.