Volver a la wiki

Auditoría Suprema Etapa 3: Cierre de findings M1 (media gateado), B6 (orden middleware) y E (Device.management_config)

Contexto

Bloque de cierre de 3 findings menores (pero críticos) del informe Auditoría Suprema, que pertenecen a la tanda transversal config/IA (configuración de seguridad y flujos de autenticación). Precedente: decisión de retirar DEV_KEY tras completar cobertura de re-cifrado en todos los almacenes de credenciales.

Problem statement

M1: /media/ sin control de acceso (anonimato = obscuridad)

Hallazgo: El endpoint /media/ servía cualquier fichero subido (planos, stencils, assets) a cualquiera que tuviera el UUID del nombre. No había validación de sesión ni de tenant — la “seguridad” era solo el nombre impredecible del archivo.

Riesgo: Un usuario de Tenant A podía descargar planos/imágenes de Tenant B si adivinaba o interceptaba la URL.

Solución adoptada:

Verificación: Los players SpinetiX usan views_publish con FileResponse propio, no acceden a /media directamente.

B6: RateLimitMiddleware en orden incorrecto

Hallazgo: El middleware de rate-limit por tenant corría antes de AuthenticationMiddleware, por lo que request.user no estaba aún disponible. La capa per-tenant (que resuelve request.user.organization) era código muerto — solo el límite per-IP funcionaba.

Riesgo: Sin límite por tenant, un usuario de Tenant A podía consumir la cuota de otro tenant.

Solución adoptada:

E: Device.management_config no cubierto en re-cifrado

Hallazgo: El campo racks.Device.management_config almacena credenciales (ip, username, password, enable_password) en JSON cifrado, pero no estaba incluido en el comando reencrypt_credentials.

Riesgo: Al retirar DEV_KEY del fallback de descifrado, estos dispositivos quedarían inaccesibles.

Solución adoptada:

Decisión

✅ Implementar M1, B6 y E completos en una sesión (Sesión 128, 2026-06-11).

Implantación

Archivos modificados

Rollout

  1. Desplegar a staging con tests verdes.
  2. Verificar en PROD que anónimos no pueden descargar media.
  3. Ejecutar ./manage.py reencrypt_credentials --dry-run en PROD.
  4. Ejecutar sin --dry-run tras validar reporte.
  5. PR posterior: remover DEV_KEY y fallback del cipher.

Rationale

Véase también

Subir