Case Library / Agentic AI Attacks (AI-Powered Social Engineering) / ForcedLeak: Indirect Prompt Injection Exfiltrates Salesforce Agentforce CRM Data via Web-to-Lead Form and Expired CSP-Whitelisted Domain

ForcedLeak: Indirect Prompt Injection Exfiltrates Salesforce Agentforce CRM Data via Web-to-Lead Form and Expired CSP-Whitelisted Domain

Noma Security researchers hid a multi-step prompt-injection payload inside a public Salesforce Web-to-Lead form's 42,000-character Description field, then exfiltrated CRM data through an expired, CSP-whitelisted domain they re-bought for $5, when an employee later asked Agentforce about the lead.

Share:

Reviewed by the Social Engineering Examples team.

What Happened

In mid-2025, researchers at Noma Security (lead researcher Sasi Levi) discovered and demonstrated "ForcedLeak," a critical (CVSS v4.0 9.4) vulnerability chain in Salesforce's Agentforce AI agent platform (and Einstein AI). The proof-of-concept showed that an external, unauthenticated attacker could submit a Salesforce Web-to-Lead form (a standard public lead-capture form many companies embed on marketing sites) with a hidden multi-step instruction payload stuffed into the Description field, which permits up to 42,000 characters. The malicious lead then sat dormant in the CRM as ordinary-looking data. When a legitimate employee later used Agentforce to ask a routine question about that lead, the AI agent ingested the poisoned Description text as part of its context and, unable to distinguish attacker-supplied instructions from trusted business data, executed the embedded commands. Those commands directed the agent to gather CRM lead/contact data and exfiltrate it via an HTML image-tag request to my-salesforce-cms.com, a domain that had previously been legitimately whitelisted in Salesforce's Content Security Policy for Agentforce/Einstein but whose registration had since lapsed. Noma researchers purchased the expired domain for roughly $5, giving them control of infrastructure the AI stack still implicitly trusted, and used it as the exfiltration endpoint in their PoC (capturing data such as lead email addresses via URL parameters). Noma reported the issue to Salesforce on July 28, 2025; Salesforce acknowledged it on July 31, 2025; Salesforce rolled out a fix, Trusted URL Allowlisting enforcement for Agentforce and Einstein AI, on September 8, 2025, and separately re-secured the lapsed domain; Noma publicly disclosed full technical details on September 25, 2025, after the mitigation was live.

How the Attack Worked

Salesforce Agentforce (and Einstein AI) agents are designed to be queried by employees about CRM records, including inbound sales leads captured through the public, unauthenticated Web-to-Lead web form. Noma researchers found that the lead-capture form's "Description" field accepts up to 42,000 characters with no sanitization for instruction-like content. They crafted a lead submission whose Description field contained a multi-step hidden prompt: instructions written to look like data but actually directing an LLM to search for and compile sensitive CRM information (e.g., other lead/contact details, case data) and then exfiltrate it. Because the lead sits inertly in Salesforce until a human or agent interacts with it, this is an indirect/stored prompt injection: the attacker never talks to the AI directly. The trigger occurred later, when a legitimate employee, doing normal sales-ops work, asked Agentforce a routine question about that lead. The agent pulled the lead record into its context window, could not distinguish attacker-authored "data" from operator-authored "instructions," and executed the embedded steps. For the exfiltration channel, Noma discovered that Salesforce's Content Security Policy for Agentforce/Einstein still trusted an old vendor domain, my-salesforce-cms.com, whose registration had lapsed. Noma bought the expired domain for about $5, regaining full control of a hostname the CRM's AI stack still implicitly trusted for outbound content. The injected instructions caused the agent to render/request an HTML image tag pointing at that now-attacker-owned domain, with sensitive CRM data (e.g., lead email addresses, URL-encoded with %20 for spaces) appended as URL parameters, so the mere act of the browser/agent loading the "image" transmitted the data to the attacker's server logs, an exfiltration technique that requires no script execution and slips past CSPs that only vet the domain, not the payload.

The Lure & the Tell

The "lure" was structural rather than a phishing message: the Web-to-Lead form is an intentionally public, unauthenticated entry point (used on marketing sites to capture inbound sales interest), so submitting a poisoned lead required no social engineering of a human at all; it only had to look like a plausible enough lead submission to avoid spam/validation filters, while the 42,000-character Description field gave more than enough room to hide a full instruction set. There was no human "tell" to notice because no human read the payload; the deception target was the AI agent itself; when an employee later asked Agentforce something ordinary like "summarize this lead" or "what does this contact want," the employee saw only normal-looking agent behavior, not an overt anomaly, since the CSP-domain and image-tag technique had no visible UI symptom. The closest thing to a detectable tell, for a defender who knew to look, would be an unusually long/instruction-shaped Description field on an inbound lead, or unexpected outbound requests to a domain no longer under legitimate vendor control.

Outcome

No confirmed customer data breach or financial loss was publicly attributed to malicious exploitation; this was a responsibly disclosed research finding (a "ForcedLeak" proof-of-concept), not a reported real-world attack campaign, per all cited sources. Noma reported the flaw to Salesforce on 2025-07-28; Salesforce acknowledged on 2025-07-31; Salesforce rolled out Trusted URL Allowlisting enforcement for Agentforce and Einstein AI on 2025-09-08, blocking agents from sending output to non-approved external URLs; Salesforce also re-secured the lapsed my-salesforce-cms.com domain. Noma publicly disclosed the full technical writeup on 2025-09-25 after the fix was live. Salesforce stated it had released patches and did not confirm whether any customer was actually affected before the mitigation.

Why It Matters

ForcedLeak is a textbook illustration of the "lethal trifecta" risk pattern in enterprise AI agents: (1) access to untrusted external input (a public web form anyone can submit to), (2) access to sensitive private data (the full CRM), and (3) an externally-reachable communication channel the agent can be tricked into using (rendering images/links to arbitrary allowlisted domains). None of Salesforce's traditional web-app defenses (CSP, input validation on a free-text field, form spam filters) were designed to stop an LLM from treating ingested data as executable instructions, so the attack slipped through gaps between classic AppSec and AI-agent security. It also spotlights an overlooked, transferable class of risk: any domain ever added to an AI system's trusted-origin/CSP allowlist becomes a standing liability if its registration is allowed to lapse, since anyone can buy it and inherit that trust, a concrete, cheap ($5) real-world instance of "expired trust as an attack surface." Because Web-to-Lead-style public intake forms and free-text description fields are common integration patterns across many CRMs and SaaS products now being wired into AI agents, the underlying pattern (unauthenticated write access to a field an AI agent will later read and reason over) generalizes well beyond Salesforce, making this a widely cited case study for agentic-AI indirect prompt injection risk.

Defenses

Salesforce's fix was Trusted URL Allowlisting for Agentforce and Einstein AI (enforced from Sept 8, 2025), which blocks agents from generating or following links to/calling non-approved external domains, preventing agent-composed requests from reaching attacker infrastructure regardless of what instructions get injected into agent context. Salesforce also reclaimed/re-secured the lapsed my-salesforce-cms.com domain so it could no longer be re-registered by outsiders. Broader lessons Noma and coverage drew: treat all agent-ingested third-party/CRM free-text fields (lead descriptions, form submissions, ticket bodies) as untrusted input that can carry executable instructions for an LLM; audit and expire-monitor any domains ever added to an AI system's CSP/egress allowlist so they can't be resold to attackers; constrain agent tool/network egress to a strict allowlist rather than trusting default web fetch/image-render capabilities; and require human-reviewable, auditable output channels before agents act on ingested untrusted records. Also relevant: Salesforce's Trust and security-advisories page as the vendor's ongoing disclosure channel for this class of issue.

Sources
  • ForcedLeak: AI agent risks exposed in Salesforce Agentforce. Noma Security Primary. Original vendor/researcher disclosure by Noma Security/Noma Labs (researcher Sasi Levi); source of the technical details, CVSS 9.4 rating, disclosure timeline (reported 2025-07-28, acknowledged 2025-07-31, mitigated 2025-09-08, disclosed 2025-09-25), $5 domain purchase, and 42,000-character field detail. Fetched and confirmed 2026-07-29: content matches all claims attributed to it.
  • Secure Your Agents with Trusted URL Allowlisting. Salesforce Primary. Salesforce's own documentation of the Trusted URL Allowlisting patch/mitigation for Agentforce and Einstein AI referenced as the fix. Could not be rendered by automated fetch tools (returns a bot-facing 'CSS Error' shell common to help.salesforce.com's SPA); the release note's described content (mandatory Trusted URL allowlist enforced from September 8, 2025) is corroborated by three independent secondary sources (TechNadu, InfoRiskToday, BankInfoSecurity) that describe the same policy in matching detail.
  • Salesforce Agentforce tricked into leaking sales leads. The Register Secondary. Independent press coverage corroborating the vulnerability, timeline, and Salesforce's response; notes Salesforce declined to confirm real-world exploitation. Fetched and confirmed 2026-07-29: content matches, including CVSS 9.4, the $5 domain purchase, the 42,000-character field, and the exact PoC payload text quoted in the case.
  • Vulnerability in Salesforce AI could be tricked into leaking CRM data. CSO Online Secondary. Secondary trade-press coverage summarizing the Noma disclosure and Salesforce's patch. Fetched and confirmed 2026-07-29: content matches the case's description of the attack path and Salesforce's September 8, 2025 patch.
  • ForcedLeak flaw in Salesforce Agentforce exposes CRM data via Prompt Injection. SecurityAffairs Secondary. Additional secondary security-press coverage confirming details of the disclosure. Fetched and confirmed 2026-07-29: content matches, including the exact disclosure timeline and PoC payload script.
Attack Chain & Defense
The sequence the attacker ran
How it could have been stopped
1
Reconnaissance and attack-surface mapping: Noma researchers documented probing Agentforce's operational boundaries with general-knowledge test queries, then systematically checked each Web-to-Lead form field's character limit to find one large enough for a multi-step instruction payload, settling on the Description field's 42,000-character allowance after finding name/company/email fields too short (40-80 characters).
Countering Stage 1: Web-to-Lead is intentionally public and unauthenticated, so an attacker's ability to probe field character limits and general agent behavior is very hard to eliminate; the realistic control is not hiding this reconnaissance surface but hardening what happens downstream once a crafted submission arrives (see Stages 3 and 6).
2
Infrastructure staging via expired-domain acquisition: analyzing Salesforce's Content Security Policy for Agentforce/Einstein, the researchers found that the whitelisted domain my-salesforce-cms.com had lapsed, and purchased it for approximately $5, gaining control of a hostname the AI platform still implicitly trusted for outbound content, a pattern consistent with the broader tactic of acquiring expired-but-trusted infrastructure (look-alike or previously-vetted domain resale) that other supply-chain-style attacks also rely on.
Countering Stage 2: organizations and vendors should inventory and expiry-monitor every domain ever added to an AI system's CSP or trusted-URL allowlist so lapsed registrations can be renewed or removed before anyone else can buy them; Salesforce's actual fix, Trusted URL Allowlisting enforced from September 8, 2025, also closes this specific channel by blocking agent output to any domain not explicitly pre-approved, regardless of whether that domain was ever legitimately whitelisted before.
3
Payload crafting: the attacker authored a multi-step prompt disguised as ordinary lead data (harmless-looking questions followed by instructions to enumerate CRM lead/contact emails and embed them, URL-encoded, in an HTML image-tag request to the attacker-controlled domain), designed so an LLM reading it as "data" would instead execute it as "instructions."
Countering Stage 3: input validation and prompt-injection detection on free-text fields (flagging unusually long or instruction-shaped submissions, a control Noma itself recommended) can catch a crafted multi-step payload before it is ever stored as a normal-looking lead record.
4
Delivery via public, unauthenticated channel: the poisoned lead was submitted through Salesforce's Web-to-Lead form, a standard public marketing-site intake form that requires no authentication and no interaction with any human at the target organization at submission time.
Countering Stage 4: standard public-form defenses such as spam/anomaly filtering and content-length or pattern review on inbound Web-to-Lead submissions can flag suspicious entries at intake, though this is a soft control since legitimate leads can also include long free-text descriptions.
5
Dormant staging in the target's own system: the malicious lead record sat inertly in the CRM as ordinary-looking business data, exactly like any other inbound sales lead, until a human or an AI agent later interacted with it, the defining trait of an indirect/stored prompt injection.
Countering Stage 5: periodic automated auditing of stored CRM free-text fields for injection-like patterns, another practice Noma explicitly recommended, can identify and quarantine a poisoned record while it is still dormant, before any employee or agent ever queries it.
6
Trigger via legitimate employee-agent interaction (confused deputy): an employee doing routine sales-ops work asked Agentforce an ordinary question about the lead, causing the agent to pull the poisoned Description into its context window, where it could not distinguish attacker-authored instructions from trusted business data.
Countering Stage 6: treating all agent-ingested third-party data (lead descriptions, ticket bodies, form submissions) as untrusted input, and architecting agents with a context-sanitization or mediation layer that structurally separates operator instructions from retrieved data, reduces the chance an LLM executes commands embedded inside a CRM record it was merely asked to summarize.
7
Execution and covert exfiltration (objective completion): the agent carried out the embedded instructions, compiling CRM lead/contact data and rendering/requesting an HTML image tag pointing at the attacker-owned domain with the data appended as URL parameters, so the act of loading the "image" silently transmitted the data to the attacker's server logs, completing the proof-of-concept data exfiltration.
Countering Stage 7: Salesforce's Trusted URL Allowlisting enforcement is the direct control here, blocking any agent-composed outbound request (including image-tag renders) to a non-approved domain; combined with constraining agent network/tool egress to a strict allowlist and requiring human-reviewable output before agents act on untrusted records, this stops the covert exfiltration from reaching attacker infrastructure even if earlier stages are not caught.
Quick Facts
Victim
Salesforce Agentforce and Einstein AI customers (organizations using Web-to-Lead-integrated CRM with AI agents), with no specific named victim organization; disclosed as a platform-wide vulnerability affecting the Salesforce customer base broadly
Location
Salesforce (San Francisco, California, USA), vendor of the affected platform; Noma Security (researcher) headquartered in Tel Aviv, Israel and New York, USA; incident affects Salesforce Agentforce/Einstein customers globally
Date
2025-09-25 (public disclosure); vulnerability reported to Salesforce 2025-07-28, acknowledged 2025-07-31, mitigated 2025-09-08
Impact
No confirmed monetary loss disclosed. Attacker-side cost to exploit: approximately $5 to re-register/purchase the expired, still-CSP-whitelisted domain my-salesforce-cms.com used as the exfiltration endpoint. No breach notifications, fines, or customer financial-loss figures were reported in the cited sources; Salesforce and Noma both describe this as a responsibly-disclosed research finding rather than an incident with confirmed real-world victim losses.
Status
Confirmed
Case Type
Research / Advisory
Sector
Cross-Sector / Multiple Industries, Technology & Software
Threat Actor
Authorized Tester or Researcher
Related

Related Cases

PROMPTSTEAL/LAMEHUG: APT28's LLM-Powered Malware Against Ukraine

Google's GTIG and Ukraine's CERT-UA documented PROMPTSTEAL (aka LAMEHUG), Russian APT28 malware that queries an LLM (Qwen2.5-Coder via the Hugging…

Incident 2025Read →

PromptLock: AI-Generated Ransomware Proof-of-Concept Discovered on VirusTotal

ESET researchers found "PromptLock," a Go-based ransomware sample on VirusTotal that used a locally-run open-weight AI model (gpt-oss:20b via Ollama)…

Incident 2025Read →

OpenAI's "ScopeCreep": Russian-Speaking Actor Used Disposable ChatGPT Accounts to Build C2-Enabled Windows Malware Distributed via a Trojanized "Crosshair-X" Gaming Tool

A Russian-speaking threat actor used disposable, one-conversation ChatGPT accounts to iteratively build and debug a Go-based Windows malware family and…

Incident 2025Read →