Mapeo CIS / NIST / ISO
Qué se cumple, qué es parcial y qué falta, sin maquillaje.
En esta página
No es una certificación
Este mapeo se hizo leyendo el código y no equivale a una auditoría ni a una certificación. Los números de control son referencias orientativas de CIS Controls v8, NIST SP 800-53 / 800-63B e ISO/IEC 27001:2022 Anexo A. CUMPLE = el código implementa el control razonablemente; PARCIAL = existe pero con huecos; FALTA = no implementado.
Resumen#
- Fortalezas: MFA TOTP con anti-replay, sesiones revocables, cifrado en reposo AES-256-GCM con rotación de claves, autenticación entre sistemas con Ed25519 sin secretos compartidos, sanitización del correo entrante en iframe aislado, auditoría con redacción, retención configurable y muchas validaciones de entrada.
- Lo que falta o es débil: control de acceso de administrador en el backend compartido, sin KMS/HSM, sin cifrado a nivel de aplicación de correos y adjuntos, sandbox de extensiones que no es frontera fuerte, rate limit y anti-replay por instancia, webhooks sin firma si no se configura el secreto, y auditoría sin integridad ni SIEM.
Matriz de controles#
| Control (CIS v8 / NIST / ISO A) | Estado | Justificación por código |
|---|---|---|
| Cuentas y contraseñas: CIS 5 / IA-5, 63B / A.5.17 | PARCIAL | Frontend: 12 caracteres mínimo, lista de comunes, bcrypt coste 12, anti-enumeración. El backend acepta 8 caracteres, sin lista de comunes. |
| MFA: CIS 6.3–6.5 / IA-2(1), AAL2 / A.8.5 | PARCIAL | TOTP con anti-replay y códigos de recuperación, obligatorio para ADMIN_EMAILS. Opcional para el resto; el callback de Google no exige TOTP si MFA es voluntario; el backend no tiene MFA; sin WebAuthn. |
| Sesiones y revocación: CIS 6 / AC-12, IA-11 / A.8.5 | PARCIAL | TTL 24 h, tope 14 d, jti y tokenVersion, cookie __Host-. Caché de revocación de 5 s por instancia; JWT multicuenta en localStorage; revocación dependiente del DDL. |
| Control de acceso y mínimo privilegio: CIS 6.8 / AC-3, AC-6 / A.5.15, A.8.2 | PARCIAL | requireAdmin exige propiedad del dominio de la instancia para los managers del backend compartido, o ADMIN_EMAILS con MFA para usuarios (ver Seguridad). |
| Cifrado en reposo: CIS 3.11 / SC-28, SC-13 / A.8.24 | PARCIAL | AES-256-GCM v3 con HKDF y keyId para secretos TOTP, tokens OAuth y ajustes. Correos y adjuntos no se cifran a nivel de aplicación (solo S3_SSE opcional). |
| Gestión de claves y rotación: NIST SC-12 / A.8.24 | PARCIAL | Anillo de claves con keyId y re-cifrado perezoso. Claves en variables de entorno, sin KMS; la clave dedicada no es obligatoria por defecto; el backend no tiene keyId. |
| Cifrado en tránsito: CIS 3.10 / SC-8 / A.8.24 | PARCIAL | HSTS con preload, upgrade-insecure-requests, extensiones solo https. La URL por defecto del backend en algunos sitios es http://…. |
| Registros y auditoría: CIS 8.2, 8.5 / AU-2, AU-3, AU-9 / A.8.15 | PARCIAL | AuditEvent con redacción y retención de 365 d. Sin integridad criptográfica ni SIEM; el backend solo escribe a stdout. |
| Antimalware: CIS 10.1, 9.6 / SI-3 / A.8.7 | PARCIAL | Magic-bytes y extensiones peligrosas siempre activos. Antivirus opcional y fail-open por defecto; archivos > 25 MB sin escanear. |
| Limitación de intentos y DoS: CIS 13 / AC-7, SC-5 / A.8.6 | PARCIAL | Límites por IP y por cuenta; global con Upstash. Sin Redis es por instancia; el backend siempre en memoria. |
| Seguridad de aplicaciones web: CIS 16 / SI-10, SC-18 / A.8.26, A.8.28 | PARCIAL | CSP, HSTS, nosniff, DOMPurify + iframe aislado, CSRF por Origin. La CSP permite unsafe-inline y https: genérico; CSRF omitido sin Origin o con Bearer. |
| Retención y eliminación: CIS 3.4 / SI-12, MP-6 / A.8.10 | PARCIAL | Borrado completo con conteo de referencias. Por defecto solo el spam (30 d) está activo; papelera y raw.json desactivados. |
| Autenticación entre sistemas: NIST IA-3, SC-23 / A.8.5 | PARCIAL | Ed25519 por dominio, ventana ±120 s y nonce. Modo legado sin firma; nonce solo en memoria de la instancia. |
| Aislamiento de código de terceros: SC-39, SC-7 / A.8.26 | PARCIAL | worker_threads con límites duros y safe-fetch sólido, pero comparte proceso y usuario: no es frontera fuerte. |
| Antiphishing y filtrado de correo: NIST 800-177 / A.8.23 | CUMPLE | Sanitización DOMPurify, iframe sin allow-same-origin, imágenes remotas bloqueadas por defecto, aviso de enlaces engañosos, insignia SPF/DKIM/DMARC y sin backscatter. |
| Secretos en repositorio y entorno: CIS 3.11 / IA-5(7) / A.8.4 | PARCIAL | .env ignorado por git; las extensiones no pueden leer variables de plataforma. Fallo en producción sin NEXTAUTH_SECRET. Credenciales antiguas en documentos internos pendientes de rotar. |
| Integridad de webhooks: SI-7, SC-8 / A.8.24 | FALTA | Los webhooks de Resend se aceptan sin firma si no defines WEBHOOK_SECRET / RESEND_WEBHOOK_SECRET (decisión por organizador, solo un aviso en el log). |
| Configuración segura por defecto: CIS 4 / CM-6 / A.8.9 | PARCIAL | Buenos valores por defecto (__Host-, v3, TTL 24 h) junto a otros permisivos: registro abierto en el backend, ASSET_UNSIGNED_UPLOADS=allow, AV fail-open, clave dedicada opcional. |
Qué no cubre BloomX#
- Gestión de vulnerabilidades y dependencias: el frontend usa
next: "latest"yreact: "latest"sin versión fijada; el backend usaluciayoslo, marcadas como obsoletas por sus autores. - Copias de seguridad, recuperación ante desastres y continuidad: dependen de tu proveedor de base de datos y almacenamiento (Operación).
- Gestión de incidentes, formación, control físico y gobierno: fuera del alcance del software.
- DLP: existe la extensión
dlp(bloquea por palabras clave y detectores enEMAIL_PRE_SEND), pero el envío sellado la evade y solo ve el correo exterior.
Verificado por lectura de código; no se ejecutaron pruebas de penetración. Las tablas UserMfa, RevokedSession, AuditEvent y SecureMessageMeta deben existir en el entorno desplegado (npm run db:ensure) para que los controles correspondientes estén activos.