MCP Fusion/Security and governance/Sicherheits-Pipeline
Sicherheits-Pipeline
Alle Schichten zwischen einem Agenten und Ihren Daten, in Reihenfolge: Eingangs-Firewall, strenge Validierung, Tenant-Middleware, Presenters, die Redaction-Engine, der Egress-Limiter, die Prompt-Firewall und die Sandbox.
MCP Fusion erzwingt Sicherheit als eine Pipeline von Schichten, jede mit einer klaren Position im Request. Diese Seite ist die technische Landkarte: was läuft, in welcher Reihenfolge, mit welchen Zusagen.
Die Reihenfolge, durchgängig
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 configuredSchicht für Schicht
Rate limiter
rateLimit({ windowMs, limit, keyFn }) ist eine Middleware mit einem gleitenden Fenster über Zeitstempel-Listen. Zwei Aufrufe zählen: increment() zählt ohne Aufzeichnung, und record() protokolliert nur akzeptierte Requests, damit abgelehnter Traffic das eigene Fenster nicht aufbläht. keyFn(ctx) ist der Identitäts-Hook: begrenzen Sie pro Token, pro Tenant oder pro User. Der Store ist ein Interface; der In-Memory-Store ist als Single-Process dokumentiert, Produktion nutzt Ihr Redis oder KV hinter demselben Interface.
Eingangs-Firewall
inputFirewall({ judge }) läuft nach der Zod-Validierung, vor Ihrem Handler. Die Argumente werden in einen Judge-Prompt serialisiert (Backticks neutralisiert, damit kein Fence-Escape gelingt), und ein austauschbarer SemanticProbeAdapter gibt { safe, threats } zurück. Bei !safe wird der Handler nie aufgerufen: die Antwort ist ein selbstheilendes toolError('INPUT_REJECTED', ...). Diese Schicht gilt für injektionsartige Eingaben: „ignoriere vorherige Anweisungen“, Exfiltrations-Payloads, eingeschleuste Dateipfade.
Presenter-Redaktion (die Egress-Firewall)
.redactPII(paths, censor?) kompiliert fast-redact-Pfade zu einer einzigen Funktion, gecacht auf dem Presenter. Die Pipeline-Reihenfolge in Presenter.make() ist präzise: kürzen, validieren, _select anwenden, die Wire-Daten klonen, maskieren, als String serialisieren, dann UI-Blöcke und Regeln aus dem vollständigen unmaskierten Objekt rendern. Folgen:
- der Modell-Text enthält nie maskierte Felder;
[REDACTED]ist für per_selectversteckte Schlüssel nicht einmal auf dem Wire ui.table()-Blöcke behalten reale Werte (sie werden aus dem vollständigen Objekt im Speicher gebaut, und der Wire-Text ist bereits eingefroren)- wirft
structuredCloneoder der Redaktor, wirft die Pipeline ebenfalls:Data withheld to prevent PII leak. Redaktion ist an dieser Stelle fail-closed.
fast-redact ist ein optionales Peer. Wenn es nicht installiert ist, degradiert der Redaktor zu einem No-op mit einer Konsolenwarnung. Behandeln Sie es als erforderliche Abhängigkeit für Connectors, die personenbezogene Daten halten.
Prompt-Firewall
Die Regeln selbst sind Angriffsfläche: dynamische Regeln werden aus Daten erzeugt, und Daten kommen aus der Welt des Agenten. presenter.promptFirewall({ judge }) sendet die akkumulierten Systemregeln an einen Judge, bevor auch nur eine von ihnen das Modell erreicht. Die Strategie ist fail-closed und pro Regel: wenn der Judge den Batch markiert, aber einige Regeln benennt, werden die unbenannten ebenfalls blockiert. Der Konsens-Modus (alle Judges stimmen zu) hat kein Fail-open. Ein konfigurierter Firewall erzwingt den asynchronen Pfad: make() wirft, makeAsync() ist der Vertrag.
Sandbox
sandboxed() auf einem Tool kündigt Delegierung von Berechnung an: Der Agent sendet eine JS-Pfeilfunktion, SandboxEngine führt sie in einem frischen isolated-vm-Kontext aus, wobei die Daten als externe Kopie injiziert werden, und nur der Rückgabewert kommt zurück. Defaults: 5s Timeout, 128MB Isolate, 1MB Ausgabe-Limit, 64KB Code-Limit. process, require, fs, globalThis und Buffer existieren im Kontext nicht; die Guard, die offensichtliche Muster ablehnt, ist nur DX und ausdrücklich nicht die Grenze. Bei Abbruch verwirft die Engine die Isolate (oder gibt nur den Kontext frei, wenn andere Requests ihn teilen) und erzeugt sie beim nächsten Aufruf neu.
Kill switch und Halt
Der Not-Aus lebt in der Konsole, siehe Connector policy: der globale Halt und die Richtlinie pro Connector. Auf dem Edge liefern gehaltene Connectors keine Aufrufe mehr, ohne dass neu deployt werden muss.
Was das Framework nicht tut
Ehrlichkeit vor Marketing: die Audit-Middleware des Frameworks emittiert Ereignisse an Ihre Sink (SHA-256-Argument-Digeste, Statusklassifikation, keine Signatur, keine Kette). Die fälschungssichere signierte Audit-Kette ist eine Vinkius-Cloud-Hosting-Funktion: deployen Sie mit mcpfusion deploy, und die Plattform protokolliert sie für Sie. Dieselbe Aufteilung gilt für Rate-Limit-Stores: das Interface ist Ihres, der Edge betreibt es.
Nächste Schritte
- Runtime architecture: wo jede Schicht in der Engine sitzt
- Governance: nachweisen, dass die Pipeline verriegelt blieb
- Tools: Guards an ein Tool anhängen
