U: U1 — a camada de acesso baseada em papéis (Pro+) precisa estar íntegra antes do trabalho da 1.8.0 aterrissar em cima dela (o gate de POST /config do #414 e o WebAuthn dependem dessa base).
G: G2 — weakness funcional/de compliance no controle de acesso. A postura default de bind loopback (127.0.0.1) mitiga a exposição real; o risco materializa em deployments que expõem o dashBOARd e dependem de RBAC como camada de acesso.
Contexto (auditoria 2026-07-02)
O middleware de RBAC (api/rbac.py) resolve a política de acesso a partir de um mapa explícito de rotas protegidas. Rotas que não constam nesse mapa seguem adiante sem verificação (postura default-allow / fail-open). O efeito é estrutural: qualquer rota nova que sirva dados e seja registrada sem entrada correspondente no mapa fica silenciosamente fora da política, sem sinal em CI ou em runtime.
RCA detalhado (rotas afetadas, trechos) está no thread privado da auditoria — este corpo público fica genérico por política de disclosure (repo público).
Fix recomendado
- Inverter a postura para default-deny: manter uma allowlist pública explícita (health, estáticos, etc.) e exigir que toda rota não-pública esteja classificada no mapa RBAC; o não-classificado nega (403) em vez de liberar.
- Garantir cobertura de todas as rotas que servem dados no mapa de política.
- Adicionar teste de invariante: toda rota registrada no app ∈ (allowlist pública ∪ mapa RBAC). O teste falha o CI quando uma rota nova entra sem classificação — fecha o gap na origem.
Não fazer
- Não alterar o comportamento quando o RBAC está desabilitado (default OSS/gratuito) — o escopo é a coerência da política quando o RBAC está ativo.
- Não bloquear rotas públicas de infraestrutura (health/liveness/estáticos).
Critérios de aceite
Milestone sugerido: v1.8.0.
Liga: #86 · #414 · ADR-0033.
Opened by Claude (readonly auditor) — Cursor implements.
U: U1 — a camada de acesso baseada em papéis (Pro+) precisa estar íntegra antes do trabalho da 1.8.0 aterrissar em cima dela (o gate de
POST /configdo #414 e o WebAuthn dependem dessa base).G: G2 — weakness funcional/de compliance no controle de acesso. A postura default de bind loopback (
127.0.0.1) mitiga a exposição real; o risco materializa em deployments que expõem o dashBOARd e dependem de RBAC como camada de acesso.Contexto (auditoria 2026-07-02)
O middleware de RBAC (
api/rbac.py) resolve a política de acesso a partir de um mapa explícito de rotas protegidas. Rotas que não constam nesse mapa seguem adiante sem verificação (postura default-allow / fail-open). O efeito é estrutural: qualquer rota nova que sirva dados e seja registrada sem entrada correspondente no mapa fica silenciosamente fora da política, sem sinal em CI ou em runtime.Fix recomendado
Não fazer
Critérios de aceite
check-allverde.Milestone sugerido: v1.8.0.
Liga: #86 · #414 · ADR-0033.
Opened by Claude (readonly auditor) — Cursor implements.