DriftToken — Salesloft Drift → Salesforce OAuth Data Theft (UNC6395)

UNC6395 stole OAuth tokens from the Salesloft Drift integration and used that trusted API access to bulk-export data from 700+ orgs' Salesforce instances (Aug 8–18, 2025) — then secret-scanned the loot for AWS keys, Snowflake & VPN credentials. A SaaS supply-chain breach: detection lives in Salesforce/SaaS audit logs, not the endpoint. Defensive hunt & harden pack.
Threat
UNC6395 (Salesloft Drift OAuth supply-chain theft)
Severity
SAAS BREACH · 700+ ORGS
Type
OAuth token theft · trusted-relationship abuse · data extortion
Window
Aug 8–18, 2025 · tokens revoked Aug 20
Surface
Salesforce · linked SaaS · embedded secrets
Version
v0.4 · 2026-06-12
Author
HuntPack
01

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.

Defender priority: This is a SaaS/identity hunt — you need Salesforce Event Monitoring / API audit logs ingested. Highest-value signals: N1/Q1 (the Drift Connected App running bulk SOQL exports) and Q2/Q3 (Salesforce API access from Tor/VPS IPs or anomalous User-Agents). If you used Drift, assume token theft, revoke + rotate, and treat any embedded secrets in Salesforce as compromised.

02

Source Review & Web Hunter Notes

TierSourceKey FindingCarry
1 · Vendor researchGoogle Threat Intelligence (GTIG) — UNC6395OAuth-token theft via Drift; trusted Salesforce API access; Aug 8–18 exfil windowyes
1 · Vendor researchArctic Wolf — Salesforce theft via Drift OAuthBulk SOQL export; suspicious User-Agents; Tor/VPS source IPs; secret harvestingyes
1 · SaaS-securityAppOmni / Silverfort — Drift breach (UNC6395)Connected-App risk model; cross-vendor lateral movement; embedded-secret theft (AWS/Snowflake/VPN)yes
2 · Gov / vendorFBI advisory · FINRA alert · SOCRadarActive Salesforce compromise & extortion; 700+ orgs; remediation timelinepartial

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.

03

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.

StepBehaviorTelemetryHunt Angle
1 · Token theftDrift integration compromised; OAuth tokens stolen (upstream)Vendor advisoryN4 (Connected-App review)
2 · API accessDrift OAuth token used for Salesforce API from attacker infraSalesforce LoginHistory / EventLogQ2; N2
3 · Bulk exportSOQL queries over Account/Contact/Case/Opportunity; large record countsSalesforce ApiEvent / BulkApiQ1 / Q4; N1, N3
4 · Secret harvestExfil of AWS keys / Snowflake / VPN creds embedded in fields(post-exfil; offline secret-scan)Q5 (downstream use)
5 · CoverTor/VPS egress; benign-looking User-AgentSalesforce source IP / UAQ3; N2
6 · Extortion / pivotUse of leaked AWS/Snowflake/VPN creds in other cloudscloud audit logsQ6

Affected surface & telemetry

SurfaceRequired TelemetryPriorityGap Risk
SalesforceEvent Monitoring / ApiEvent / LoginHistory ingested into NG-SIEMCriticalHigh if not ingested — the whole pack depends on it
Connected Apps / OAuthOAuth usage + Connected-App auditHighMedium — review third-party integrations
Downstream cloudsAWS/Snowflake/VPN audit (for leaked-cred use)HighMedium — needs multi-cloud log ingestion
EndpointLowGap no endpoint footprint (legit Connected App)
04

Consolidated IOC Table

The abused app (Drift) is a legitimate integration — the indicators are access-pattern anomalies in Salesforce logs, plus the secrets to rotate. Copy-ready blocks (objects, UA, response actions) in §9.
TypeValueConfActionContext
BehaviorDrift Connected App bulk SOQL export (high record counts)highdetectMass data theft — flagship
NetworkSalesforce API access from Tor exit nodes / VPS ASNshighdetectAttacker-infra source IPs
UAanomalous / non-standard User-Agent on Drift token API callsmediumhuntAttacker tooling fingerprint
DataAWS keys · Snowflake tokens · VPN creds embedded in SF fieldshighdetectRotate — assume stolen
ConfigDrift / risky third-party Connected Apps with broad OAuth scopesmediumhuntRevoke / scope down
05

ATT&CK Mapping

TacticTechniqueObserved BehaviorQuery / Control
Initial AccessT1199 — Trusted RelationshipCompromised Drift integration → trusted Salesforce accessN4; OAuth governance (§10)
Credential AccessT1528 — Steal Application Access TokenDrift OAuth tokens stolenN4; token revocation
Defense Evasion / LateralT1550.001 — Use Alternate Auth Material (app token)Token used from attacker infra; looks like Drift trafficQ1, Q2, Q3
CollectionT1213 — Data from Information Repositories (SaaS)Bulk SOQL export of SF objectsQ1, Q4; N1, N3
Credential AccessT1552.001 — Credentials in files/fieldsAWS/Snowflake/VPN secrets in SF text fieldsQ5; rotation
Exfiltration / ImpactT1567 / T1657 — Exfil over web / financial extortionData theft → extortion; leaked-cred reuseQ6; cloud audit
06

Native Audit-Log Hunts (Salesforce / SaaS — primary surface)

HuntSourceLogicResponse
N1 · Drift app bulk exportSalesforce Event Monitoring (ApiEvent / BulkApiResultEvent)Drift Connected App running large SOQL queries / bulk exports of Account/Contact/Case/OpportunityRevoke Drift token; scope blast radius
N2 · Anomalous source IPSalesforce LoginHistory / LoginEventDrift OAuth API access from Tor exit nodes / VPS ASNs / new geographiesBlock; confirm with the integration owner
N3 · Mass record accessSalesforce ReportExportEvent / API record countsRecord-volume spikes well above the integration's normal baselineInvestigate exported objects; notify DPO
N4 · Connected-App / OAuth reviewSalesforce Connected Apps OAuth UsageInventory third-party Connected Apps + their OAuth scopes; flag broad/unused grantsRevoke Drift + risky apps; scope down
N5 · Leaked-secret useAWS CloudTrail / Snowflake / VPN logsUse of AWS keys / Snowflake tokens / VPN creds that were stored in SalesforceRotate all; hunt downstream
07

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.
These queries run against Salesforce Event Monitoring / API logs ingested into NG-SIEM / LogScale, not endpoint telemetry. Field names depend on your Salesforce→NG-SIEM connector/parser. Validate field paths against your schema before deploying — the logic carries over; the exact tokens may differ.
Q1 · Drift Connected App bulk SOQL export
CONF HIGHFP LOW-MEDCOST MED

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)
Q2 · Drift OAuth API access from Tor/VPS source IPs
CONF HIGHFP LOW-MEDCOST LOW

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)
Q3 · Anomalous User-Agent on Drift token API calls
CONF MEDFP MEDCOST LOW

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)
Q4 · Salesforce mass-record export volume spike
CONF MED-HIGHFP MEDCOST MED

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)
Q5 · Secret-bearing field access (AWS/Snowflake/VPN)
CONF MEDFP MEDCOST LOW

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)
Q6 · Downstream use of leaked AWS/Snowflake credentials
CONF MEDFP MEDCOST MED

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)
08

Detection Recommendations (SaaS / NG-SIEM)

There is no endpoint behavior to key on — this is pure SaaS abuse. Promote the detections as SaaS-security (SSPM) policies + NG-SIEM correlation rules over Salesforce Event Monitoring, not endpoint IOAs.
DetectionLogicBenign ExclusionsDeployment Path
Connected-App bulk export from anomalous IPQ1 + Q2 correlated: a Connected App doing bulk SOQL from a Tor/VPS IP outside its egress allow-listThe integration's known egress CIDRsSSPM policy / NG-SIEM correlation rule
Mass-record export baseline breachQ4: per-app record-export volume above a learned baselineSanctioned scheduled bulk jobsSSPM anomaly policy
OAuth-scope governanceN4: alert on new/over-scoped third-party Connected AppsReviewed/approved integrationsSSPM + change control
09

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 Hunt TargetsEvent Monitoring
# 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
Behavioral Signaturesaccess anomalies
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
Rotation Checklistassume stolen
# 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)
Affected (public) Orgscontext
# 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
10

Hardening — Tiered & Deployable

The root causes are over-trusted OAuth integrations and secrets stored in CRM fields — fix both.

Immediate — Revoke & rotate
  • Revoke the Drift token + audit all third-party Connected AppsM1018. Remove unused/over-scoped OAuth grants.
  • Rotate every secret stored in Salesforce fieldsM1027. AWS keys, Snowflake tokens, VPN creds — assume stolen; hunt downstream use (Q6/N5).
  • Enable Salesforce Event Monitoring + ingest into NG-SIEM/SSPMM1047. Without these logs you are blind to this attack class.
  • Restrict Connected-App access by IP allow-listM1037. Bind integrations to their known egress CIDRs (kills Tor/VPS abuse, Q2).
Near term — Govern integrations (pilot first)
  • OAuth scope minimization + admin-approval for new Connected AppsM1018. No broad/standing grants.
  • SSPM anomaly policies on export volume + source IPM1047. Operationalize Q1/Q4.
  • Stop storing secrets in CRM free-text; DLP scan existing fieldsM1057. Removes the prize.
Strategic — Shared-fate SaaS model
  • Treat every SaaS integration as an extension of your attack surfaceM1047. Continuous Connected-App inventory + risk scoring.
  • Short-lived / scoped integration tokens; periodic re-consentM1018 / M1026.
  • Cross-vendor IR plan for SaaS supply-chain breachesM1047. Drift showed one token can hit 700+ orgs.
11

Containment Runbook

PhaseActionsOwnerEvidence
IsolateRevoke the Drift OAuth token + disable the Connected App; IP-restrict remaining integrationsSaaS Admin / SOCRevocation timestamp; app list
TriageFrom Salesforce Event Monitoring, determine which objects/records were exported (Q1/Q4) and from which IPs (Q2); identify secret-bearing fields touched (Q5)IRExport inventory; source IPs; secret list
EradicateRotate ALL secrets stored in Salesforce; remove over-scoped Connected Apps; block attacker IPs/ASNsIR / CloudRotation log; revoked apps
RecoverHunt downstream clouds for leaked-cred use (Q6/N5); notify affected parties / DPO; prepare for extortion contactIR / LegalDownstream hunt results; notifications
HardenEvent Monitoring + SSPM; IP-restrict integrations; stop storing secrets in CRM fieldsSaaS AdminControl status; DLP scan
12

Detection Coverage Map & Validation

TechniqueBehaviorCQLNativeCoverage
T1199 / T1528OAuth token theft (upstream)N4GAP vendor-side; govern Connected Apps
T1550.001Token use from attacker infraQ2, Q3N2Good with egress allow-list
T1213Bulk SOQL exportQ1, Q4N1, N3Good with baseline
T1552.001Secret-bearing field theftQ5Partial needs secret-field map
T1550.001 / T1078.004Downstream leaked-cred useQ6N5Partial needs cloud audit + key list
Endpoint visibilityGAP 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).

13

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
14

Changelog

v0.42026-07-24CQL correctness pass. All 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.
v0.32026-06-12Re-hunt + reformatted to the review-v2 gold layout (fixed left-sidebar scrollspy TOC, collapsible, cloud selector inside the CQL section, per-card Copy/Open-in-Falcon, Grouped IOC Quick-Copy grid with Salesforce-target/rotation blocks, coverage+validation, .ticket). Refreshed from GTIG/Arctic Wolf/AppOmni: UNC6395 attribution, 700+ orgs, Aug 8–18 window, Tor/VPS + User-Agent indicators, embedded-secret theft (AWS/Snowflake/VPN), revocation timeline. 6 CQL (Salesforce-log, schema-dependent) + 5 native hunts.
v0.12026-05-26Initial pack: Salesloft Drift / Salesforce OAuth theft overview + hunts. Pre-gold top-bar layout.
15

References

TierSourceUsed For
1Arctic Wolf — Salesforce theft via Drift OAuthBulk SOQL export, Tor/VPS, User-Agent, secret harvesting
1AppOmni — Drift breach (UNC6395) & Salesforce OAuth riskConnected-App risk model, embedded-secret theft, prevention
1Anomali — Salesforce–Drift OAuth supply-chain breach recapTimeline, attribution, scope
2Silverfort — cross-vendor lateral movement · SOCRadar — Everything to knowCross-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.