DriftToken — Salesloft Drift → Salesforce OAuth Data Theft (UNC6395)
Executive Summary
UNC6395 compromised the Salesloft Drift sales-engagement integration and stole the OAuth tokens it uses to sync into customers' Salesforce instances. With those tokens the actor held trusted, API-level access to 700+ organizations' Salesforce orgs — including major security vendors (Zscaler, Palo Alto Networks, Proofpoint, Cloudflare, Tenable) — and, between Aug 8 and Aug 18, 2025, quietly ran bulk queries to exfiltrate large volumes of data (contacts, cases, opportunities) plus secrets embedded in Salesforce text fields: AWS access keys, Snowflake tokens, and VPN credentials. The stolen data is now fuelling extortion.
Because the access was via a legitimate, pre-authorized Connected App, there was no malware and no failed logins — the activity looked like normal Drift integration traffic. The tell-tales are in the Salesforce event/API logs: anomalous query volume, unusual source IPs (Tor exit nodes / VPS), and distinctive User-Agent strings. Salesloft and Salesforce revoked all Drift OAuth tokens on Aug 20 and pulled Drift from the AppExchange. This pack hunts for the access pattern and arms you against the next OAuth-integration compromise.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry |
|---|---|---|---|
| 1 · Vendor research | Google Threat Intelligence (GTIG) — UNC6395 | OAuth-token theft via Drift; trusted Salesforce API access; Aug 8–18 exfil window | yes |
| 1 · Vendor research | Arctic Wolf — Salesforce theft via Drift OAuth | Bulk SOQL export; suspicious User-Agents; Tor/VPS source IPs; secret harvesting | yes |
| 1 · SaaS-security | AppOmni / Silverfort — Drift breach (UNC6395) | Connected-App risk model; cross-vendor lateral movement; embedded-secret theft (AWS/Snowflake/VPN) | yes |
| 2 · Gov / vendor | FBI advisory · FINRA alert · SOCRadar | Active Salesforce compromise & extortion; 700+ orgs; remediation timeline | partial |
Decisions: SaaS-log-first (no endpoint footprint — the access was a legitimate Connected App); detections target Salesforce Event Monitoring / API audit; CQL written for Salesforce logs ingested into NG-SIEM, flagged schema-dependent; the durable lesson is Connected-App OAuth governance, not blocking Drift specifically.
Hunt Brief & Attack Chain
Working hypothesis: The Drift Connected App's OAuth token is used from an attacker-controlled environment (Tor/VPS, anomalous User-Agent) to run bulk SOQL queries against Salesforce objects, exporting records and secret-bearing fields, with no interactive login.
| Step | Behavior | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 · Token theft | Drift integration compromised; OAuth tokens stolen (upstream) | Vendor advisory | N4 (Connected-App review) |
| 2 · API access | Drift OAuth token used for Salesforce API from attacker infra | Salesforce LoginHistory / EventLog | Q2; N2 |
| 3 · Bulk export | SOQL queries over Account/Contact/Case/Opportunity; large record counts | Salesforce ApiEvent / BulkApi | Q1 / Q4; N1, N3 |
| 4 · Secret harvest | Exfil of AWS keys / Snowflake / VPN creds embedded in fields | (post-exfil; offline secret-scan) | Q5 (downstream use) |
| 5 · Cover | Tor/VPS egress; benign-looking User-Agent | Salesforce source IP / UA | Q3; N2 |
| 6 · Extortion / pivot | Use of leaked AWS/Snowflake/VPN creds in other clouds | cloud audit logs | Q6 |
Affected surface & telemetry
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Salesforce | Event Monitoring / ApiEvent / LoginHistory ingested into NG-SIEM | Critical | High if not ingested — the whole pack depends on it |
| Connected Apps / OAuth | OAuth usage + Connected-App audit | High | Medium — review third-party integrations |
| Downstream clouds | AWS/Snowflake/VPN audit (for leaked-cred use) | High | Medium — needs multi-cloud log ingestion |
| Endpoint | — | Low | Gap no endpoint footprint (legit Connected App) |
Consolidated IOC Table
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| Behavior | Drift Connected App bulk SOQL export (high record counts) | high | detect | Mass data theft — flagship |
| Network | Salesforce API access from Tor exit nodes / VPS ASNs | high | detect | Attacker-infra source IPs |
| UA | anomalous / non-standard User-Agent on Drift token API calls | medium | hunt | Attacker tooling fingerprint |
| Data | AWS keys · Snowflake tokens · VPN creds embedded in SF fields | high | detect | Rotate — assume stolen |
| Config | Drift / risky third-party Connected Apps with broad OAuth scopes | medium | hunt | Revoke / scope down |
ATT&CK Mapping
| Tactic | Technique | Observed Behavior | Query / Control |
|---|---|---|---|
| Initial Access | T1199 — Trusted Relationship | Compromised Drift integration → trusted Salesforce access | N4; OAuth governance (§10) |
| Credential Access | T1528 — Steal Application Access Token | Drift OAuth tokens stolen | N4; token revocation |
| Defense Evasion / Lateral | T1550.001 — Use Alternate Auth Material (app token) | Token used from attacker infra; looks like Drift traffic | Q1, Q2, Q3 |
| Collection | T1213 — Data from Information Repositories (SaaS) | Bulk SOQL export of SF objects | Q1, Q4; N1, N3 |
| Credential Access | T1552.001 — Credentials in files/fields | AWS/Snowflake/VPN secrets in SF text fields | Q5; rotation |
| Exfiltration / Impact | T1567 / T1657 — Exfil over web / financial extortion | Data theft → extortion; leaked-cred reuse | Q6; cloud audit |
Native Audit-Log Hunts (Salesforce / SaaS — primary surface)
| Hunt | Source | Logic | Response |
|---|---|---|---|
| N1 · Drift app bulk export | Salesforce Event Monitoring (ApiEvent / BulkApiResultEvent) | Drift Connected App running large SOQL queries / bulk exports of Account/Contact/Case/Opportunity | Revoke Drift token; scope blast radius |
| N2 · Anomalous source IP | Salesforce LoginHistory / LoginEvent | Drift OAuth API access from Tor exit nodes / VPS ASNs / new geographies | Block; confirm with the integration owner |
| N3 · Mass record access | Salesforce ReportExportEvent / API record counts | Record-volume spikes well above the integration's normal baseline | Investigate exported objects; notify DPO |
| N4 · Connected-App / OAuth review | Salesforce Connected Apps OAuth Usage | Inventory third-party Connected Apps + their OAuth scopes; flag broad/unused grants | Revoke Drift + risky apps; scope down |
| N5 · Leaked-secret use | AWS CloudTrail / Snowflake / VPN logs | Use of AWS keys / Snowflake tokens / VPN creds that were stored in Salesforce | Rotate all; hunt downstream |
CrowdStrike LogScale CQL Hunt Queries
Looks for: API/SOQL events attributed to the Drift Connected App returning large row counts over key objects. Accomplishes: the core mass-export signal. FP: legitimate Drift sync — baseline its normal volume.
// HUNT: Drift Connected App bulk SOQL export (UNC6395) // MITRE: T1213, T1550.001 | CONF: high FP: low-med COST: med // NOTE: field tokens depend on your Salesforce->NG-SIEM parser — validate connectedAppName=/drift/i | Query=/SELECT.+FROM\s+(Account|Contact|Case|Opportunity|Lead|User)/i | groupBy([connectedAppName, sessionKey, sourceIp], function=[count(as=calls), sum(field=rowsProcessed, as=rows)]) | rows>=1000 | table([connectedAppName, sessionKey, sourceIp, calls, rows], limit=200)
Looks for: Drift Connected-App API activity from Tor exit nodes / hosting-provider (VPS) ASNs or new geographies. Accomplishes: attacker-infra detection. FP: none if you maintain the Drift egress allow-list.
// HUNT: Drift token API access from anomalous source IP (Tor/VPS) // MITRE: T1550.001 | CONF: high FP: low-med COST: low // TUNING: maintain Drift's known egress CIDRs; enrich sourceIp with Tor/hosting-ASN feeds connectedAppName=/drift/i | sourceIp!=/^(REPLACE_WITH_DRIFT_EGRESS_CIDRS)/ | (asnType=/hosting|vps|tor/i or isTorExitNode=true) | table([connectedAppName, userPrincipalName, sourceIp, autonomousSystemNumber, @timestamp], limit=200)
Looks for: Drift API activity whose User-Agent differs from Drift's normal client string (e.g., generic Python/requests/curl). FP: Drift UA changes on updates — baseline first.
// HUNT: anomalous User-Agent on Drift Connected App API // MITRE: T1550.001 | CONF: medium FP: medium COST: low // TUNING: baseline Drift's legitimate User-Agent(s); flag python/requests/curl/Go-http-client connectedAppName=/drift/i | userAgent=/(python-requests|curl|Go-http-client|okhttp|^$|libwww|axios)/i | table([connectedAppName, userAgent, sourceIp, @timestamp], limit=200)
Looks for: any Connected App / session exporting record volumes well above baseline. Accomplishes: catches mass theft even by a different abused integration. FP: legitimate bulk jobs — baseline per app.
// HUNT: Salesforce mass-record export spike (any integration) // MITRE: T1213 | CONF: med-high FP: medium COST: med // TUNING: set the threshold from your per-app baseline; include ReportExport + BulkApi events eventType=/ApiEvent|BulkApiResultEvent|ReportExportEvent/i | groupBy([connectedAppName, userPrincipalName, sessionKey], function=[sum(field=rowsProcessed, as=rows)]) | rows>=5000 | sort(rows, order=desc)
Looks for: queries touching objects/fields known to hold secrets (notes, case bodies, custom cred fields). Accomplishes: prioritizes which secrets to rotate first. FP: depends on knowing where secrets live in your org.
// HUNT: access to Salesforce fields/objects known to hold secrets // MITRE: T1552.001 | CONF: medium FP: medium COST: low // TUNING: populate your org's secret-bearing objects/fields (notes, case bodies, custom cred fields) eventType=/ApiEvent|BulkApiResultEvent/i | Query=/(AKIA|ASIA|snowflakecomputing|VpnSecret|password|secret|apikey|token)/i | table([connectedAppName, userPrincipalName, sourceIp, Query, @timestamp], limit=200)
Looks for: AWS/Snowflake API use (in your cloud logs) from new IPs/ASNs for keys that were stored in Salesforce. Accomplishes: catches the lateral pivot. FP: requires cloud-audit ingestion + the list of exposed keys.
// HUNT: leaked-credential use downstream (AWS/Snowflake) from new infra // MITRE: T1550.001, T1078.004 | CONF: medium FP: medium COST: med // REQUIRES: AWS CloudTrail / Snowflake logs ingested; populate the exposed-key list // TUNING: populate BOTH REPLACE_WITH lists before running -- left unpopulated the accessKeyId regex matches nothing and a clean result proves nothing. Known-good CIDRs must cover CI/CD egress and SaaS integration ranges, or every legitimate automated call fires. eventSource=/cloudtrail|snowflake/i | accessKeyId=/REPLACE_WITH_EXPOSED_KEY_IDS/i | sourceIPAddress!=/^(REPLACE_WITH_KNOWN_GOOD_CIDRS)/ | table([eventSource, accessKeyId, sourceIPAddress, eventName, @timestamp], limit=200)
Detection Recommendations (SaaS / NG-SIEM)
| Detection | Logic | Benign Exclusions | Deployment Path |
|---|---|---|---|
| Connected-App bulk export from anomalous IP | Q1 + Q2 correlated: a Connected App doing bulk SOQL from a Tor/VPS IP outside its egress allow-list | The integration's known egress CIDRs | SSPM policy / NG-SIEM correlation rule |
| Mass-record export baseline breach | Q4: per-app record-export volume above a learned baseline | Sanctioned scheduled bulk jobs | SSPM anomaly policy |
| OAuth-scope governance | N4: alert on new/over-scoped third-party Connected Apps | Reviewed/approved integrations | SSPM + change control |
Machine-Readable IOC Appendix
Grouped IOC Quick-Copy
One-click blocks for SaaS hunting, OAuth governance, and the rotation checklist. This is a config/identity threat — the "IOCs" are access-pattern anomalies + the secrets to rotate.
# Salesforce Event Monitoring objects to hunt over: ApiEvent / BulkApiResultEvent # API + bulk export volume per Connected App LoginHistory / LoginEvent # source IP, app, User-Agent ReportExportEvent # mass report exports ConnectedApplication / OAuthToken # third-party app inventory + token usage # Pivot on: ConnectedAppName='Drift', high rowsProcessed, Tor/VPS sourceIp, odd userAgent, # objects Account/Contact/Case/Opportunity/Lead/User
Drift Connected App running bulk SOQL exports (high record counts) over key objects Drift OAuth API access from Tor exit nodes / hosting-provider (VPS) ASNs / new geos Anomalous User-Agent on Drift API calls (python-requests/curl/Go-http-client/empty) Per-app record-export volume far above baseline (any integration) Queries touching secret-bearing fields (AWS AKIA/ASIA, snowflakecomputing, VPN creds) Downstream use of AWS/Snowflake keys that were stored in Salesforce, from new infra
# If you used Salesloft Drift -> treat as compromised (Aug 8-18, 2025 window): 1. Revoke the Drift OAuth token + any Salesloft/Drift Connected App (done org-wide Aug 20) 2. Rotate EVERY secret that was stored in Salesforce text/notes fields: - AWS access keys (AKIA/ASIA), Snowflake tokens, VPN credentials, API keys 3. Hunt downstream clouds (CloudTrail/Snowflake) for use of those keys (Q6/N5) 4. Review ALL third-party Connected Apps + OAuth scopes; remove unused/over-scoped grants 5. Stop storing secrets in CRM free-text fields (root cause)
# UNC6395 / Salesloft Drift -> Salesforce (Aug 2025): 700+ organizations # Publicly named victims include: Zscaler, Palo Alto Networks, Proofpoint, Cloudflare, Tenable # Remediation timeline: Aug 20, 2025 - all Drift OAuth tokens revoked; Drift pulled from AppExchange # Stolen data now fuels extortion (per FBI advisory) — expect follow-on contact
Hardening — Tiered & Deployable
The root causes are over-trusted OAuth integrations and secrets stored in CRM fields — fix both.
- Revoke the Drift token + audit all third-party Connected Apps — M1018. Remove unused/over-scoped OAuth grants.
- Rotate every secret stored in Salesforce fields — M1027. AWS keys, Snowflake tokens, VPN creds — assume stolen; hunt downstream use (Q6/N5).
- Enable Salesforce Event Monitoring + ingest into NG-SIEM/SSPM — M1047. Without these logs you are blind to this attack class.
- Restrict Connected-App access by IP allow-list — M1037. Bind integrations to their known egress CIDRs (kills Tor/VPS abuse, Q2).
- OAuth scope minimization + admin-approval for new Connected Apps — M1018. No broad/standing grants.
- SSPM anomaly policies on export volume + source IP — M1047. Operationalize Q1/Q4.
- Stop storing secrets in CRM free-text; DLP scan existing fields — M1057. Removes the prize.
- Treat every SaaS integration as an extension of your attack surface — M1047. Continuous Connected-App inventory + risk scoring.
- Short-lived / scoped integration tokens; periodic re-consent — M1018 / M1026.
- Cross-vendor IR plan for SaaS supply-chain breaches — M1047. Drift showed one token can hit 700+ orgs.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Revoke the Drift OAuth token + disable the Connected App; IP-restrict remaining integrations | SaaS Admin / SOC | Revocation timestamp; app list |
| Triage | From Salesforce Event Monitoring, determine which objects/records were exported (Q1/Q4) and from which IPs (Q2); identify secret-bearing fields touched (Q5) | IR | Export inventory; source IPs; secret list |
| Eradicate | Rotate ALL secrets stored in Salesforce; remove over-scoped Connected Apps; block attacker IPs/ASNs | IR / Cloud | Rotation log; revoked apps |
| Recover | Hunt downstream clouds for leaked-cred use (Q6/N5); notify affected parties / DPO; prepare for extortion contact | IR / Legal | Downstream hunt results; notifications |
| Harden | Event Monitoring + SSPM; IP-restrict integrations; stop storing secrets in CRM fields | SaaS Admin | Control status; DLP scan |
Detection Coverage Map & Validation
| Technique | Behavior | CQL | Native | Coverage |
|---|---|---|---|---|
| T1199 / T1528 | OAuth token theft (upstream) | — | N4 | GAP vendor-side; govern Connected Apps |
| T1550.001 | Token use from attacker infra | Q2, Q3 | N2 | Good with egress allow-list |
| T1213 | Bulk SOQL export | Q1, Q4 | N1, N3 | Good with baseline |
| T1552.001 | Secret-bearing field theft | Q5 | — | Partial needs secret-field map |
| T1550.001 / T1078.004 | Downstream leaked-cred use | Q6 | N5 | Partial needs cloud audit + key list |
| — | Endpoint visibility | — | — | GAP no endpoint footprint by design |
Validation gates: (1) confirm Salesforce Event Monitoring (ApiEvent/Login/ReportExport) ingested into NG-SIEM/SSPM; (2) baseline each Connected App's normal record-export volume + egress CIDRs + User-Agent; (3) test in a sandbox org: a bulk SOQL export from an out-of-allow-list IP fires Q1/Q2/Q4; (4) promote the Q1×Q2 correlation as an SSPM/NG-SIEM detection; maintain the secret-field map (Q5) and exposed-key list (Q6).
Hunt Summary Ticket
TITLE: Hunt — DriftToken / UNC6395 (Salesloft Drift -> Salesforce OAuth theft)
SEVERITY: Critical (SaaS supply-chain breach; 700+ orgs; data extortion)
SCOPE: Salesforce orgs using (or having used) Salesloft Drift; linked clouds
HYPOTHESIS: Stolen Drift OAuth token -> trusted Salesforce API -> bulk SOQL export of
Account/Contact/Case + secret-bearing fields, from Tor/VPS infra, no interactive login.
QUERIES RUN: Q1 Drift bulk SOQL | Q2 Tor/VPS source IP | Q3 anomalous User-Agent |
Q4 mass-export spike | Q5 secret-field access | Q6 downstream leaked-cred use
+ Native N1-N5 (Event Monitoring, login IP, mass export, Connected-App review, cloud audit)
DO FIRST: N1/Q1 + Q2 — if Drift was used, revoke + rotate immediately
FINDINGS: <pending analyst execution>
GAPS: Token theft is vendor-side; needs Event Monitoring + secret-field map + cloud audit
ACTIONS: Revoke Drift + audit Connected Apps; rotate all SF-stored secrets; IP-restrict
integrations; stop storing secrets in CRM fields; promote Q1xQ2 detection
OWNER: HuntPack
VERSION: v0.4 - 2026-06-12
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used For |
|---|---|---|
| 1 | Arctic Wolf — Salesforce theft via Drift OAuth | Bulk SOQL export, Tor/VPS, User-Agent, secret harvesting |
| 1 | AppOmni — Drift breach (UNC6395) & Salesforce OAuth risk | Connected-App risk model, embedded-secret theft, prevention |
| 1 | Anomali — Salesforce–Drift OAuth supply-chain breach recap | Timeline, attribution, scope |
| 2 | Silverfort — cross-vendor lateral movement · SOCRadar — Everything to know | Cross-vendor model; 700+ orgs; remediation |
HuntPack v0.3 · DriftToken / UNC6395 · Generated 2026-06-12 · Defensive use only. This is a SaaS/OAuth supply-chain breach — detections require Salesforce Event Monitoring / API audit logs ingested into NG-SIEM/SSPM, and the CQL field tokens are schema-dependent; validate against your connector. The root fixes are Connected-App governance and not storing secrets in CRM fields.