BongoFact · Auditoría de Seguridad de aplicación, API, datos y despliegue Fecha: 2026-09-29T21:56:39.656Z Resultado global: PASS Controles: 15 · PASS: 15 · N/A: 0 · FAIL: 0 Alcance: Análisis estático reproducible de autenticación, autorización, aislamiento tenant, secretos, cifrado, trazabilidad, cabeceras, límites y despliegue. Limitación: No constituye certificación ENS, pentest externo ni prueba de la configuración efectiva del proveedor cloud/VPS. [PASS] JWT_PRIVATE_ENDPOINTS Área: Identidad · autenticación Referencia: RGPD art. 32 · ENS arts. 17 y 18 · OWASP ASVS V2 Requisito: Validar JWT en endpoints privados y autenticación específica del integrador. Método: Inspección de middleware y prefijos protegidos. Evidencia: server/index.mjs · middleware/requireAuth.mjs Resultado: requireAuth valida JWT; AUTH_ROUTE_PREFIXES cubre facturación/admin; integrador usa API key propia. [PASS] SQL_INJECTION_STATIC Área: API · inyección Referencia: OWASP ASVS V5 · OWASP Top 10 A03 Requisito: Evitar SQL construido por concatenación de entrada no confiable. Método: Escaneo de patrones peligrosos en todos los archivos del servidor. Evidencia: server/**/*.mjs Resultado: Sin patrones obvios de SQL concatenado en 254 archivos server. [PASS] INTEGRADOR_APIKEY_HASH Área: Identidad · credenciales API Referencia: OWASP ASVS V2/V6 Requisito: No persistir API keys de integradores en texto claro. Método: Vector hash independiente y revisión de columnas persistidas. Evidencia: integradorBancarioAuth.mjs Resultado: API key de integrador: SHA-256 hex; solo se persiste integrador_api_key_hash. [PASS] HEALTH_PUBLIC Área: Operación · monitorización Referencia: ENS arts. 23 y 26 Requisito: Exponer salud mínima sin datos sensibles y sin exigir sesión. Método: Control negativo del gate JWT. Evidencia: server/index.mjs Resultado: /api/health excluido correctamente del gate JWT. [PASS] TENANT_RLS_ISOLATION Área: Datos · aislamiento tenant Referencia: RGPD art. 32 · ENS arts. 15, 17 y 21 (referencia de buenas prácticas) Requisito: Toda lectura/escritura fiscal debe quedar limitada al tenant autorizado. Método: Análisis estático reproducible del artefacto de release. Evidencia: requireTenantFacturacion.mjs · políticas RLS en supabase/migrations Resultado: Existe middleware tenant y RLS en la base de datos; la prueba no sustituye un test remoto de políticas. [PASS] RBAC_SUPERADMIN_MFA Área: Identidad · privilegios Referencia: ENS arts. 17 y 18 · OWASP ASVS V2/V4 Requisito: Las acciones privilegiadas requieren rol de plataforma verificado y MFA AAL2. Método: Análisis estático reproducible del artefacto de release. Evidencia: server/index.mjs · requireAuth.mjs Resultado: El backend diferencia Superadmin de claims genéricos y dispone de gate AAL2. [PASS] ORIGIN_CORS_CSRF Área: API · origen de peticiones Referencia: OWASP ASVS V3/V14 Requisito: Restringir orígenes web y bloquear mutaciones sin origen/autenticación válida. Método: Análisis estático reproducible del artefacto de release. Evidencia: server/index.mjs Resultado: Existe allowlist de hosts/orígenes y gate JWT para prefijos protegidos. [PASS] RATE_LIMIT_ABUSE Área: API · disponibilidad Referencia: ENS art. 23 · OWASP API Security API4 Requisito: Limitar abuso en autenticación, IA y rutas de coste elevado. Método: Análisis estático reproducible del artefacto de release. Evidencia: server/index.mjs Resultado: Se detectan limitadores para IA y middleware de rate limiting. [PASS] HTTP_SECURITY_HEADERS Área: Web · navegador y transporte Referencia: ENS arts. 22 y 23 · OWASP ASVS V14 Requisito: Forzar HTTPS/HSTS y políticas CSP, anti-sniffing y framing. Método: Análisis estático reproducible del artefacto de release. Evidencia: securityCsp.mjs · nginx-bongofact.conf Resultado: La aplicación define HSTS/CSP y Nginx sirve el dominio por HTTPS. [PASS] SECRETS_DEPLOY_ISOLATION Área: Secretos · despliegue Referencia: ENS arts. 18, 19 y 21 · OWASP ASVS V6 Requisito: No incluir secretos, credenciales cloud ni claves privadas en artefactos o frontend. Método: Análisis estático reproducible del artefacto de release. Evidencia: deploy/deploy-bongoo.ps1 Resultado: El empaquetado excluye .env y credenciales; el .env remoto se conserva con permisos restringidos. [PASS] CERTIFICATE_VAULT_CRYPTO Área: Criptografía · certificados Referencia: RGPD art. 32 · ENS arts. 21 y 22 Requisito: Cifrar certificados en reposo, limitar descifrado y limpiar material sensible de memoria. Método: Análisis estático reproducible del artefacto de release. Evidencia: certificadoVault.mjs y servicios de firma Resultado: Se detectan cifrado autenticado/gestión de bóveda y limpieza de buffers. [PASS] AUDIT_LOG_APPEND_ONLY Área: Trazabilidad · auditoría Referencia: ENS art. 24 · RD 1007/2023 art. 8 (ámbito fiscal) Requisito: Registrar acciones críticas en una bitácora tenant-scoped resistente a alteración. Método: Análisis estático reproducible del artefacto de release. Evidencia: auditLogger.mjs · migration audit_logs_inmutable Resultado: audit_logs es append-only por trigger, fuerza RLS y restringe privilegios. [PASS] LOG_SECRET_DISCLOSURE Área: Trazabilidad · confidencialidad Referencia: RGPD art. 32 · OWASP ASVS V7 Requisito: No escribir contraseñas, PIN, claves privadas, service_role o API keys en logs. Método: Análisis estático reproducible del artefacto de release. Evidencia: Escaneo de 254 archivos server Resultado: No se detecta interpolación obvia de secretos en console.*. [PASS] DEPENDENCY_LOCKFILE Área: Cadena de suministro Referencia: ENS arts. 20 y 21 · OWASP ASVS V1.14 Requisito: Fijar versiones reproducibles de dependencias para el artefacto desplegado. Método: Análisis estático reproducible del artefacto de release. Evidencia: package-lock.json · npm install en deploy Resultado: Existe lockfile y producción instala únicamente dependencias runtime. [PASS] DEPLOY_ATOMIC_HEALTH_ROLLBACK Área: Continuidad · despliegue Referencia: ENS arts. 25 y 26 Requisito: Publicar de forma controlada, conservar versión anterior y verificar salud del servicio. Método: Análisis estático reproducible del artefacto de release. Evidencia: deploy/deploy-bongoo.ps1 Resultado: El frontend usa swap, conserva dist.previous y comprueba Nginx/API tras reinicio. Todos los controles superados.