Skip to content

Threat model

Assets and actors

Protected assets are upstream credentials, the LLM key, dashboard sessions, API keys, customer order data and store mutations. Actors are an administrator, a member, an unauthenticated network client, an untrusted MCP server and a compromised pod. Cluster administrators are outside the application isolation boundary.

Threat Control Remaining limitation
Member invokes an administrator tool by name Same permission predicate filters listing and checks execution Admins intentionally have access to all registered tools
Revoked key continues on an open MCP connection Database authentication on each request, including delegated sessions Already dispatched operations may finish
One member reads another member's records or confirmation Audit query ownership and session-bound one-use confirmations Members intentionally share permitted store data
Tool target or permissions change while chat waits Target-bound calls and confirmations; current authority checked again before dispatch; automatic chat calls must remain read-only A change after dispatch cannot undo an upstream operation
Untrusted schema retrieves data or exhausts resources Local references only, empty retrieval registry, bounded JSON input, killable worker with a two-second deadline and Linux address-space limit Windows development has deadline/input guards; deployment and memory-budget verification use Linux containers
Upstream steals a client credential User keys and cookies are never forwarded upstream; only that upstream's configured credential is attached An upstream sees its own credential and authorized arguments
Server registration targets metadata or internal systems Public HTTPS validation, exact internal allowlist, DNS validation at connect time, numeric-address connection and blocked redirects Operator-approved internal hosts are trusted; gateway compromise bypasses application checks
Upstream tool description manipulates the LLM Descriptions/results treated as untrusted; role enforcement outside model; write confirmation; no secrets in model context Prompt injection cannot be eliminated; an authorized user can still approve a bad action
Slow upstream consumes gateway capacity Bounded discovery, per-upstream concurrency, deadlines and result limits A single-node system still has finite shared CPU and memory
Tool arguments or result contain HTML/script React escapes displayed text; no arbitrary upstream HTML rendering External clients control their own rendering behavior
Password guessing or abusive traffic Argon2 passwords, two shared hashing slots, synchronized rate limits using trusted ingress client identity, request size limits Limits are process-local; NAT clients may share an address; this is not a DDoS protection service
Secret leaks via repo, Helm values, browser or logs Ignored local secret files, referenced Kubernetes Secrets, raw and JSON-escaped credential redaction, write-only credential UI; invitation query strings excluded from access logs and referrers Host owner and cluster administrators can read secrets
Gateway pod obtains cluster control Service account can only read/patch one named credential Secret Gateway compromise still exposes all credentials in that Secret
Pod bypasses gateway Internal-only services, bearer credentials and enforced NetworkPolicies Node compromise or cluster-admin privileges defeat pod isolation
Duplicate write after a lost response No automatic retry, explicit uncertain-outcome error, optional unique SKU reconciliation No distributed exactly-once guarantee

Shared credential implications

A member can read every store record permitted by the gateway even though they never see the store's credential. Hiding a credential alone is not authorization. Tool policies limit what the gateway will execute. Unknown tools default to administrator-only until reviewed. The demo policy permits members to read products and orders and use policies and shipping estimates. Only admins can create products or update orders.

Gateway keys identify users at the gateway only. Passing them through would expose a reusable team credential to every upstream and blur which service is responsible for authorization. An upstream instead receives its own separately configured static credential. The audit log records the originating user before the upstream call.

Operational boundaries

The sample store contains synthetic data. Free LLM provider terms may allow submitted content to improve products. Production operators must evaluate provider terms and minimize customer data before using a free tier with real customers.

Local HTTP is limited to development. Production values require TLS at ingress and secure cookies. Internal HTTP and database links are not encrypted by a service mesh. Kubernetes Secret encryption protects datastore contents at rest, not credentials read by a running authorized process.

Keep dependencies pinned, restrict public registration of untrusted servers, review newly discovered tools, rotate credentials after suspected compromise and back up all persistent data. Do not expose local test fixtures or use the local values on a public server unchanged.