What happened
March to June 2025 — according to the Mandiant investigation published by Salesloft, the threat actor accessed Salesloft's GitHub account, downloaded the content of several repositories, added a guest user and set up workflows. Reconnaissance activity was then observed in the Salesloft and Drift environments.
The investigation then established access to Drift's AWS environment, from which the attacker obtained OAuth tokens associated with customers' technology integrations.
8 to 18 August 2025 — those OAuth credentials were used to reach customer environments through the Drift integrations and exfiltrate data. Salesloft documents this window; FINRA also recommends hunting for abnormal access over that period.
A note on method: some early publications mentioned tokens obtained during earlier phishing or social engineering campaigns. We rely here on the later, more precise timeline established by the investigation, and we do not present both hypotheses as simultaneously proven.
An attack on the trust relationship
- 01Salesloft GitHub compromised
- 02Salesloft / Drift reconnaissance
- 03Drift AWS environment
- 04Customer OAuth tokens retrieved
- 05Drift application seen as legitimate
- 06Access to customer SaaS
- 07Data exfiltration
No step in this chain requires a human user to log in again.
The IAM problem
- Non-human identities
- Authorization
- Entitlement governance
- Behavioural monitoring
The IAM problem: the identity accessing the data was not human. When a person signs in, you can ask for a password, an additional factor, adaptive authentication, a compliant device, a coherent context.
An OAuth integration works differently. Once the trust relationship is established and a credential issued, the application calls the APIs within the permissions it was granted. The attacker therefore did not need to repeat a human user's journey: FINRA notes that the stolen tokens made it possible to impersonate the trusted Drift application and bypass the traditional MFA journey.
The token is that application identity's credential, not its identity. That distinction moves the subject: from human authentication towards governing the application identity, its credentials, its permissions and its behaviour.
MFA did not fail
It was protecting a different step of the chain. Once a valid OAuth credential is compromised, the problem moves from human authentication to governing the application identity, its credentials, its permissions and its behaviour.
A SaaS integration is an identity
A non-human identity can be an application, a SaaS integration, a service account, a workload, a bot or an AI agent. It also has:
- a purpose
- an owner
- credentials
- permissions
- resources it reaches
- a normal behaviour
- a beginning and an end of life
The fact that no human logs in does not remove the subject from the IAM perimeter: that is precisely what makes it a non-human identity governance topic. A useful nuance: “non-human identity” does not necessarily mean an OAuth client_credentials flow.
Why the potential impact was significant
FINRA reports that the campaign affected more than 700 organisations, and that the attackers reached Salesforce, Google Workspace and, in some cases, Slack environments. Exposed data could include contacts, accounts, opportunities and cases, but also API keys, cloud credentials, passwords and tokens present in the content.
Cloudflare, which published its response, explains that its Salesforce environment contained support ticket information that could embed tokens or passwords. The company identified 104 Cloudflare API tokens in the affected data and rotated them all, without identifying suspicious activity associated with those tokens.
This is where blast radius becomes concrete: stolen data can become the credential for the next attack. A compromised integration opens the CRM, the CRM contains a token, that token potentially opens a third system. The reach then extends well beyond the SaaS initially concerned.
Why the existing controls were not enough
User-oriented controls — password, MFA, adaptive authentication — were guarding a step the attacker did not need to cross: they held a credential already granted to a trusted application.
From that point on, only controls covering the application identity could still act: the scope of the permissions granted, the credential's lifetime, the ability to revoke it, and monitoring of the integration's actual usage.