Salesforce 'ForcedLeak': Indirect Prompt Injection via Agentforce Web-to-Lead Forms
Noma Security showed that a Web-to-Lead form entry can embed a prompt that Agentforce later treats as instructions, exfiltrating CRM leads and PII to an expired-but-allowlisted domain the attackers re-registered. CVSS 9.4.
The lesson is that agent safety needs three separate layers — untrusted-input handling, authority scoping, and sink enforcement — and this chain broke because URL allowlist hygiene failed.
Threat Analysis
- Attack surface. A Salesforce Web-to-Lead form's
Descriptionfield accepts user text. When a downstream Agentforce agent later processes the lead, it also follows any prompt embedded in that field — indirect prompt injection through a legitimate intake surface. - Weak context boundary. Noma first probed the agent with an unrelated prompt ("what's red + yellow?"). It answered "orange", proving the model would engage with instructions outside its sales domain instead of rejecting them.
- Exfil path. Salesforce's CSP blocked arbitrary outbound domains, but its allowlist included
my-salesforce-cms.com, whose registration had expired. Noma re-registered it, crafted a prompt that made the agent POST lead data there, and closed the exfil chain. - Severity. CVSS 9.4. Noma's CTO confirmed the compromised agent could also modify records, delete databases, and pivot to connected systems. Exfiltrated data includes pipeline, PII, conversation transcripts, and payment info.
- Vendor response. Salesforce reclaimed the expired domain and tightened Trusted URLs to block untrusted-URL output. Structural fixes to how the model separates instruction from data remain in progress.
Applicable AIDEFEND Defenses (6)
What Defenders Should Do Now
- Audit every place your SaaS AI agents ingest user-submitted content (web forms, uploads, comments, email threads) and confirm whether the architecture treats that content as data or as instructions.
- Inventory every domain on your agent output allowlists and CSPs. Verify live registration and ownership for each; remove any domain whose registration has lapsed or whose DNS no longer resolves to trusted infrastructure.
- Wrap agent actions that emit customer records, mutate CRM state, or hit paid or sensitive APIs in a step-up approval path, regardless of destination URL.
- Instrument agent outputs with data-sensitivity labels and volume metrics. Alert when an agent attempts to exfiltrate bulk records, even to an allowlisted URL.
- Where structural change is feasible, adopt a dual-LLM or tool-isolation pattern so the component that reads untrusted user input is not the component that holds tool authority.
2 additional considerations
Allowlist domain ownership monitoring
Egress-volume anomaly detection on agent outputs
Conclusion
ForcedLeak is a canonical case for why agentic AI safety has to be defence-in-depth. Three separate layers could have stopped this chain — input validation at ingest, authority scoping on the agent's action set, or sink-level policy on data egress — and any one holding would have prevented the exfil. AIDEFEND covers each layer; the lesson here is that a static URL allowlist is too brittle to be the primary exfil control, and every allowlist must be paired with ongoing domain hygiene and egress-volume monitoring.