Cloud Security Office Hours Banner

UNC6040 / Salesforce Vishing 2025

Step-by-step kill chain mapped to MITRE ATT&CK Cloud, sourced from official post-mortems and primary technical analyses.

2025 Critical Salesforce

UNC6040 - Vishing the Help Desk → Victim Authorizes a Fake Data Loader → OAuth Connected App → Bulk Salesforce Exfiltration → Extortion Months Later

Google Threat Intelligence first reported UNC6040 in June 2025: a financially motivated cluster that compromised Salesforce tenants without exploiting a single Salesforce vulnerability. Operators phoned employees at English-speaking branches of multinationals impersonating IT support, walked them through Salesforce's own connected-app authorization page, and had them enter a connection code that authorized an attacker-controlled build of Salesforce's Data Loader tool. From that point the app queried and exported data with the victim's own permissions. Victims included Google's own corporate Salesforce instance, along with fashion houses and technology firms. Extortion arrived separately and sometimes months later - Google tracks that follow-on activity as UNC6240, which demands bitcoin within 72 hours and claims affiliation with ShinyHunters, likely for pressure. The chain that matters here is the one where a legitimate consent screen, shown to a real employee who was told to expect it, is the entire attack.

No Salesforce vulnerability was exploited at any point
Google's own corporate Salesforce instance was among the victims
72 hours - the bitcoin deadline in the follow-on extortion
Months often separated the theft from the extortion
📄 Google Threat Intelligence - Voice phishing and data extortion ↗ 📄 The Hacker News - Google exposes UNC6040 ↗
📞 Initial Access - A Phone Call From "IT Support"
01
Operators called employees at English-speaking branches of multinational corporations, impersonating internal IT support
T1566.004 - Phishing: Spearphishing Voice T1656 - Impersonation

The same opening as Scattered Spider / MGM two years earlier, aimed at a different endpoint. Voice is chosen deliberately: it carries urgency and social pressure that email cannot, it defeats every mail-based control an organization has bought, and it leaves no artifact for a security team to inspect afterwards. Targeting skewed to English-speaking branches of multinationals, where an unfamiliar accent or an unknown internal name is unremarkable and staff routinely take instruction from a central IT function they have never met. Calls were placed over Mullvad VPN addresses and TOR. In some intrusions the operator also stood up an Okta phishing panel and simply asked for credentials and MFA codes during the call.

Vector: Telephone social engineering, impersonating internal IT support
Targeting: English-speaking branches of multinational corporations
Why voice: Urgency and pressure, no mail controls, no artifact to inspect later
Infrastructure: Mullvad VPN addresses and TOR for calls and collection
Sometimes also: An Okta phishing panel to capture credentials and MFA codes live
VishingIT ImpersonationOkta PanelT1566.004
✅ Execution - Talking the Victim Through a Real Consent Screen
02
The caller directed the victim to Salesforce's genuine connected-app setup page and had them enter an attacker-supplied connection code, authorizing a modified Data Loader
T1204.001 - User Execution: Malicious Link T1528 - Steal Application Access Token

This is the elegant part, and the reason no product vulnerability was needed. Salesforce's Data Loader is a legitimate bulk import and export tool that connects through OAuth as a connected app. The operator supplied a modified build with altered name and branding, not published by Salesforce, and walked the victim through Salesforce's own authorization flow to link it. Everything the employee saw was real: the genuine Salesforce domain, the genuine consent page, a tool name they recognized, and a helpful colleague on the phone explaining why it was needed. The only false element was the identity of the person asking. Consent screens are a poor control at the exact moment they matter most, because a user who has been told to expect one and given a plausible reason will approve it, and the interface offers them nothing that distinguishes this app from the real thing.

Tool impersonated: Salesforce Data Loader, a legitimate bulk import/export utility
Mechanism: Attacker-controlled connected app, authorized via a supplied connection code
Everything genuine: The domain, the consent page, the flow, the tool's apparent name
Only false element: Who was asking, and why
Later evolution: The group moved from Data Loader to custom Python scripts doing the same job
Connected AppOAuth ConsentData LoaderT1528
🔐 Persistence - An Authorization That Outlives the Call
03
Once consent was granted the app made API calls as that user, independent of the session, the password, and any subsequent MFA prompt
T1550.001 - Application Access Token

The call ends and the access does not. An OAuth grant is a durable authorization that operates on its own credential, so it survives the user logging out, changing their password, or completing an MFA challenge for something else. Nothing in the victim's normal experience signals its existence, and nothing in the standard account-hygiene playbook revokes it. This is the same structural property that made Salesloft Drift and Vercel / Context.ai so effective, reached here by talking a person into creating the grant rather than by stealing one that already existed. The only reliable kill switch is revoking the connected app itself, and that requires knowing it is there.

What persists: An OAuth grant with its own credential, tied to the app rather than the session
Not revoked by: Logout, password change, or later MFA challenges
Visible to the user: Effectively nothing after the initial approval
Only real kill switch: Revoking the connected app, which requires knowing it exists
Durable GrantSurvives Password ResetT1550.001
📤 Exfiltration - Small Chunks First, Then Whole Tables
04
Operators pulled small volumes first to understand the data, then increased chunk sizes sharply to extract entire tables
T1213 - Data from Information Repositories T1030 - Data Transfer Size Limits

Google observed a deliberate two-phase pattern: small chunk sizes at first for reconnaissance, working out which objects mattered and what the schema looked like, then a sharp increase in volume to take entire tables once the operator knew what was worth having. Proficiency varied noticeably between intrusions, which suggests different hands on different jobs; in one case only about ten percent of the data was retrieved before detection cut it short. That variance is the encouraging detail, because it means detection latency directly determined loss - the control that mattered was volumetric alerting on export activity, and where it existed it worked.

Phase 1: Small chunks, reconnaissance of objects and schema
Phase 2: Sharply increased volume, whole-table extraction
Variance: Operator proficiency differed across intrusions; one victim lost only ~10% before detection
Implication: Detection latency directly determined how much was lost
Control that works: Transaction Security Policies alerting on large exports
Bulk ExportStaged VolumeAPI EnabledT1213
🔀 Lateral Movement - Salesforce Was Not the Destination
05
Credentials obtained during the calls were reused against Okta and Microsoft 365, extending the intrusion beyond the CRM
T1078.004 - Valid Accounts: Cloud Accounts

Where the operator had also harvested end-user credentials during the call, those were reused to move into other cloud platforms - Okta and Microsoft 365 in particular. That turns a CRM data-theft incident into an identity incident, and it is the reason scoping this to "we lost some Salesforce records" was usually wrong. Okta is the higher-value target of the two by a distance, because control of the identity provider is control of everything federated behind it. Any response to a vishing call that yielded credentials has to assume the identity estate is in scope, not just the application the caller named.

Reused against: Okta and Microsoft 365 accounts
Source: Credentials and MFA codes captured during the vishing call
Why Okta matters most: The identity provider governs everything federated behind it
Scoping rule: A successful vishing call puts the identity estate in scope, not one app
OktaMicrosoft 365Credential ReuseT1078.004
💰 Impact - Extortion Arrives Months Later, Under a Borrowed Name
06
Google tracks the follow-on extortion separately as UNC6240, which demanded bitcoin within 72 hours and claimed ShinyHunters affiliation
T1657 - Financial Theft

The gap between theft and extortion frequently ran to months, and Google tracks the monetization as a separate cluster, UNC6240, suggesting UNC6040 sells or hands off access rather than extorting directly. Demands came by call or email to employees, wanted bitcoin within 72 hours, and asserted affiliation with ShinyHunters - a claim Google treats as likely pressure tactics rather than established fact, sent from addresses including shinycorp@tuta[.]com and shinygroup@tuta[.]com. Two practical consequences follow. First, an organization can be months past a successful intrusion with no signal at all, so a vishing report from a single employee deserves a real investigation rather than a note. Second, a familiar crew name in a ransom note is a marketing claim, and treating it as attribution will send an investigation in the wrong direction.

Separate cluster: UNC6240 handles monetization, often months after the theft
Demand: Bitcoin within 72 hours, by call or email to employees
Branding: ShinyHunters affiliation claimed; Google treats it as a pressure tactic
Addresses seen: shinycorp@tuta[.]com, shinygroup@tuta[.]com
Escalation: The actors were preparing a data leak site for additional pressure
UNC6240Delayed ExtortionBorrowed BrandingT1657

🛡 How to Defend Against This Chain

Allowlist connected apps, and restrict who can authorize one. This is the control that ends the chain outright. Restrict "Customize Application" and "Manage Connected Apps" to a small set of trusted administrators, require an approval process before any new connected app is authorized, and allowlist known-good applications so an unapproved Data Loader build cannot be linked at all. A user who cannot grant the consent cannot be talked into granting it.
Treat the "API Enabled" permission as the export permission it is. Bulk extraction depended on the compromised user's own rights. Restrict API access to people whose jobs genuinely require it, limit Data Loader use to that same set, and audit profiles and permission sets regularly for accounts that accumulated the capability and never gave it back. Most organizations grant this far more widely than the work requires.
Alert on export volume, because the credential and the app will both look legitimate. Salesforce Shield Transaction Security Policies can fire on large data downloads, and Event Monitoring gives per-user API and data-access patterns. Feed both into your SIEM and baseline them. The victim who lost only ten percent lost only ten percent because someone noticed the volume, which is the whole argument in one data point.
Bind access to network location so VPN-originated authorizations fail. Calls and collection came from Mullvad and TOR addresses. Login IP ranges and trusted IP ranges on user profiles, plus IP restrictions in connected app policies, block or challenge authorization attempts from unexpected sources. It will not stop a determined actor with better infrastructure, but it removes the cheap version entirely.
Harden the human process the same way you would a technical one. Give staff an unambiguous rule that IT will never ask them to authorize an application or enter a connection code during an unsolicited call, and give them a verified call-back path to use instead. Train specifically on this scenario rather than generic phishing awareness, and make reporting a suspicious call frictionless and blameless - the extortion may arrive months later, so that one report may be the only early warning available.
Scope the response to the identity estate, and audit grants you never approved. Because credentials from these calls were reused against Okta and Microsoft 365, a confirmed vishing success means reviewing the identity provider too. Then run the audit that finds the quiet version of this attack: enumerate every connected app and OAuth grant in your tenant, confirm each has a named owner and a business reason, and revoke the rest.

Related defense topics