Kirto Gate

What it stops, and where that stops.

Eleven threats, grouped by where the text arrives, each with the asset, who writes it, the control and its limit. Then the eleven things Gate does not defend against, checked by the build against the threat model that ships with the binary.

11 entries, grouped by where the text arrives, because that decides which control can reach it. Each carries the asset at risk, who writes the text that puts it there, what Gate does, and where that ends. Every entry is a fact from the threat model that ships with the binary. Where this page and that one disagree, this page is the one that changes.

In the content

Text a person, a record or a tool's reply put into the request. The detectors read it inside the process holding the connection, before the provider sees it.

Personal data leaves

asset
a customer's identifiers
who writes it
your users, your records, a tool's reply
where it arrives
request body, response stream

Pattern and model detectors, seven operators, and restore lists for the tools Gate dials.

limitThe shapes it knows. No paraphrase, no encoding, no coreference.

Prompt injection

asset
the instructions the assistant follows
who writes it
an outsider, in a user turn or in a page a tool fetched
where it arrives
user and tool_result segments, by default

A classifier or an LLM judge, denying or annotating, run in shadow until the false-positive rate has been read.

limitReduces and does not prevent. A judge reads exactly the text the attacker wrote.

A guard blind in your language

asset
the deny rule's false-positive rate
who writes it
ordinary customers, in a script the checkpoint never saw
where it arrives
every inspected segment

Invariance measured across ten languages before a checkpoint is pinned.

limitArabic recall is unmeasured beyond eight turns, and most languages are unrun.

A secret in the prompt

asset
API keys and tokens
who writes it
your users, pasting
where it arrives
body; header and query when named

19 credential recognizers, on by default. Headers and the query string are inspectable and deliberately read-only.

limitA placeholder wearing a key's shape matches. A format nobody published does not.

At the tool call

The model wrote this text, prompted by whatever it read on the way. The rule runs at the hop the call leaves by, before anything is dialled.

A tool call the agent should not make

asset
what a tool does with the argument it is handed
who writes it
the model, acting on text it was given
where it arrives
tool name and arguments at the MCP hop; message parts at the A2A hop

An access rule at that hop over the caller and the call, and guardrails over the arguments and the result.

limitA tool Gate does not dial. An agent that reaches a server directly is ungoverned.

An upstream that sees the gateway and never the person

asset
the upstream's own idea of what each person may read
who writes it
the caller, under a token their identity provider issued
where it arrives
the credential Gate sends at the MCP hop

Token exchange with the issuer, so the upstream is handed a token minted for that person and that target.

limitMCP servers only, one hop, and no chain of agents acting for each other.

A server nobody approved

asset
which servers agents connect to
who writes it
a team, publishing
where it arrives
the registry a host takes a URL for

Gate serves the registry, and every connect URL in it is Gate's own door.

limitNot a package index. A package a host installs and runs itself has no endpoint to put policy in front of.

On the route

No text arrives here. What is at risk is what the deployment was measured with, when the endpoint that answers preserves less than the one that was measured. The decision is made during resolution, before the request is forwarded.

A route that quietly preserves less

asset
the behaviour you validated, and the capabilities it rested on
who writes it
no one writes it; a translated path, a failover candidate, a pool member
where it arrives
resolution, before the request leaves

Passthrough whenever a provider speaks the request's dialect. A translation that would drop a capability the request uses is refused by default, and every downgrade is counted.

limitNo claim about a vendor's compatibility endpoint. It is passed the bytes, and what it keeps is in the vendor's documentation.

On the account

No text arrives here. What is at risk is the provider account Gate holds credentials for, and the claim that every call on it went through Gate.

Traffic around the gateway

asset
the claim that everything goes through it
who writes it
a colleague with the same key, a key minted in the same organisation
where it arrives
the provider's account, outside Gate

A second ledger from the provider's usage API, judged against Gate's own per day and per token class.

limitProviders that publish a usage API, daily, with no attribution to a key, a model or a route. Nothing in a browser.

Credential sprawl

asset
the provider's API key
who writes it
your own clients
where it arrives
client configuration

Clients hold Gate-issued keys. The provider key is swapped in after every mutation and never sent downstream.

limitA client that still holds the provider key can keep using it. The swap protects the clients that came through the door.

Unbounded spend

asset
the bill
who writes it
your own clients, concurrently
where it arrives
every forwarded request

Cost is reserved before the request is forwarded and settled against real usage after it.

limitA hold is taken per gateway. Spend on the same provider key outside it is neither reserved nor settled.

What it does not defend against

Checked by the build against the threat model: a limit named here that the threat model no longer names, or one it names that is missing here, fails the build.

  • A determined exfiltrator. Pattern detection finds structured data in the shapes it knows. Paraphrase, base64, an unusual encoding or a description of a secret pass. These guardrails stop accidents and produce evidence. An adversary with time is a different problem.
  • Prompt injection and jailbreaks. Two detectors cover them and both reduce the risk without preventing it. A classifier catches the phrasings it was trained on and fires on prose about security. A judge reads exactly the text the attacker wrote, and a model that follows instructions can be told what to answer.
  • Anything the gateway never sees. Traffic on the same provider key that does not traverse Gate is ungoverned. Reconciliation exists to detect that, on providers that publish a usage API. Nothing prevents it.
  • A compromised gateway host. Provider credentials are in memory. A host with an attacker on it is over.
  • Whoever can write the configuration. Policy, roles and rules are file-owned, so whoever can change that file, or restart the process against a different one, holds the highest privilege in the deployment. There is no built-in super-admin, because it would be a second escape beside that one.
  • Whoever holds the cluster secret. The nodes talk over mutual TLS under a certificate authority derived from the cluster secret. A holder of the secret can mint a certificate for any node name, join the cluster, and read every replicated document that is not sealed.
  • Whoever holds the unsealing material. The cluster secret, and any key-encryption file wrapping a key, decrypt everything the barrier sealed. No policy in Gate constrains them.
  • A stolen Kubernetes credential in the operator's pod. The operator and the InferencePool controller are the only components holding one. The grant is get on a Credential's Secret in the watched namespaces, with no list, patch, watch or delete. That bounds what the credential reaches and leaves the exposure in place.
  • Model output correctness. Not a security control and not claimed as one.
  • Bodies it could not read. Over max_body_bytes, unparseable, or a response whose content type is neither JSON nor SSE. Each is counted in kirto_gate_guardrail_uninspected_total, never assumed clean. Alert on it.
  • Entities split across frames of an unknown streaming API. On a route the segmenter has no dialect for, each SSE frame is read on its own. A match spanning two frames is missed. Assembling them would invent entities spanning two unrelated messages, which is the worse error.

What is never written down

Prompt content is not retained. The threat model gives four ways to check that claim: what no log statement carries, what traces omit, what the store schema has no column for, and what explanation traces keep. It also names the two exceptions. See Prompt content is not retained.

The full model

The threat model has the assets table, the trust boundaries in configuration, the failure behaviour of every detector and every rule, and what each deployment shape changes. For a vendor security review, the threat model disclosure arranges the same facts as trust boundaries, a STRIDE map and residual risk. Deployment requirements says what the process needs and what it refuses to start without.

More in Gate