Research
We built the tool around how agent breaches actually happen.
What we concluded
Five findings that shaped the engine.
Component correctness does not compose
In both public breaches, no component was misconfigured. The classifier ran, redaction ran, the CSP was enforced. The exploit came from the arrangement: untrusted text could reach an action with an outward effect. Any tool that grades components in isolation cannot see that.
The model is a boundary, not a filter
Text that arrives as data leaves the model as instructions. Treating a model call as neutral middleware is what makes so many findings look harmless. We propagate taint through the call and raise severity when it happens.
The exfiltration channel is usually rendering
Both breaches ended in an auto-fetched image request rather than an explicit HTTP call. That is why rendered model output is a sink in our model, not a formatting concern.
Allowlists only work when the code resolves against them
ForcedLeak used a domain that was still on a trusted list. A list is a guard only when the destination is checked against it at the point of egress, which is exactly what the engine looks for.
Classifiers are partial guards at best
EchoLeak evaded a production prompt-injection classifier by writing to a human reader. We score injection detection as a partial guard: useful, not closing.
Why routes matter
Two breaches where every component was configured correctly.
EchoLeak
CVE-2025-32711Microsoft 365 Copilot · Disclosed June 11, 2025 · found by Aim Labs (Aim Security)
A single crafted email could make Copilot pull sensitive context and send it to an attacker-controlled server with no user interaction. Aim Labs described it as an LLM scope violation, and it is widely reported as the first zero-click prompt-injection exploit against a production AI system.
- 01 A benign-looking email lands in the mailbox and phrases its instructions for a human reader, so the cross-prompt injection classifier does not flag it.
- 02 Copilot retrieves that email as ordinary context while answering an unrelated question.
- 03 The hidden instructions make Copilot embed sensitive context into a reference-style Markdown image, a form that link redaction did not strip.
- 04 The client fetches the image automatically, and a Microsoft Teams preview endpoint allowed by the content-security policy proxies the request out.
The lesson: Every component behaved as configured. The exposure was that an untrusted mail body could reach an output channel the client fetches on its own.
In ExfilPath terms: Inbound mail is an input surface, rendered media in model output is a sensitive action, and neither redaction nor a classifier fully covers the value — so this shape reports as an open critical path.
ForcedLeak
CVSS 9.4 vulnerability chainSalesforce Agentforce · Disclosed September 2025 · found by Noma Labs (Noma Security)
Instructions placed in the Description field of a public Web-to-Lead form were executed when an employee asked Agentforce to process the lead. CRM data was then exfiltrated through an image request to a domain still on the trusted list — a domain the researchers noted could be bought for about five dollars.
- 01 An attacker submits a lead through the public form with instructions inside a free-text field.
- 02 An employee asks the agent to qualify the lead, and the agent ingests the field as context.
- 03 The agent follows the embedded instructions and queries CRM records.
- 04 The result is appended to an image URL on an expired but still-trusted domain, and the request carries the data out.
The lesson: Public form input reached an action that could both read records and make outbound requests. Salesforce began enforcing Trusted URL allow lists for Agentforce and Einstein generative AI agents on September 8, 2025.
In ExfilPath terms: A CRM free-text field is an input surface, an outbound request is a sensitive action, and a trusted-URL list only closes the route when the code resolves the destination against it.
The shape
Written as a rule, both breaches are the same finding.
IF a value originates from a surface an attacker can write to
AND that value reaches an action with an outward or destructive effect
AND no guard covers the value between those two points
THEN there is a path, and the severity follows the action.
Crossing a model call does not break the chain — it strengthens it,
because data on the way in becomes instructions on the way out.Reading list
Primary sources.
- EchoLeak: zero-click prompt injection in Microsoft 365 Copilot ↗
Aim Labs (Aim Security), June 2025
The original disclosure. Introduces the LLM scope violation framing.
- CVE-2025-32711 record ↗
NIST National Vulnerability Database
Described as AI command injection allowing information disclosure over a network. Microsoft scored it 9.3, NIST 7.5.
- EchoLeak: the first real-world zero-click prompt injection exploit in a production LLM system ↗
arXiv preprint, September 2025
Step-by-step analysis of the classifier bypass, the reference-style Markdown bypass and the CSP-allowed proxy.
- ForcedLeak: AI agent risks exposed in Salesforce Agentforce ↗
Noma Labs (Noma Security), September 2025
Web-to-Lead injection, CRM data exfiltration through an image request, and an expired trusted domain.
- OWASP Top 10 for LLM Applications ↗
OWASP
ExfilPath maps findings to LLM01 Prompt Injection, LLM02 Sensitive Information Disclosure, LLM05 Improper Output Handling and LLM06 Excessive Agency.
Working with us