From 697653784229ff4c4b43a04867526c4bebd6b03d Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Sun, 7 Jun 2026 16:17:41 +0200 Subject: [PATCH] chore(0005): bump unibus to 0.7.0, close issue 0005 (hardening 2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hardening 2 (issue 0005, fases 0005a-0005e) cierra los hallazgos nuevos de la re-auditoría red-team (report 0006): bump de nats-server + toolchain (16 CVEs -> 0 alcanzables), drop de frames sin firma en rooms SignMsgs, limiter global de bytes en vuelo contra el DoS por concurrencia, TLS obligatorio en bind publico, y cableado de la ACL por subject que cierra el wildcard metadata leak. Detalle por fase en el capability growth log del app.md y en el report 0007. Co-Authored-By: Claude Opus 4.8 (1M context) --- app.md | 25 ++++++++++++++++++++++++- dev/issues/0005-security-hardening-2.md | 3 ++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app.md b/app.md index cfc7181..45649d2 100644 --- a/app.md +++ b/app.md @@ -2,7 +2,7 @@ name: unibus lang: go domain: infra -version: 0.6.0 +version: 0.7.0 description: "Bus de mensajería unificado sobre NATS+JetStream con cifrado E2E por room (megolm/olm reducido): service de membresía/claves, librería cliente y peers demo." tags: [service, messaging, nats, e2e] uses_functions: @@ -154,6 +154,29 @@ agent..{in,out} inbox/outbox de agente LLM (agent.scout.in) ## Capability growth log +- v0.7.0 (2026-06-07) — hardening de seguridad 2 (issue 0005, fases 0005a–0005e) + que cierra los hallazgos nuevos de la re-auditoría red-team (report 0006) y + lleva el veredicto de exposición pública a "sí-con-condiciones". (0005a) Bump de + `github.com/nats-io/nats-server/v2` v2.10.22→v2.11.15 y de la toolchain a + go1.26.4: `govulncheck ./...` pasa de 16 vulnerabilidades alcanzables (14 del + servidor NATS embebido + 2 de la stdlib) a 0. (0005b) `client.processFrame` + ahora descarta cualquier frame sin firma en una room `SignMsgs` (antes verificaba + solo si la firma venía presente, lo que permitía suplantar `Sender` con + `Sig==nil`). (0005c) Nuevo limiter global de bytes en vuelo + (`pkg/membership.inflightLimiter`) que acota la memoria agregada que el control + plane bufferiza bajo concurrencia (el límite por-request y el rate-limit por-IP + no acotaban el total): un flood concurrente multi-IP se descarta con 503 en vez + de crecer sin techo (el RSS deja de escalar con N). (0005d) El guard de arranque + `validateBootConfig` ahora exige `--tls-cert/--tls-key` en bind no-loopback (un + control plane público sin TLS servía metadata en claro). (0005e) Se cablea por + fin en `membershipd` la ACL por subject que ya existía huérfana desde 0003e + (`busauth.NewNkeyAuthenticatorACL` + nuevo adaptador `busauth.PermissionsFromSubjects` + sobre `membership.SubjectACLFor`): un registrado no-miembro ya no puede + `Subscribe(">")` y captar los subjects/advisories de rooms ajenas. Residuales + documentados: `$JS.API.>` sigue compartido (cierre completo = NATS accounts por + identidad, diferido) y los clientes deben `RefreshSession` tras cambios de + membresía (chat/worker aún no lo hacen). El comportamiento de un solo nodo no + cambia y master sigue verde. - v0.6.0 (2026-06-07) — descentralización / alta disponibilidad (issue 0003, fases 0003a–0003e), report 0006. El servidor NATS embebido gana soporte de cluster con routes autenticadas (secreto de cluster) y TLS mutuo de nodo diff --git a/dev/issues/0005-security-hardening-2.md b/dev/issues/0005-security-hardening-2.md index fe8611c..3744023 100644 --- a/dev/issues/0005-security-hardening-2.md +++ b/dev/issues/0005-security-hardening-2.md @@ -1,8 +1,9 @@ --- issue: 0005 title: Hardening 2 — CVEs, spoof por firma omitida, DoS por concurrencia, TLS forzado (re-auditoría) -status: spec +status: done created: 2026-06-07 +completed: 2026-06-07 domain: security scope: unibus (go.mod, pkg/client, pkg/membership/server.go, cmd/membershipd/config.go, pkg/embeddednats, pkg/blobstore) depends_on: 0001, 0004 (cierra los hallazgos NUEVOS de la re-auditoría sobre lo entregado)