MCP Fusion/Security and governance/Pipeline de segurança

Pipeline de segurança

Pergunte à IA sobre a Vinkius

Todas as camadas entre um agente e seus dados, em ordem: firewall de entrada, validação estrita, middleware de tenant, Presenters, o motor de redação, o limitador de egresso, o firewall de prompt e o sandbox.

O MCP Fusion aplica segurança como um pipeline de camadas, cada uma com uma posição clara na requisição. Esta página é o mapa técnico: o que roda, em que ordem, com que garantias.

A ordem, de ponta a ponta

1 contextFactory      tenant and identity resolution
2 rate limiter        sliding window, key from ctx
3 input firewall      LLM-as-Judge on the arguments
4 validate            strict Zod per action, unknown keys rejected
5 middleware chain    auth, audit, custom, precompiled and frozen
6 handler             your business logic
7 Presenter           schema shape → _select → redact → serialize
8 rules and UI        computed on the full object, never on the wire copy
9 egress guard        byte budget on the text response
10 audit + telemetry  every stage emits if a sink is configured

Camada por camada

Rate limiter

rateLimit({ windowMs, limit, keyFn }) é um middleware que usa uma janela deslizante sobre listas de timestamps. Duas chamadas importam: increment() conta sem registrar, e record() só grava requisições aceitas, então tráfego rejeitado não pode inflar a própria janela. keyFn(ctx) é o gancho de identidade: limite por token, por tenant ou por usuário. O store é uma interface; o store em memória é documentado como válido só para um processo, e a produção usa o seu Redis ou KV atrás da mesma interface.

Firewall de entrada

inputFirewall({ judge }) roda depois da validação Zod e antes do seu handler. Os argumentos são serializados em um prompt de julgamento (crases neutralizadas para impedir escape de fence), e um SemanticProbeAdapter plugável devolve { safe, threats }. Se !safe, o handler nunca é chamado: a resposta é um toolError('INPUT_REJECTED', ...) autorreparável. Esta camada é para entradas em forma de injeção: "ignore as instruções anteriores", payloads de exfiltração, caminhos de arquivo contrabandeados.

Redação do Presenter (o firewall de egresso)

.redactPII(paths, censor?) compila caminhos fast-redact em uma única função, armazenada em cache no Presenter. A ordem do pipeline dentro de Presenter.make() é precisa: truncar, validar, aplicar _select, clonar os dados do wire, mascarar, serializar em string, e então renderizar blocos de UI e regras a partir do objeto completo sem máscara. Consequências:

  • o texto do modelo nunca contém campos mascarados; [REDACTED] nem chega ao wire para chaves ocultas por _select
  • os blocos de ui.table() mantêm os valores reais (são construídos a partir do objeto completo em memória, e o texto do wire já está congelado)
  • se o structuredClone ou o redator lançar um erro, o pipeline também lança: Data withheld to prevent PII leak. A redação é fail-closed nesse ponto.

fast-redact é um peer opcional. Se não estiver instalado, o redator degrada para um no-op com um aviso no console. Trate-o como dependência obrigatória para conectores que guardam dados pessoais.

Firewall de prompt

As próprias regras são superfície de ataque: regras dinâmicas são geradas a partir de dados, e os dados vêm do mundo do agente. presenter.promptFirewall({ judge }) envia as regras de sistema acumuladas a um juiz antes que qualquer uma delas chegue ao modelo. A estratégia é fail-closed e por regra: se o juiz sinaliza o lote mas nomeia algumas regras, as não nomeadas também são bloqueadas. O modo de consenso (todos os juízes concordam) não tem fail-open. Configurar um firewall força o caminho assíncrono: make() lança, makeAsync() é o contrato.

Sandbox

sandboxed() em uma tool anuncia delegação de computação: o agente envia uma função de seta JS, o SandboxEngine a executa dentro de um contexto isolated-vm novo, com os dados injetados como cópia externa, e só o valor devolvido volta. Padrões: timeout de 5s, isolate de 128MB, limite de saída de 1MB, limite de código de 64KB. process, require, fs, globalThis e Buffer não existem dentro do contexto; a guarda que rejeita padrões óbvios é só DX e explicitamente não é a fronteira. No cancelamento, o engine descarta o isolate (ou libera só o contexto quando outras requisições o compartilham) e o recria na próxima chamada.

Kill switch e halt

A parada de emergência fica no console, veja Connector policy: o halt global e a política por conector. No Edge, conectores barrados param de servir chamadas sem um novo deploy.

O que o framework não faz

Honestidade acima de marketing: o middleware de auditoria do framework emite eventos para o seu sink (digests SHA-256 dos argumentos, classificação de status, sem assinatura, sem cadeia). A cadeia de auditoria assinada e à prova de adulteração é um recurso de hospedagem do Vinkius Cloud: faça deploy com mcpfusion deploy e a plataforma registra isso por você. A mesma divisão vale para os stores de rate limit: a interface é sua, o Edge a executa.

Próximos passos