Metodologia
Se realizo un analisis estático de seguridad (SAST) del código fuente de los 5 repositorios del ecosistema Nvito siguiendo la metodologia OWASP Top 10 (2025). El analisis cubrio:
- Revision manual de cada controller, servicio y guard
- Búsqueda automatizada de patrones vulnerables (regex)
- Analisis de flujos de autenticación y autorización
- Revision de lógica de negocio para detectar abusos
- Auditoria de configuración de infraestructura
Categorías OWASP analizadas
A01 — Broken Access Control
Estado: SEGURO (post-remediacion)
Hallazgos corregidos:
- Slugs de invitación con entropia baja (Math.random) → Corregido con crypto.randomBytes
- Endpoints públicos sin rate limiting → Corregido con @Throttle
Protecciones activas verificadas:
- ClerkAuthGuard valida JWT y usuario existe en BD
- OrganizationResolverService centralizado para contexto de org
- Tenant middleware inyecta filtro RLS en cada query
- Soft delete con middleware automático (deletedAt: null)
A02 — Cryptographic Failures
Estado: EXCELENTE
- AES-256-GCM para PII con IV único por operación
- Key derivation con scrypt resistente a fuerza bruta
- JWT con HS256 y secrets de 32+ caracteres obligatorios
- timing-safe comparison para tokens de webhook
A03 — Injection
Estado: SEGURO
- Todos los $queryRaw y $executeRaw usan tagged templates (parametrizados)
- No se encontraron patrones de ejecución de comandos del sistema ni code injection
- HtmlValidatorService detecta y rechaza patrones peligrosos en HTML de invitaciones externas
- DOMPurify con whitelist estricta para renderizado de HTML
A04 — Insecure Design
Estado: SEGURO (post-remediacion)
Hallazgos corregidos:
- Race condition en RSVP (validación + creación sin transacción) → Corregido con $transaction
- Race condition en generación de slugs (TOCTOU) → Corregido con retry atomico
- Stripe webhook aceptaba requests sin firma → Corregido con UnauthorizedException
Protecciones activas verificadas:
- Check-in QR usa transacción atomica (preexistente)
- Operaciones destructivas requieren SuperAdminGuard
A05 — Security Misconfiguration
Estado: SEGURO (post-remediacion)
Hallazgos corregidos:
- Redis sin autenticación → Corregido con requirepass
- MinIO templates público → Corregido (bucket privado)
- Adminer expuesto por defecto → Corregido con profile debug
- Twilio bypass configurable → Eliminado
- Docker images sin versión pineada → Corregido con versión específica
Protecciones activas verificadas:
- Helmet con CSP, HSTS, X-Frame-Options, Referrer-Policy
- CORS restrictivo (sin wildcard en producción)
- Swagger deshabilitado en producción
- Stack traces nunca expuestos al cliente
A06 — Vulnerable and Outdated Components
Estado: REQUIERE ATENCION
Vulnerabilidades detectadas por npm audit:
- undici (HTTP client de Node.js): múltiples CVEs de severidad moderate/high
- next (PWA): CSRF bypass en Server Actions con null origin
- Todas corregibles con
npm audit fix
Ver sección de dependencias para politica completa.
A07 — Identification and Authentication Failures
Estado: SEGURO
- Rate limiting en todos los endpoints de auth
- JWT con expiración de 15 minutos + refresh de 30 dias
- Clerk webhook con protección anti-replay (idempotencia + timestamp)
- Logout invalida tokens via Clerk session management
A08 — Software and Data Integrity Failures
Estado: SEGURO
- Stripe webhooks: validación de firma con rawBody
- Clerk webhooks: Svix signature verification
- Twilio webhooks: validateRequest sin bypass
- ISR revalidation: timing-safe comparison de secret
A09 — Security Logging and Monitoring Failures
Estado: PARCIAL
Implementado:
- Winston logger con sanitizacion de PII (35 claves sensibles redactadas)
- ActivityLog en BD para acciones sensitivas
- Endpoint /health/pinning-report para telemetria de certificate pinning
- CertificateSchedulerService para alertas proactivas
Pendiente:
- SIEM centralizado para correlación de eventos
- Alertas automáticas de intentos de auth fallidos
- Dashboard de metricas de seguridad en tiempo real
A10 — Server-Side Request Forgery (SSRF)
Estado: SEGURO
- CDN URL validator con whitelist estricta (cdn.nvito.mx, r2.dev)
- No se encontraron llamadas HTTP con URLs de usuario sin validación
- IPs privadas permitidas solo en desarrollo
Hallazgos descartados (falsos positivos)
| Hallazgo reportado | Razon de descarte |
|---|---|
| .env en git history | Verificado: .env nunca fue committeado. Solo templates con placeholders |
| Preview tokens vulnerable a timing attack | Usan JWT verify (criptografico), no comparacion de strings |
| Secrets en código fuente | Solo en archivos .env locales (gitignored) |
| Patrones peligrosos en html-validator | Es regex de DETECCION para rechazar HTML malicioso, no ejecución |
Recomendaciones para proxima auditoria
- Ejecutar DAST (Dynamic Application Security Testing) contra ambientes DEV/TEST
- Contratar pentesting profesional externo antes del lanzamiento a producción
- Implementar scanning automatizado de dependencias (Snyk o Dependabot)
- Agregar pre-commit hooks para detección de secrets (git-secrets + husky)