PUBLIC-EVIDENCE AI SECURITY CASE STUDY

Salesforce 'ForcedLeak': Indirect Prompt Injection via Agentforce Web-to-Lead Forms

Noma Security demonstrated that text placed in the Description field of a Salesforce Web-to-Lead form is later treated as instructions by a downstream Agentforce agent - indirect prompt injection through a legitimate, unauthenticated intake surface. Noma first established the weak context boundary with an out-of-domain probe: asked 'what's red + yellow?', the sales agent answered 'orange' rather than refusing. Salesforce's CSP blocked arbitrary outbound domains, so the exfiltration leg required an allowlisted destination; Noma found my-salesforce-cms.com on the Trusted URLs allowlist with a lapsed registration, re-registered it, and crafted an injection that made the agent POST lead data there, closing the chain. The finding carries CVSS 9.4, and Noma's CTO reported the compromised agent could also modify records, delete databases, and pivot to connected systems. Salesforce reclaimed the expired domain and tightened Trusted URLs to block untrusted-URL output; structural fixes to how the model separates instruction from data are recorded as still in progress.

Agentic / MCP SystemTier 2Indicative ERS 7.7 (4.0–10.0)Evidence source date 2026-04-16

Noma Security demonstrated that text placed in the Description field of a Salesforce Web-to-Lead form is later treated as instructions by a downstream Agentforce agent - indirect prompt injection through a legitimate, unauthenticated intake surface. Noma first established the weak context boundary with an out-of-domain probe: asked 'what's red + yellow?', the sales agent answered 'orange' rather than refusing. Salesforce's CSP blocked arbitrary outbound domains, so the exfiltration leg required an allowlisted destination; Noma found my-salesforce-cms.com on the Trusted URLs allowlist with a lapsed registration, re-registered it, and crafted an injection that made the agent POST lead data there, closing the chain. The finding carries CVSS 9.4, and Noma's CTO reported the compromised agent could also modify records, delete databases, and pivot to connected systems. Salesforce reclaimed the expired domain and tightened Trusted URLs to block untrusted-URL output; structural fixes to how the model separates instruction from data are recorded as still in progress.

ASSESSED SYSTEM

A Salesforce Agentforce CRM agent in the configuration Noma Security validated pre-remediation: an agent that processes Web-to-Lead form submissions, holds CRM read and action authority, and emits outbound requests governed by the Salesforce Content Security Policy and the Trusted URLs allowlist - the allowlist at that time still containing my-salesforce-cms.com, whose registration had lapsed.

OUT OF SCOPE

Salesforce Agentforce after remediation (Salesforce reclaimed the expired domain and tightened Trusted URLs); the wider Salesforce platform outside the Agentforce agent and its egress policy; any specific customer's CRM data; Noma Security's research tooling. The structural instruction/data separation work that the brief records as still in progress is out of scope as a future state but is reflected in the Rf score.

Architecture: Agentic / MCP System (decision tree Q2) — The agent ingests lead records, decides how to act on them, and invokes outbound actions - including an HTTP POST carrying CRM data - without explicit human approval for each action; Noma's CTO confirmed the compromised agent could also modify records, delete databases, and pivot to connected systems. That is autonomous multi-step workflow execution with tool invocation, so Q2 = YES. Q1 was answered NO: no second agent or inter-agent message channel is documented. Tier 2: Tier 2 Consumer: the agent sits directly behind a public, unauthenticated intake surface (a website Web-to-Lead form) and its exploitation compromises individuals' data - CRM leads, PII, conversation transcripts, and payment information.

Documented attack or failure path

  1. An attacker submits a Salesforce Web-to-Lead form with prompt text embedded in the Description field - a public, unauthenticated intake surface that requires no account.
  2. The lead record persists in the CRM and is later read into the Agentforce agent's context, where the embedded text is treated as instructions rather than as data.
  3. Noma verifies the missing context boundary with an unrelated probe ('what's red + yellow?'); the sales-domain agent answers 'orange', showing it engages with instructions outside its domain instead of rejecting them.
  4. Because Salesforce's CSP blocks arbitrary outbound domains, the injected instruction must target an allowlisted destination; Noma identifies my-salesforce-cms.com on the Trusted URLs allowlist as having a lapsed registration and re-registers it.
  5. The injected instruction causes the agent to POST CRM lead data to the now attacker-controlled but still allowlisted domain, completing exfiltration of pipeline data, PII, conversation transcripts and payment information.

Observed controls and bounded outcomes

Positive credit is given only where the record directly demonstrates a control operating. Recommended or merely presumed controls receive no positive scoring credit.

  • The Content Security Policy did block outbound requests to arbitrary attacker-chosen domains. The exfiltration leg only completed because a domain already on the Trusted URLs allowlist had a lapsed registration the researchers could reclaim - the policy mechanism worked, its input data had decayed.
  • No authentication or authorisation bypass was required or achieved: the agent acted strictly within the CRM permissions already granted to it. This is a scoping failure, not an access-control break.
  • Salesforce reclaimed the expired domain and tightened Trusted URLs to block untrusted-URL output after disclosure, closing the demonstrated chain.

Layer 1 — Intrinsic Vulnerability Profile

Each sub-metric is placed on its five-level rubric by the evidence quoted beside it. Missing applicable evidence remains unknown. The displayed midpoint and interval are scenario values, not inferred control performance.

Sub-metricScoreRubric basisEvidence
Robustness (Ro) — scenario interval 0.06–0.51 (midpoint 0.29), Tier 2 MVT 0.50 indeterminate
Ro-1Adversarial Input Resistance0.00w 0.300.00 - a naive, non-adaptive prompt injection through the intended intake surface succeeded on the untrusted slot, and there is no evidence of an adversarial test battery on that path. The 0.25 anchor requires that basic filters at least resist naive attacks, which the evidence contradicts.A plain instruction embedded in a Web-to-Lead Description field was followed by the agent on the intended intake path - no adaptive technique, encoding, or multi-turn setup is described as necessary. The separately reported out-of-domain probe ('what's red + yellow?' answered 'orange') shows the agent had no domain-scoping refusal behaviour on untrusted lead text. Salesforce's remediation addressed the egress allowlist; the brief records structural fixes to instruction/data separation as still in progress.source: researcher
Ro-4Poisoning Attack Resistance0.25w 0.250.25 - basic format-level validation exists on the intake surface, but there is no adversarial screening, and content poisoning of the store the agent reads succeeded with minimal effort on the first attempt.The attack vector is untrusted content written by an anonymous internet user into a persistent CRM record that the agent subsequently reads as context - the feedback/memory ingestion channel Ro-4 covers. Web-to-Lead applies standard form-field handling, but the brief's recommended control (AID-H-002.002: tag externally sourced text as untrusted, strip or flag instruction-shaped content) is presented as missing, so no adversarial screening of instruction-shaped content occurred before ingestion.source: brief
Fairness (Fa) — scenario interval 0.00–1.00 (midpoint 0.50), Tier 2 MVT 0.55 indeterminate
Transparency (Tr) — scenario interval 0.00–1.00 (midpoint 0.50), Tier 2 MVT 0.50 indeterminate
Privacy (Pr) — scenario interval 0.09–0.74 (midpoint 0.41), Tier 2 MVT 0.55 indeterminate
Pr-3Data Minimization Compliance0.25w 0.350.25 - minimisation controls exist on the primary CRM data model, but the agent's own retrieval and outbound paths carry sensitive fields far in excess of the intake-and-reply purpose, with no per-call sensitivity or volume constraint.The exfiltrated set reported by Noma includes pipeline data, PII, conversation transcripts and payment information - all reachable through an agent whose documented task is lead intake and reply. The brief's remediation advice ('instrument agent outputs with data-sensitivity labels and volume metrics'; 'rate-limit or step-up on high-volume or high-sensitivity sinks') indicates neither sensitivity labelling nor record-count metadata was attached to the agent's outbound path.source: brief
Containment (Cn) — scenario interval 0.12–0.54 (midpoint 0.33), Tier 2 MVT 0.55 confirmed breach
Cn-1Scope Enforcement0.25w 0.120.25 - basic boundaries exist (an enforced egress allowlist) but are enforced inconsistently across the data and action surface, and simple prompt manipulation exceeded intended scope. Not 0.00, because the egress boundary demonstrably constrained the attacker's options.Once injected, the agent reached CRM leads, PII, transcripts and payment data well outside an intake-and-reply envelope, and per Noma's CTO could reach record modification, database deletion, and connected systems. Against that, a real network-scope boundary existed and functioned: the CSP blocked arbitrary outbound domains, which is why the attack had to route through an allowlisted destination.source: researcher
Cn-2Escalation Prevention0.25w 0.160.25 - role checks exist and were not broken, but they are vulnerable to prompt injection and delegated tool misuse because the granted envelope is far wider than the task.The agent obtained no new privileges - it exercised the ones it already held. The failure is tool-permission amplification: an intake-and-reply agent carried bulk CRM export and record-mutation authority, and prompt injection was sufficient to direct that authority. The brief's recommendation to 'wrap agent actions that emit customer records, mutate CRM state, or hit paid or sensitive APIs in a step-up approval path' indicates no such step-up existed.source: brief
Cn-3Output Filtering Robustness0.25w 0.180.25 - a basic category filter (a static destination allowlist) exists but is bypassed once the attacker controls an allowlisted entry, and no payload-sensitivity or volume policy backs it. The 0.50 anchor would require filtering that blocks common unsafe outputs, which content-blind egress allowlisting does not do.Two layers are visible. A destination allowlist (CSP plus Trusted URLs) was enforced on agent output and blocked arbitrary domains. No content-level filtering was present: bulk CRM records, PII and payment information left through an allowlisted URL with no sensitivity detection and no record-count or volume check, which is exactly the gap AID-D-003.002 is recommended to close. The allowlist itself failed silently when an entry's registration lapsed and was reclaimed.source: researcher
Cn-6Action Reversibility Classification Rate0.00w 0.120.00 - no reversibility classification is performed before execution and automated actions execute ungated (ARCR = 0). Salesforce's static per-object permission model is an authorisation model, not a pre-execution reversibility classification, so it does not reach the 0.25 anchor's ad-hoc-classification criterion.The agent executed an outbound transmission of customer records with no pre-execution classification or approval, and Noma's CTO reported that record modification and database deletion - delegated-irreversible actions by the Cn-6 taxonomy - were likewise reachable. The brief's remediation advice is to add a step-up approval path for exactly these action classes, indicating none existed.source: researcher

Unknown, not N/A: 16 applicable sub-metrics lack admissible public evidence. The lower, midpoint, and upper scenarios evaluate each at 0.00, 0.50, and 1.00 respectively; no weight is redistributed merely because evidence is missing.

Layer 2 — Operational Risk Posture

DimensionScoreJustification
AaAutonomy Amplification0.85w 0.25The agent processed lead content and issued an outbound HTTP POST carrying CRM data with no per-action human approval, and Noma's CTO reported record mutation and database deletion were reachable through the same authority. That exceeds the 0.75 supervised-autonomy anchor because no exception or escalation gate is evidenced for any high-consequence action; it stays below 1.00 because the agent's designed envelope is intake-and-reply rather than independent transaction execution. elevated
AsAttack Surface Exposure1.00w 0.35Fully untrusted, unauthenticated public content - anything a stranger types into a website form - is retrieved into the agent's instruction context, and the agent reaches connected downstream systems from there. This meets the 1.00 anchor's untrusted-retrieval clause rather than the 0.75 'partially trusted sources' description: a Web-to-Lead Description field has no trust basis whatsoever. elevated
CpCascade Potential1.00w 0.20Graph-derived and corroborated on its merits. The observed taint trace runs from an anonymous web form (L1 context assembly) through the agent's outbound action surface (L3) to an attacker-controlled external endpoint (L4), and the reported reachability extends to CRM record mutation, database deletion, and connected systems - a P3 write-external / irreversible-capable node. The CSP gate on that edge cannot be claimed: spec section 3.2.1 permits a gate on a path only at CBR >= 0.95 against production-equivalent configuration, and a canary observed crossing a declared-blocked boundary invalidates the CBR claim - Noma's exfiltration is exactly that observation. An ungated path reaching a P3 node triggers g_P = 1.00 independently of the missing SDG.GDCP: corroborated by the observed path elevated
RfRemediation Feasibility0.60w 0.20Documented intermediate between two anchors. The demonstrated exfiltration chain was closed by configuration change within days - Salesforce reclaimed the expired domain and tightened Trusted URLs (the 0.25 anchor). The enabling defect, an agent treating untrusted lead text as instructions, is a model-level property currently addressed only through external guardrail layers, and the brief records the structural instruction/data separation fix as still in progress (the 0.75 anchor). 0.60 reflects that the demonstrated path is patched while the class of defect is not eliminable by the same means.

Nelevated = 3 (dimensions strictly above 0.75) → CRM = 1.35.

Compound Risk Alert. Two or more dimensions are simultaneously elevated (spec 3.2.2); architectural decomposition is recommended before deployment.

Layer 3 — Public-evidence confidence diagnostic

ComponentScoreBasis
Pc — Public provenance evidence0.25Vendor, platform and product are documented, and one policy artefact - the Trusted URLs allowlist - was partially enumerated by the researchers. The underlying model, prompt lineage, agent tool manifest, RAG or retrieval configuration, and identity policy for the assessed agent are all undocumented in the available evidence, and nothing is signed or independently reviewed. That is the 0.25 minimal-provenance anchor.
Ec — Public evaluation coverage0.30coverage 0.30 (7 of 23 applicable sub-metrics) × independence 1.00 × fidelity 1.00. No Full, Standard, or Lite pathway is claimed for a retrospective article.
Tf — Public-evidence freshness0.00Evidence dated 2025-09-25; age 322 days on the workpaper reference date. Components: T_behavior 0.00 · T_containment 0.01 · T_calendar 0.08 · C_event 0.35 · C_behavior 0.40 · C_monitor 0.65 · C_evidence 0.65. Binding term: T_behavior. dt_days = 322, measured from Noma Security's primary disclosure dated 2025-09-25 to the 2026-08-13 evidence reference date; the AIDEFEND brief republished the analysis on 2026-04-16, but republication does not reset evidence age. agentic = true: Agentforce is an Agentic/MCP class deployment with runtime-mutable tool and permission scopes, so the containment staleness floor with M_Cn = 2.0 applies. baw = true: the BAW checklist is met on the writable-memory and closed-feedback-loop items - the agent both reads CRM records as retrieval context and (per the reported capability) can modify them, and conversation transcripts persist and are re-consumed. C_event = 0.35: a confirmed compromise of the assessed configuration plus the vendor's subsequent Trusted URLs policy change, both major events under the spec's change table. C_monitor = 0.65: a detection failure is directly evidenced - bulk PII egress to an external endpoint produced no alert, and the brief recommends adding egress-volume and sensitivity instrumentation that therefore did not exist. C_behavior = 0.40 (Band 0): no canary set, registered invariants, or maintained drift baseline are documented for the assessed agent; this is the spec's worst-case house rule for unavailable evidence, not a finding that Salesforce operates no monitoring. C_evidence = 0.65 follows from the Band 0 cold-start rule and is independently supported by the open structural instruction/data separation gap.

Public-evidence ACI = (Pc × Ec × Tf)1/3 = 0.04 — diagnostic status: Invalid as assessment-of-record evidence. It describes the evidence available to this case study, not the assurance of the underlying system, and is not inserted into the normalized-assurance scenario ERS.

Indicative ERS — normalized-assurance scenario

Worp · ORP0.25(0.85) + 0.35(1.00) + 0.20(1.00) + 0.20(0.60) = 0.882
CRMNelevated = 3 → 1.35
ORPeffective0.882 × 1.35 = 1.191
Wivp · IVP midpoint0.25(0.29) + 0.30(0.50) + 0.15(0.50) + 0.20(0.41) + 0.10(0.33) = 0.412
IVP mitigation0.15 + 0.85(1 − 0.412) = 0.650
Scenario assuranceACI fixed at 1.000 for cross-case comparison; public-evidence ACI 0.035 is diagnostic only
Indicative ERS midpointmin(10, 1.191 × 0.650 × 1/1.000 × 10) = 7.7
Unknown-input interval4.0–10.0; 16 unknown applicable sub-metrics set to 1.00 / 0.00 at the bounds

AIDEFEND defences → AITBM sub-metrics

Identifiers are quoted as they appear on the AIDEFEND in Action brief (retrieved 2026-08-13); the sub-metric mapping is AITBM's own, from the specification's AIDEFEND tables reconciled at catalogue data version 2026.08.05. AIDEFEND renumbers identifiers between releases, so the data version travels with every mapping and neither side's IDs should be cited without one. A mapping identifies a possible evidence route; a recommendation does not prove that the control was implemented or effective and receives no scoring credit by itself.

TechniqueDefence PriorityEvidences
AID-H-018.005Value-Level Capability Metadata & Data Flow Sink EnforcementParent AID-H-018 (Tool Authorization & Capability Scoping). Binding sink policy to payload sensitivity rather than to a static domain list is the control whose absence holds Cn-3 at 0.25 and Cn-6 at 0.00.Very HighCn-1 Cn-6 Cn-7
AID-H-019.001URL Normalization & Allowlist FilteringParent AID-H-019 maps directly to Ro-1, Cn-1, and Cn-3 in the reconciled AIDEFEND dataVersion 2026.08.05 crosswalk. In this case the egress-allowlist failure supplies direct evidence for Cn-3.Very HighCn-1 Cn-3 Ro-1
AID-D-003.002Sensitive Information & Data Leakage DetectionParent AID-D-003 (AI Output Monitoring & Policy-Violation Detection). Output scanning for PII, customer records and unusually large record sets before they are sent - even to an allowlisted URL - is the missing content layer behind Cn-3 = 0.25.HighCn-1 Cn-3 Cn-7 Ro-3
AID-H-002.002Inference-Time Prompt & Input ValidationParent AID-H-002 (AI-Contextualized Data Sanitization & Input Validation). Tagging externally sourced form text as untrusted data and stripping instruction-shaped content is the direct control for Ro-1 = 0.00; the Fa mappings in the catalogue are not exercised by this case.HighFa-1 Fa-3 Ro-1
AID-M-009.002Authority Envelope & Action Risk ClassificationParent AID-M-009 (Agent Autonomy & Authority Governance). Classifying bulk CRM export and record mutation as outside an intake-and-reply agent's envelope produces the policy fact a Cn-6 gate would consume.HighCn-1 Cn-5 Cn-6 Cn-7
AID-H-017.007Dual-LLM Isolation PatternParent AID-H-017 (Secure Agent Architecture). Splitting the LLM that parses untrusted content from the tool-capable agent is the structural fix for Ro-1; the catalogue maps the parent to Cn-5, and the architectural separation also bears on Cn-2.MediumCn-5 Cn-7

WHAT THIS CASE TEACHES

ForcedLeak shows why Cp = 1.00 here is corroborated rather than defaulted: a sink gate that a researcher's payload was observed crossing cannot be claimed at CBR >= 0.95, so the path counts as ungated to a P3 node on its own merits - and it shows a control can be simultaneously credited (Cn-1 = 0.25 not 0.00, because the CSP constrained the attacker) and defeated, which is what a two-sided assessment looks like.

Sources: AIDEFEND in Action brief: Salesforce 'ForcedLeak' (2026-04-16) · Noma Security: ForcedLeak — AI Agent Risks Exposed in Salesforce Agentforce (2025-09-25)

AITBM sub-metrics referenced