Build1 publisher2 min readPublished
SalesBleed made Agentforce leak CRM Account data over DNS from a public lead form
Zenity Labs demonstrated SalesBleed, a proof-of-concept that used a public Salesforce lead form to make Agentforce read Account records and leak them over DNS. Salesforce has already patched it.
The Engineer · Build desk

What happened
- The attack begins when someone submits a prompt injection through a public Web-to-Lead form, which Salesforce accepts from anyone with no login.
- The subagent packs those values into an image URL, and resolving the attacker's domain sends the data out as the labels of a DNS query.
- Zenity ran the chain as a proof-of-concept, reported no exploitation in the wild, and says Salesforce has already patched it.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- constraint The redactor was already in the render path and the URL still resolved, because the browser read the string differently. Redaction alone does not contain this.
- exposure The subagent runs with default read permission on Leads and Accounts, so a hijacked inquiry reaches Account records the requesting user never asked for.
- decision Containment moves to choices made before the redactor: what the subagent is allowed to read, and where a rendered URL is allowed to connect.
Salesforce puts the subagent's output through a redactor before it renders. The subagent produced an image URL, and the redactor and the browser's URL parser read that same string differently [7]. The redactor passed it. The browser resolved it, and the fetch went to a domain the attacker controlled [8].
DNS is the channel because it is the one almost nobody blocks. The stolen Account values ride inside the hostname of that image URL, so resolving the hostname hands the labels to the attacker's DNS server as an ordinary query [8]. There is no HTTP response to inspect. Zenity's detection advice is to watch for long DNS labels aimed at unfamiliar TLDs such as .fun, next to external image URLs [12].
Two separate boundaries are in play. The sensitive read happens inside Salesforce, in the subagent; the exfiltration happens outside it, in the DNS resolver of the browser or a connected service [9]. A control that limits one leaves the other open [11].
The injection lives in a Web-to-Lead form, which Salesforce accepts from anyone with no authentication [4]. The payload then waits as lead text until an internal user runs a routine inquiry, at which point the subagent treats the lead's contents as instructions and reads Account values [5]. Because the planted lead persists, one submission can be triggered again by every later query that reads it [10].
Zenity ran this as a proof-of-concept, reported no exploitation in the wild, and says Salesforce has patched it [3]. The patch closes this instance. The same shape recurs on any platform where an agent reads attacker-controllable input [4], holds read scope wider than any single request needs [6], and emits URLs that get fetched [8]. The concrete fixes Zenity lists are to stop treating external inputs as instructions, cut the subagent's object and field permissions, block automatic rich-text fetches, and restrict DNS and HTTP egress to approved domains [11].
What to watch
- Whether Salesforce publishes the specific fix and an advisory or CVE identifier for SalesBleed.
- Whether other agent platforms that auto-fetch rich-text URLs share the redactor-versus-parser gap.
- Whether admins restrict Web-to-Lead inputs and DNS egress, since the patch leaves the default-privilege pattern in place.