Skip to content
Tracon

Threat model

Tracon is a control plane: it holds agent definitions, session content, tool call authority, and the credentials that reach model providers and MCP servers. That makes it a security boundary in its own right, not just a caller of one. This page names the attackers a deployment should assume, the assets they go after, which boundary stops each combination, and — just as important — which combinations nothing stops today.

flowchart LR
    accTitle: How this page is organized
    accDescr: An attacker profile targets an asset. Either an existing boundary refuses the attempt, or the combination is not closed today and is named as an accepted risk instead of left silent.
    A["Attacker profile"] --> M["Attacker x asset"]
    B["Asset"] --> M
    M --> C{"Refused by a boundary?"}
    C -->|"yes"| D["One of the 14 boundaries"]
    C -->|"no"| E["Named accepted risk"]

Seven profiles. The last two do not come through Tracon’s own API at all — a meaningful share of the risk in a system like this comes from people who already have some form of legitimate access.

Profile Description
Unauthenticated network caller Reaches a Tracon route with no token, API key, or policy
Low-privilege tenant user Authenticated, holds Reader or Operator, tries to reach another session or an Admin-only action inside their own tenant
Another tenant’s user Authenticated, but belongs to a different tenant than the one they target
Content carried through a tool result Text arriving through a tool’s output, a fetched file, or an MCP resource that behaves like an instruction (prompt injection)
A malicious MCP server A remote server Tracon connects to, abusing the tools or resources it advertises, or the content it returns
An operator with console or API access A legitimately authorized identity, acting outside — deliberately or accidentally — what that authorization was meant to cover
Someone with direct database read access A stolen backup, a misconfigured grant, a decommissioned disk — reads storage without ever going through Tracon’s HTTP surface

What an attacker in the table above is after:

  • Secrets — provider API keys, webhook and MCP signing values
  • Tenant data — agent definitions, tenant settings, approval rules, provider bindings
  • Session content — prompts, responses, tool arguments and results, attachments
  • The audit trail — the record of who did what, and the state before and after
  • Tool call authority — the right to invoke a specific tool with specific arguments
  • Model budget — request rate and spend ceilings
  • Script execution rights — running a skill script on the server

The boundaries a deployment gets by using Tracon as designed. Configuring any one of them is covered in Securing the endpoints; this table is the complementary question — which boundaries exist, and what each one refuses.

Boundary What it refuses
Endpoint access An unauthenticated or unauthorized caller
Tenant isolation Reading or writing another tenant’s rows
Session ownership Continuing a conversation the caller does not own
Tool authorization A tool call the caller is not entitled to make
Tool approval An unapproved tool call, until a human decides
Tool definition A tool written from the console — tools exist only in code
Script execution gates A skill script starting without a grant or with an interpreter off the allowlist, or a stored or code-defined one starting after its content changed since the grant
Outbound egress A request to a private network target or a disallowed host
Tenant provider policy A tenant’s data reaching a model, speech, live voice or image provider its egress policy does not name, or a call billed to the shared key while the tenant has its own
Content guards Input or output a configured guard rejects
Secret handling A secret value reaching storage, a log, or a response
At-rest protection Readable content in a database you do not fully trust
Audit trail Seven operations proceeding without their record
Quotas and rate limits Spend and request volume above the configured ceiling
Production profile A host starting with a security decision never made

Most of these boundaries run inside the ASP.NET Core request pipeline. Someone with direct database read access never enters that pipeline, so only two of the fifteen — secret handling and at-rest protection — reach them at all.

A threat model is only honest if it says what it does not close. These are not defects; they are named so a deployment can make an informed call.

Turning on RequireProductionProfile() forces a deployment to answer — or explicitly accept, by name — the risks that a permissive default otherwise leaves open: single-tenant mode, unowned sessions, unencrypted content at rest, uninspected content, unlimited request rate, and unbounded retention.