Security experts are increasingly observing that most vulnerabilities in AI agents stem from a single architectural anti-pattern known as the Lethal Trifecta. Popularized by Simon Willison, the model identifies three elements that together render a system vulnerable by design: private data, untrusted content, and any form of external output.
When an AI agent receives private data such as code repositories, customer databases, or internal documents, it gains the context needed to be useful. Once the agent also ingests untrusted content from external sources, such as supplier documentation or incoming emails, the boundary between instructions and data becomes probabilistic. The third element, external output, transforms potential misuse into real consequences by allowing the agent to send messages, modify files, or execute code outside the conversation.
The article emphasizes that none of the three elements is inherently a flaw. Private data is supplied deliberately, untrusted content is required for competence, and external actions deliver the productivity gains that justify agent deployment. The risk emerges only when all three coexist in the same execution context.
Why filtering and markup fall short
Common defenses such as prompt-injection classifiers or XML-style markup around untrusted text reduce risk but remain probabilistic. Because language models interpret flat text, an attacker can still craft inputs that bypass filters or override markup. The recommended strategy is therefore to break the triad structurally rather than attempt to patch the model itself.
Practical controls for user-controlled agents
- Connect only external services the user already trusts and limit each agent to a narrow task scope.
- Separate agents that handle untrusted input from those that access private data or perform external actions.
- Keep confirmation prompts enabled for irreversible operations, even when they become repetitive.
- Remember that context accumulates across an entire session, making early untrusted input available to later actions.
Controls for autonomous cloud agents
- Enforce session separation by trust level so that an agent reading untrusted content never possesses private-data access or outbound channels.
- Restrict outbound actions to an explicit allow-list of domains and paths with volume and rate limits.
- Audit at the network boundary rather than inside model logs.
- Output structured data such as validated JSON instead of free-form text to shrink the exfiltration channel.
Emerging research projects including CaMeL, Tacit for Scala, and related work for Kotlin and Datalog aim to add machine-readable data-flow labels and formal verification. These techniques allow an agent to generate code while an external policy layer enforces that untrusted inputs cannot reach private outputs.
Until such verification becomes standard, the practical defense remains least privilege: keep cryptographic keys and broad permissions outside the agent, supply only narrowly profiled API access, and ensure that dangerous combinations of the three elements cannot be expressed in a single execution context.

