ADRactivecreado Fri Jul 10#security#audit#architecture#multi-tenancy#rls#infrastructure#performance#quality-assurance
Contexto
Se inicia auditoria formal 2026-07 con Fase 0 (verificación estática) y Fase 1 (implementación de correcciones). Objetivo: diagnosticar y remediar brechas de seguridad, rendimiento y calidad arquitectónica del backend y frontend.
Hallazgos Críticos — FASE 0
Seguridad (CRÍTICO)
Vulnerabilidades identificadas:
- IDOR en admin.py (línea 275): endpoint revoke sin validación de org. Corrección aplicada en el commit.
- Cross-org attachment en ClientProject: falta validación de org al adjuntar proyectos. Verificado.
- WebSocket sin filtro de org (sentinel_ingest.py): broadcast de métricas sin row-level-security. Severidad ALTA.
- RLS-gap en 3 tablas nuevas: AIInsight, AIInsightAuditLog, y tabla de ingestión de VictoriaMetrics. No tienen RLS configurado. Véase [[incident—20260710—rls-gap-tablas-nuevas]].
- Refresh token en WS (consumers.py): WebSocket acepta refresh tokens sin validar tiempo de vida. Severidad MEDIA.
Superficies nuevas auditadas:
- vsdx (XML parsing): sin defusedxml (zip-bomb, XXE). Corrección: aplicar defusedxml.
- scrapli (shell commands): sin sanitización de args. Evaluación: bajo riesgo (CLI local only), pero documentar.
- rate-limit por tenant: ya corregido en código anterior. Hash salteado OK, pero ventana no es atómica (race condition BAJA).
Rendimiento (MEDIO-ALTO)
N+1 queries: hot path de racks limpio. Grueso del bloque requiere medición con CaptureQueries/silk (decisión tooling de Edu en FASE 2).
Valkey (in-memory cache):
- Configuración:
timeout=Nonebajo políticaallkeys-lru→ riesgo de evicción arbitraria. - Cola Huey en la misma instancia → contención de memoria.
- Recomendación: separar instancia o ajustar políticas.
Huey (task queue):
- Cero retries configurados.
- Sin dead-letter queue.
- Recomendación: configurar retry logic + DLQ en FASE 2.
VictoriaMetrics:
- Cardinalidad sana.
- Hallazgo: ingest escribe nombres de agentes crudos sin allowlist → cardinalidad futura alta.
Calidad Arquitectónica (MEDIO)
Cobertura: 106 tests con buena cobertura de seguridad.
Ciclomatic complexity: 0 ciclos, god-nodes sanos. Ningún módulo >1000 LOC.
Hallazgos:
- Sin mypy: análisis de tipos estático ausente. Severidad: MEDIO (requiere setup inicial bajo). Corrección: activado en CI
.github/workflows/ci.ymlcon modo laxo (baseline 0). - Frontend Vite huerfano:
- No se sirve desde Django.
- 132 nodos muertos.
- Konva duplicado.
- Severidad: ALTO (dead code, UX desconocida).
- Recomendación: FASE 1.5 remover o integrar.
Stack:
- Backend: correcto sin migración justificada.
- Dependencias: daphne 4.2.1 con 2 CVEs críticas (véase [[incident—20260710—daphne-cves-pysec-2026-213-214]]).
Decisiones Implementadas — FASE 1
Seguridad
- ✅ IDOR en admin.py: corrección aplicada.
- ✅ ClientProject cross-org: validación agregada.
- ✅ mypy en CI: modo laxo, baseline 0 (no bloquea CI, es advisory).
- ⏳ RLS en 3 tablas nuevas: en roadmap de FASE 1a (AIInsight et al.).
- ⏳ WS sin filtro org: refactor en FASE 1b.
- ⏳ VictoriaMetrics allowlist: FASE 1c.
Infra
- ✅ Daphne bump 4.2.1 → 4.2.2: remedia PYSEC-2026-213 (DoS) y PYSEC-2026-214 (header-injection).
Calidad
- ✅ pip-audit: daphne CVEs corregidas.
- ✅ npm audit: limpio (frontend npm).
- ⏳ Vite dead-code: FASE 1.5.
Plan — FASE 2 y adelante
| Fase | Tema | Owner | Deadline |
|---|---|---|---|
| 1a | RLS en AIInsight + ingestión | Edu | 2026-07-15 |
| 1b | WS filtrado por org + refresh-token | Marcos | 2026-07-17 |
| 1c | VictoriaMetrics allowlist agentes | Edu | 2026-07-20 |
| 1.5 | Frontend Vite: remover o integrar | Esquembri | 2026-07-25 |
| 2 | Medición N+1 (silk/CaptureQueries) | Edu | 2026-08-01 |
| 2 | Valkey/Huey tuning | Infra | 2026-08-05 |
Documentación
Documento maestro: AUDIT.md (en el repo).
Incidentes relacionados:
- [[incident—20260710—rls-gap-tablas-nuevas]]
- [[incident—20260710—daphne-cves-pysec-2026-213-214]]
Decisión previa (multi-tenancy y RLS):
- [[decision—20260403—multi-tenancy-rls]]
Concepto:
- [[concept—saas—multi-tenancy]]
Véase también
- [[decision—20260403—multi-tenancy-rls]]
- [[concept—saas—multi-tenancy]]
- [[incident—20260710—rls-gap-tablas-nuevas]]
- [[incident—20260710—daphne-cves-pysec-2026-213-214]]