180 incidents on record · 2026 Headlights Incident reports by Ellie Harris · Melbourne
10 new this week Library last updated 30 August 2026
← The incident library
HD-INC-114
Enterprise software · United States · 2025 · Prompt-injection data egress

Security researchers showed that a hidden instruction placed in a Salesforce sales form could make its AI agent send customer records to a web address the attacker controlled, through a lapsed Salesforce domain that was still trusted

By Ellie Harris · Filed Reported to Salesforce 28 July 2025; disclosed publicly 25 September 2025

Alleged: Salesforce developed or deployed the AI system implicated in this incident. Details are drawn from public reports; parties are presumed innocent of any wrongdoing not established by an official finding.

Security researchers showed that a hidden instruction placed in a Salesforce sales form could make its AI agent send customer records to a web address the attacker controlled, through a lapsed Salesforce domain that was still trusted

What happened

It was reported by researchers at Noma Security that Salesforce Agentforce, a system of AI agents that read and act on records in a company’s customer database, could be made to leak those records through a flaw they named ForcedLeak. According to their account, an attacker submits a public web-to-lead form, the kind a business uses to collect sales enquiries, and places hidden instructions in the description field, which allows a large amount of text. The instructions sit in the customer database as an ordinary lead until an employee asks the agent to help with incoming leads, at which point the agent processes the attacker’s text as if it were part of its task, queries the database for other information, and places what it retrieves inside a request for an image hosted on a web address the attacker controls, so that the data is sent out as the image is fetched.

It was reported that the outbound address worked because it used a domain related to Salesforce that the company had allowed to expire, which the researchers were able to buy for a few dollars, and which still appeared on Salesforce’s content security policy as a trusted destination, so the browser did not block the request. Noma Security reported the flaw to Salesforce on 28 July 2025; it was assigned a critical severity score of 9.4. Salesforce reclaimed the expired domain and, on 8 September 2025, enforced a list of trusted web addresses for Agentforce and its Einstein AI so that output cannot be sent to destinations that are not on it. The company said its services would enforce the trusted-address list to ensure no malicious links are called or generated through a prompt injection of this kind, and the research was published on 25 September 2025. The path depended on two things at once, an instruction that the agent treated as a command because it had arrived inside a record, and an outbound address that counted as trusted only because a lapsed domain had never been removed from the list, so removing either one would have closed it. The researchers reported no evidence that the flaw had been used against customers before it was fixed.

What an auditable version would have shown

Because the flaw was found and reported by researchers rather than discovered after a loss, the question an auditable version answers is a different one: for any given deployment, whether the agent ever followed an instruction that arrived inside a record, and whether any data was addressed to a destination outside the company. A signed record of the agent’s actions, the instructions it acted on, the data it retrieved, and the address each response was sent to, turns those questions into a search rather than a reconstruction. What could only be estimated here, how many customer records could have left through this path, becomes, in a system that keeps such a record, a figure that can be produced for each organisation that used the feature.

Where the gap was

An instruction that arrived inside a lead was treated as a task to carry out, and a response was allowed to leave for an external address that sat on a trust list only because an expired domain had never been removed from it. An AuthorityGate checks whether the source of an instruction is entitled to direct the agent, so text that arrives inside a customer record is not treated as a command. An EgressGate checks, at the point where data would leave, whether the destination is inside the trust boundary, so an address that no longer belongs to the company is refused even if an old policy still lists it. A ConductRecord preserves what the agent did and where each response was sent, so the path can be examined afterwards. Each of these is a check the browser’s own trusted-address rule was standing in for, and that rule failed at the one point where the list of trusted addresses had gone stale.

What governance should have looked like

Best practice for an agent that reads untrusted data and can send messages out is to treat instructions found inside that data as untrusted, and to check every outbound destination against a trust boundary that is maintained, at the moment data would leave. The trusted-address list Salesforce relied on was the right idea applied to the wrong thing: it guarded the browser but was not kept current, so an expired domain carried the trust that a live one had earned. Enforcing the destination check at the point of egress, against a list that is revisited, is what closes the path the description field opened.

Failure Pattern: an AI agent followed instructions that arrived inside the data it was asked to process, then sent internal records to an external web address that was on a trust list only because a lapsed domain had never been removed from it.

Governance Principle: an AI agent must treat instructions arriving inside data as untrusted, and every outbound destination for data must be checked against a maintained trust boundary at the moment data would leave, not against a list that is never revisited.

The reference implementation of AuthorityGate, EgressGate and ConductRecord is open source. It lives at github.com/saffronandindia/headlights-oss, Apache 2.0 licensed and free to install. The repository is public now.

Sources

The mailing list

Fresh incident reports every week. One email to match.

We add new incidents to the library regularly, and send a single short email each week with what's new. The library stays free and open; this is just how you keep up with it.

No tracking. Unsubscribe in one click.

The record

An auditable system would have produced a signed, tamper-evident record the moment this happened: what the system did, the version that did it, the basis it acted on, and the action taken, and Salesforce could have produced it on demand.

This is the record the system as deployed did not produce in a signed, auditable form.

What this teaches
Capture what happened when it happens
What the system did, the version that did it, the basis it acted on, and the action taken, recorded at the moment, not reconstructed after.
Sign it, so no one has to trust the record-keeper
A tamper-evident entry. Edit it later and the signature breaks. The record does not ask for the benefit of the doubt.
Make it verifiable by anyone
A court, a regulator, a customer's lawyer can check the record themselves, without taking the company, or us, at our word.

Headlights summarises publicly reported AI incidents. All summaries are independently written, attributed to their original sources, and intended for research and educational purposes. Allegations are identified as such until established through official findings.

This report is based on the sources listed above and reflects information available at the time of review; later developments may not be captured. Where a person is described as charged with or alleged to have done something, that allegation is unproven unless a conviction or a court or regulatory finding is stated. Headlights publishes journalism and commentary, not legal advice.

Want to write back?

Direct to my inbox.

ellie@useheadlights.com →