Agentic Zero Trust

shield

Bidirectional Zero Trust

Traditional Zero Trust assumes threats come from outside the perimeter. Agentic Bidirectional Zero Trust recognises the model itself as an untrusted actor inside it. The agent is a delegate, not a trusted service account: it holds its own identity, acts on a user's behalf under a scope narrower than that user's own, and every action is verified at invocation rather than at session start.

verified_user

Core Principles

block

Never Execute Because the Model Said So

Model output is a suggestion, not an instruction. No action should proceed solely because the model requested it. Every tool call, API request, or state change requires independent authorisation from the control plane, not from the model's reasoning.

lock_open

Gate Per-Action, Not Per-Session

A session-level approval does not grant blanket permission for all subsequent actions. Each individual action must be evaluated against the current policy context. Permissions are checked at invocation time, not at session start.

help_outline

Treat Confidence as Untrusted

When a model reports high confidence, treat it as unverified. Confidence scores from language models are not calibrated probabilities. They reflect token likelihood, not factual certainty. Build verification into the pipeline rather than relying on the model's self-assessment.

monitoring

Monitor Patterns, Not Just Calls

Individual tool calls may each appear benign while the sequence reveals adversarial intent. Monitor for behavioural patterns: unusual call ordering, data exfiltration sequences, privilege escalation chains, and systematic probing of boundaries across multiple turns.

warning

Assume Compromise at Any Time

Treat every model invocation as potentially compromised by prompt injection, training data poisoning, or adversarial inputs. The model may be acting in good faith or it may be manipulated. Your architecture should produce correct outcomes in both cases.

safety_check

Design for Graceful Failure

When the trust boundary is breached, the system should degrade safely rather than catastrophically. Denied actions should produce clear feedback. Blocked sequences should not corrupt state. The user should always be able to understand what happened and why.

badge

Identity and Delegation

"The agent inherits user permissions" is the easiest sentence to write and the hardest to implement. Inheritance by default means the agent runs as the user, which makes its actions indistinguishable from theirs and independently unrevocable. Delegation is the primitive that makes the rest of the model enforceable.

badgeDistinct Agent Principal

The agent authenticates as itself, not as the user. Its actions are attributable to it, and it can be suspended without suspending the person it works for.

Without it: The audit log shows the user performing actions they never requested, and the only way to stop the agent is to disable the account.

swap_horizOn-Behalf-Of Tokens

Credentials carry both identities: which user authorised the work and which agent is doing it. Authorisation is the intersection of the two rather than the union.

Without it: The agent acts with the user's full authority, so any compromise immediately reaches everything that user can reach.

filter_altScope Narrowing per Hop

Each delegation issues a narrower token than the one it received. An agent handing work to a sub-agent passes less authority, never the same or more.

Without it: Authority accumulates down the call chain, and the deepest, least supervised component holds the broadest permissions.

timerShort Credential Lifetimes

Tokens live for minutes and are bound to the task that requested them. A credential lifted out of a context window expires before it is worth much.

Without it: Any leak through a log, an error message or a model response stays exploitable for as long as the credential lives.

account_treeAttribution Chain

Every action records the agent, the authorising user, the policy version in force, and the input that triggered it. Reconstruction after an incident depends entirely on this.

Without it: You can see that something happened and never establish why it was permitted or what caused it.

key_offNo Ambient Authority

Nothing is available simply because of where the agent runs. No inherited environment credentials, no instance metadata, no implicitly mounted secrets.

Without it: Isolation is real and irrelevant, because the credentials were already inside the boundary. See Sandboxing for the containment side of this.

coronavirus

How the Model Gets Compromised

"Assume compromise" is only actionable if you know the routes. Each of these turns a data channel into a command channel, and most of them survive input filtering entirely because the payload never passes through the user's message.

RouteEntry PointWhat It AchievesPrimary ControlPersists
Direct InjectionThe user's own messageOverrides system instructions and unlocks behaviour outside the agent's briefInstruction hierarchy the model is trained to respect, plus policy enforced outside the promptTurn
Indirect InjectionA fetched page, email, PDF, ticket or code commentThe agent follows attacker instructions while believing it is reading dataMark retrieved content as data for its whole lifetime; never promote it to instructionSession
Tool PoisoningA tool description or schema from a connected serverInstructions ride in on metadata the agent reads before any call is madePin tool definitions, diff them on change, and require review before a changed tool is trustedUntil repinned
Supply Chain Rug-PullA tool, skill or server that changes after approvalA capability approved as benign becomes hostile without any local changeIntegrity checks and version pinning, with re-approval triggered by any definition changeUntil repinned
Memory PoisoningInjected content written into long-term memoryThe attack outlives the session and re-fires on unrelated future tasksValidate before write, keep provenance on stored items, and expire memory aggressivelyIndefinite
Confused DeputyA legitimate request to an over-privileged agentThe requester obtains a result they were never authorised to obtain themselvesAuthorise against the requester's permissions, not the agent'sPer request
Transitive Agent TrustA delegation from another agentCompromise propagates across an agent graph that never re-checks authorityAuthenticate peer agents and re-authorise at each hop rather than inheriting trustGraph-wide

The common thread is provenance. Content that arrived from a tool, a document or another agent must stay marked as data for its whole lifetime in context, including after it is summarised, stored in memory, or passed to a second agent.

construction

Implementation Patterns

rule

Action Gating

Every tool invocation passes through a policy gate before execution. The gate evaluates the requested action against the current user's permissions, the agent's delegated scope, rate limits, and contextual constraints. Actions outside the allowed set are rejected before they reach the tool layer.

electric_bolt

Circuit Breakers

Automatic trip-wires that halt agent execution when anomalous patterns are detected. Triggers include exceeding action budgets, repeated failures, rapid privilege escalation attempts, or accessing resources outside the expected scope. Once tripped, execution pauses until a human reviews the state.

admin_panel_settings

Guardian Agents

A separate model instance monitors the primary agent's behaviour in real time. The guardian has read-only access to the action stream and can flag or block actions that violate policy. Crucially, the guardian operates on a different prompt and context, making coordinated compromise significantly harder.

do_not_disturb

Do-Nothing as First-Class

Inaction is always a valid response. The system explicitly supports "take no action" as an output rather than forcing the agent to produce a tool call for every turn. This prevents the model from fabricating actions when the correct response is to wait, ask, or decline.

policy

Policy Enforcement Layer

A declarative policy layer sits between the agent and all external systems. Policies define what actions are allowed, what data can be accessed, and what conditions must be met. Policies are versioned, auditable, and independent of the model. They cannot be modified by the agent itself.

error_outline

Failure Modes

descriptionPolicy Lives in the Prompt

Constraints are written as system prompt instructions rather than enforced by anything outside the model. The policy then has exactly the same reliability as the model's instruction-following, which is the property under attack.

Fix: Express policy declaratively and enforce it at the tool boundary. Prompt instructions are a usability feature, not a control.

person_offAttribution Collapse

The agent runs with the user's credentials, so every log line names the user. After an incident there is no way to separate what the person did from what the agent was persuaded to do.

Fix: Give the agent its own principal and record the full chain: agent, authorising user, policy version, triggering input.

content_copyGuardian Shares the Context

The monitoring agent runs on the same context window and the same prompt as the agent it watches, so the injection that compromised one compromises both. The second opinion is not independent.

Fix: Give the guardian a different model, prompt and context, and feed it the action stream rather than the conversation.

downloadRetrieved Content Promoted

A document is fetched as data, summarised, and the summary re-enters context as ordinary text. The provenance marker is lost in the summarisation step and the instruction inside it is now indistinguishable from the agent's own reasoning.

Fix: Carry provenance through every transformation. If a summary cannot retain it, treat the summary as untrusted too.

fact_checkApproval Without Binding

A human approves an action described in natural language, and something structurally different executes. The approval covered a description, not the call.

Fix: Bind approval to the exact serialised call and re-validate at execution. Show the user what will run, not a paraphrase.

stop_circleNo Tested Revocation

There is a documented kill switch that nobody has fired against a running agent mid-task. In-flight tool calls complete, queued work drains, and the agent takes minutes to actually stop.

Fix: Exercise revocation as a drill. Measure time to full stop, and make cancellation propagate to the tool layer rather than only to the loop.

layers

Where This Sits

Zero Trust is the policy layer and it assumes the layers around it exist. Sandboxing and Isolation is the containment beneath it, bounding what a permitted action can reach. Guardrails and Stream Safeguards filter content and reasoning, which is a different question from whether an action is authorised. Judge and Escalation provides the human handoff that circuit breakers trip into. Agentic Errors covers the failures that are mistakes rather than attacks, and AIUC-1 covers how these controls are evidenced under certification. For the non-agentic foundations, see Zero Trust Architecture and AI Security.