Ga naar inhoud

Agent-kanalen

Een LLM-agent leest e-mails, roept tools aan, krijgt MCP-toolschema’s te zien en schrijft naar geheugen. Dat zijn de kanalen waarlangs indirecte prompt-injectie, MCP tool poisoning en geheugenvergiftiging binnenkomen. De gebruikersprompt is daarbij vaak volkomen onschuldig.

monsys inspecteert die kanalen niet inline en blokkeert niets (zie de drie invariants). Het legt vast wat de agent te lezen kreeg, gehasht en geredacteerd, en maakt er twee deterministische signalen van: injectie-indicatoren en schema-drift. Een mens oordeelt.

Vier getypeerde events op een span van de bestaande SDK-envelope; de exacte velden staan in de envelope-spec.

Event Wanneer
tool_call de agent roept een tool aan (naam + argumenten)
tool_result een tool geeft iets terug dat het model te lezen krijgt
mcp_schema een MCP-server toont een toolbeschrijving en input-schema
memory_write de agent schrijft iets naar lang-termijngeheugen

De SDK’s hebben er helpers voor (span.tool_result(...), span.mcpSchema(...), s.MemoryWrite(...)). De hub past dezelfde redactie toe als op prompts: PII wordt vervangen door een gelabelde hash-token, en in de database staat alleen de sha256 plus metadata.

Op alles wat het model te lezen krijgt (tool-resultaten, schema’s, geheugen) draaien elf benoemde regexes. Geen model, geen score: een treffer is een label op het event.

Indicator Waar het op let
ignore_previous “ignore/disregard previous instructions”
role_override “you are now …”, “new instructions:”
system_prompt_exfil “reveal/print the system prompt”
tool_invocation “call/invoke/run the … tool/function/api”
secrecy “do not tell the user”
hidden_html HTML-commentaar met instructies
zero_width onzichtbare Unicode-tekens
markdown_exfil afbeelding-link met querystring naar een extern domein
shell_pipe curl … | sh
prompt_delimiters [INST], <<SYS>>, ### system
base64_blob lange base64-reeks

Een treffer maakt een melding ai_injection in de actie-inbox (kritiek bij tool_invocation, shell_pipe, markdown_exfil of drie of meer indicatoren tegelijk; anders waarschuwing). De melding vertelt welke tool of bron het was en verwijst naar de trace. Jij beslist of de bron te vertrouwen is; monsys verandert niets aan de agent.

Tool poisoning is per definitie een wijziging van de toolbeschrijving. monsys houdt per (app, server, tool) een canonieke sha256 bij van beschrijving + input-schema. Verandert die, dan:

  1. komt er een rij in het wijzigingslog met oude en nieuwe hash;
  2. verschijnt melding ai_mcp_drift in de inbox (en als push);
  3. telt de wijziging als configuratie-drift in de Trust Score (5 punten per open wijziging, maximaal 30, tenant-breed) tot je ze bevestigt.

Bevestigen doe je in het portaal (AI → Agent-kanalen → Bevestig als bedoeld) of via POST /api/v1/ai/mcp-schemas/ack. Een bedoelde update van een tool is dus één klik; een onverwachte blijft zichtbaar.

  • AI → Agent-kanalen: tellers per soort (30 dagen), het schema-register met drift-status, de events met indicator-chips.
  • Actie-inbox en app: de meldingen ai_injection en ai_mcp_drift.
  • Evidence pack: agent_events.jsonl (elk event met hash en indicatoren) en mcp_schemas.json (register + wijzigingen in de periode), beide met hun sha256 in het Ed25519-gesigneerde manifest.
  • API: GET /api/v1/ai/agent-channels/summary, GET /api/v1/ai/agent-events?indicators=1, GET /api/v1/ai/mcp-schemas.

De Claude Connector is zelf een agent-kanaal. Daarom geeft tools/list een _meta mee: de sha256 van de canonieke toolcatalogus, een Ed25519-handtekening met de hub-sleutel en de entry in het transparency log (kind = mcp.tool_catalog). Wie de hash bewaart, kan later aantonen welke toolbeschrijvingen Claude te zien kreeg; een gewijzigde catalogus is een nieuwe, publieke log-entry.

Geen firewall, geen LLM-as-judge, geen blokkade in het request-pad en geen scan van trainingsdata. Wil je enforcement, koppel dan je eigen gate op onze webhook; monsys levert het bewijs dat een auditor onder AI Act art. 15 en NIS2 art. 21 kan verifiëren.