Skip to content

security(mcp): aplicar auth e isolamento deny-by-default - #37

Merged
neomaike merged 11 commits into
mainfrom
security/792-mcp-boundary
Jul 30, 2026
Merged

neomaike merged 11 commits into
mainfrom
security/792-mcp-boundary

Conversation

@neomaike

Copy link
Copy Markdown
Contributor

Resultado

Implementa o limite deny-by-default da LexNotify-Web #792, empilhado sobre o PR #36 (#793).

Ordem dos controles

authn → authz projeto/tenant/tool → input/path → freshness → execução read-only → redaction/limite → auditoria metadata-only.

Um chamador não autorizado não recebe SHA, contagem ou freshness.

Implementado

  • tokens HMAC-SHA256 locais/sanitizados com kid, expiração, JTI, revogação e rotação;
  • autorização explícita por projeto, tenant e allowlist de tool;
  • ausência, invalidez, expiração, revogação e rate limit com códigos estáveis;
  • tenant Avancard/Fênix representado por claim exata avancard-fenix;
  • slug ADR ASCII estrito, canonicalização e bloqueio de traversal/symlink escape;
  • conteúdo de repositório marcado como não confiável e nunca tratado como instrução;
  • redaction recursiva, limite de resposta e correlation ID;
  • auditoria sem token/payload/conteúdo;
  • sete tools existentes protegidas, sem criar tool nova ou mutável;
  • ADR de threat model, matriz, compatibilidade, limitações e rollback.

Compatibilidade

Os sete nomes de tools permanecem. Parâmetros de auth/tenant são opcionais no schema para clientes antigos conseguirem interpretar o contrato, mas sua omissão falha fechada. get_adr agora retorna envelope estruturado em vez de texto cru.

Evidência

  • segurança: 8 passed;
  • freshness: 17 passed;
  • lifecycle: 11 passed;
  • suíte completa empilhada: 106 passed;
  • git diff --check: limpo;
  • diff próprio: 5 arquivos, +538/-27.

Cobertura: credencial ausente/inválida/expirada/revogada, rotação, projeto/tenant/tool incorretos, ordem auth-before-freshness, rate limit, traversal, absoluto, NUL, Unicode, symlink, prompt injection armazenada, segredo simulado, response limit e auditoria.

Fora de escopo

Transporte remoto/TLS, identidade corporativa, credenciais reais, deploy/rollout, timeout/carga distribuída (#795), novas tools (#794).

Rollback

Reverter este PR. Transporte remoto permanece desabilitado; não há migration, dado ou produção afetados.

@neomaike

Copy link
Copy Markdown
Contributor Author

Checkpoint de revisão Fase 4

Este PR foi revisado na base empilhada exata e permanece draft/mergeável, sem review humano ou thread pendente. A pilha combinada termina em 2bfa8edd67a0c8125a4b793c99d7c5c452ed56d2; o envelope de CI #40 termina em f9a1f11c5e9e664d1a709420685b757899fd99a7.

CI combinada: Python 3.10/3.12 e dependency audit/SBOM verdes no run https://github.com/MHX-Digital/agent-architecture-kit/actions/runs/30477544972. Validação local final: 123/123, secret scan 0 matches, compileall/diff check verdes.

Correções foram mantidas no PR que introduziu o comportamento: binding explícito do golden corpus ao commit no #32; fronteira autenticada sanitizada do corpus no #37. Nenhum gate foi relaxado.

Estado: implementado/testado; aguardando revisão humana; não integrado; não implantado. Rollback por revert dos commits da unidade, sem mutação de índice ou ambiente externo.

@neomaike
neomaike changed the base branch from feat/793-atomic-index to main July 30, 2026 18:10
@neomaike
neomaike marked this pull request as ready for review July 30, 2026 18:11
@neomaike
neomaike merged commit f2e7319 into main Jul 30, 2026
@neomaike

Copy link
Copy Markdown
Contributor Author

Integração ordenada concluída — 2026-07-30 UTC

main avançou de 63921de34f5265f7c3cb7c45de2df9f43872e932 para 926130c7c9c1e54a6508c5a0cf30f3c012cb6f30.

Unidade Head revisado Merge resultante
PR #32 / #791 2e5a9f992c78b20420ea120d92072feeb7d1931e 02886de9f167eca9df389ef6a4dfa355084ff9c8
PR #36 / #793 39f37d69e75c006ef270b31fdbefe286d599c75f e5e919520741b2c61cb39c17cee451fe0385ed56
PR #37 / #792 10556be22914d540142e1044c098c86526fc3b1f f2e731925d59ef191d78cffa6e7099bd587edce5
PR #40 / #39 f9a1f11c5e9e664d1a709420685b757899fd99a7 46b58ccddd0a853817a0f927181080d667ee2a8d na branch #38
correção PR #45 / #39 bc421de2a8fa099284bf920796fcf525b17f2c85 84116f861aaab875e23ff50824e302f21fe44e99 na branch #38
PR #38 / #795 84116f861aaab875e23ff50824e302f21fe44e99 926130c7c9c1e54a6508c5a0cf30f3c012cb6f30 em main

O #40 já havia sido empilhado no #38; portanto seu conteúdo chegou a main pelo merge final do #38. Nenhum force push, bypass de proteção, deploy ou alteração do LexNotify foi realizado.

Validação no SHA final

Run manual exato: https://github.com/MHX-Digital/agent-architecture-kit/actions/runs/30570028307

  • Python 3.10: verde, 123 testes, 0 falhas;
  • Python 3.12: verde, 123 testes, 0 falhas;
  • dependency audit: verde;
  • sete suítes explícitas locais: 70/70;
  • suíte completa local: 123/123;
  • secret scan: 79 arquivos, 0 matches;
  • schemas, manifestos, compileall e whitespace gate: verdes;
  • as sete tools existentes permanecem nominalmente cobertas.

Artefatos novos, vinculados somente ao SHA final

  • arquivo Git determinístico: c9cb996338ce33d0e8895b83d98aeffcc4ea10d2d1908ad44b4aabc79541299c;
  • SBOM CycloneDX 1.4 (34 componentes): 4005c8a4937f996d4da87448249c85b4158d4325d28cf992fc6959b5f4583bcd;
  • JUnit Python 3.10: 5402ac5a8a407229045e06120dadcec03bfc03c02021a2946043c0238442da64;
  • JUnit Python 3.12: 18750397c61ef086c02babb33a3ae50174e88e79ce61550656181525039d56d7.

Os artefatos da RC anterior não foram reutilizados ou reatribuídos.

Estado: integrado e validado localmente/na CI; não implantado; canário não executado. Próximo gate: autorização humana explícita para o canário sanitizado.

neomaike added a commit that referenced this pull request Jul 30, 2026
…s added since PR #42

PRs #37 (auth) and #32/#36 (index freshness) merged into main after this
test file was written. The mcp_repo fixture now inits a real git repo and
commits it so ARCHITECTURE_MAP.json's sourceSha can match HEAD, and every
tool call passes expectedCommit accordingly. get_adr()'s return shape also
changed to a trust-wrapped dict; updated the two assertions that relied on
the old plain-string return.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant