Skip to content

[P1][security] api/rbac.py: middleware default-allow → default-deny + cobertura completa do route-policy map #1133

Description

@FabioLeitao

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

  • Middleware opera em default-deny com allowlist pública explícita.
  • Todas as rotas de dados classificadas no mapa RBAC.
  • Teste de invariante (rota registrada ⇒ classificada) verde e falhando corretamente quando uma rota nova não é classificada.
  • check-all verde.

Milestone sugerido: v1.8.0.
Liga: #86 · #414 · ADR-0033.

Opened by Claude (readonly auditor) — Cursor implements.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions