# Codex Suite · backlog de seguridad aplazado

> Estado: deuda registrada, no implementada. Última revisión: 3 de agosto de 2026. Este documento no sustituye el [análisis de Migración de sesiones v2](hardening/session-migration-v2/hardening.md).

## Regla de aplazamiento

Podemos continuar desarrollando dentro del PC y Tailscale conservando los controles de Security Hardening v1. No debemos degradarlos para acelerar funciones. Las tareas marcadas como bloqueantes deberán resolverse antes de acceso público, multiusuario, datos de terceros, facturación o comercialización.

## Controles activos que no se pueden aparcar

- Sesión `HttpOnly` y `SameSite=Strict`.
- Tokens en URL rechazados.
- Bootstrap autenticado sin secretos.
- CORS y mutaciones restringidos por origen.
- Workspace y archivos confinados a raíces autorizadas.
- Herramientas ejecutadas en backend, nunca desde el navegador.
- Aprobaciones y revisión posterior por archivo.
- API keys existentes no recuperables desde el frontend.
- Health público mínimo y diagnóstico sensible autenticado.

## Bloqueantes antes de comercializar o exponer públicamente

| ID | Pendiente | Riesgo actual | Dependencias y aceptación |
| --- | --- | --- | --- |
| `SEC-01` | HTTPS administrado | En HTTP remoto la cookie no puede garantizar `Secure`; una red fuera de Tailscale sería inaceptable | Elegir Tailscale Serve o proxy; probar iPhone/Windows; HTTP remoto redirigido o rechazado |
| `SEC-02` | Migración de sesiones v2 | `X-Bridge-Token` sigue siendo autoridad compartida para clientes heredados | Inventario, credenciales por capacidad, telemetría sin secretos, cero uso heredado y rotación coordinada |
| `SEC-03` | Rotación de credenciales históricas | El token apareció anteriormente en una URL y puede conservar copias | Completar `SEC-02`, rotar sin imprimir valores y verificar todos los consumidores |
| `SEC-04` | CSP estricta por aplicación | La política global heredada admite `unsafe-inline`, `unsafe-eval` y orígenes amplios; Codex Suite ya tiene una política más estricta | Inventariar necesidades por app, usar nonces/hashes y probar cada vecina |
| `SEC-05` | Vault profesional | DPAPI/archivos locales no aportan expiración, referencias por entorno ni rotación completa | Modelo de secretos, backup, recuperación, auditoría y credenciales write-only |
| `SEC-06` | Backups cifrados y restauración | Checkpoints locales no equivalen a recuperación completa; metadata Git está dañada | Estrategia 3-2-1 adaptada, cifrado, prueba automática y RPO/RTO definidos |
| `SEC-07` | Aislamiento dinámico de herramientas | `workspaceWrite` limita rutas, pero una plataforma comercial necesita workers/contenedores y políticas de red más fuertes | Sandbox por misión, límites CPU/RAM/tiempo, egress allowlist y destrucción verificable |
| `SEC-08` | Cadena de confianza de integraciones | MCP/plugins pueden incorporar código y autoridad externa sin firma/SBOM gobernados | Firma, procedencia, SBOM, permisos, health, revocación y desinstalación |

## Prioridad alta para operación privada

| ID | Pendiente | Evidencia o límite conocido | Próxima verificación |
| --- | --- | --- | --- |
| `SEC-09` | ACL y dispositivos Tailscale | No se validaron ACLs, dispositivos ni posible Funnel | Inventario read-only y decisión del administrador |
| `SEC-10` | Defender en tiempo real | Antivirus activo; protección en tiempo real no confirmada | Consulta elevada independiente y política documentada |
| `SEC-11` | Cifrado del equipo | Estado no disponible con permisos actuales | Verificar BitLocker y recuperación de clave sin almacenarla en el proyecto |
| `SEC-12` | Superficie de red | Se observaron 39 listeners; el informe no determina necesidad ni exposición | Clasificar propietario, interfaz, firewall y necesidad; no cerrar automáticamente |
| `SEC-13` | Auditoría y retención | Eventos y acciones no tienen todavía política comercial de retención e integridad | Definir campos, redacción, acceso, expiración y exportación |
| `SEC-14` | Dependencias y supply chain | Falta política automatizada de actualizaciones, lockfile, licencias y advisories | SBOM del anfitrión, revisión de dependencias y actualización gobernada |
| `SEC-15` | Rate limiting y abuso | La autenticación reduce acceso, pero no existe una política completa por identidad/capacidad | Límites por login, acciones sensibles, streams y servicios |
| `SEC-16` | Retirar la bóveda heredada que revela `.env` | `/api/credentials/*` devuelve valores a una sesión administrativa y amplía el impacto de su compromiso | Diseñar vault write-only, migrar consumidores, bloquear revelación y añadir pruebas negativas |
| `SEC-17` | Endurecer creación heredada de proyectos | `/api/projects/create` precede al modelo actual de confinamiento, confirmación y transacción | Ruta canónica bajo bases autorizadas, rechazo de traversal/junctions, mismo origen, confirmación exacta y rollback |

## Seguridad ligada a funciones futuras

- Multiusuario exige identidad, roles, tenants, auditoría, aislamiento y revocación antes de colaborar.
- Workspace multi-raíz exige consentimiento y política independiente por cada raíz.
- LSP/Monaco exige que los servidores de lenguaje no hereden secretos ni red ambiental.
- Staging dinámico y deploy necesitan artefactos íntegros, gates firmados, cola transaccional y rollback remoto probado.
- Aplicación Flutter debe usar APIs estables, almacenamiento seguro del sistema y permisos móviles explícitos; no debe recibir el token raíz.
- Indexación semántica debe excluir secretos, binarios, datos personales y rutas ignoradas antes de crear embeddings.

## Criterio para retomar el bloque

La implementación de seguridad se retomará por subbloques verificables. El primero recomendado sigue siendo HTTPS + inventario de consumidores; después sesiones/capacidades y rotación. Ningún elemento cambia a completado por documentación o por existir un botón: requiere backend, prueba negativa, prueba funcional, rollback y actualización del manual.

## Incidentes de aplicaciones vecinas

- [3 de agosto de 2026 · CaptaJaus: `SESSION_SECRET` incompatible](incidents/2026-08-03-captajaus-session-secret.md). La causa fue una validación de longitud implantada sin migrar la configuración de CaptaJaus; no fue una rotación de `BRIDGE_TOKEN`.
