Reference
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"]
Attacker profiles
Section titled “Attacker profiles”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 |
Assets
Section titled “Assets”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
Boundary mapping
Section titled “Boundary mapping”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.
Accepted risks
Section titled “Accepted risks”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.
Read next
Section titled “Read next”- Securing the endpoints — the layers you configure
- Security policy — reporting a vulnerability, and scope
- Governance — audit trail, quotas, tenancy