Back to Intelligence

Qubole Cross-Account Access Abused: IAM Role Assumption & S3 Exfiltration Campaign — OTX Detection Pack

SA
Security Arsenal Team
November 10, 2026
13 min read

A sophisticated supply chain attack campaign has been identified targeting organizations using Qubole's data platform services. Between October 14-26, 2026, an unknown threat actor successfully compromised Qubole's AWS account (805246085872) and weaponized the inherent trust relationships between Qubole and its customer base to conduct lateral movement into enterprise cloud environments.

The attack vector exploits a critical weakness in modern cloud architecture: third-party vendor IAM integrations. By compromising two IAM users within Qubole's infrastructure, the adversary gained the ability to assume integration roles across numerous customer AWS accounts without triggering traditional perimeter defenses. This represents a significant evolution in cloud-native attack methodologies, moving beyond simple credential stuffing to abuse legitimate cross-account trust relationships.

The threat actor conducted extensive reconnaissance across compromised environments, systematically enumerating storage buckets (S3), database instances, and identity resources. This behavior pattern strongly indicates preparation for large-scale data exfiltration and credential harvesting operations. The use of TruffleHog—a legitimate open-source tool designed to discover secrets and API keys in code repositories—suggests the actor was specifically targeting hardcoded credentials, access keys, and authentication tokens within customer environments.

The campaign's infrastructure spans multiple European jurisdictions (Sweden, Belgium, Romania), utilizing VPN services to obfuscate origin and complicate attribution. The geographic distribution and timing patterns suggest a well-resourced adversary with operational security awareness, potentially state-sponsored or a sophisticated criminal organization targeting cloud-hosted intellectual property and customer data.

Threat Actor / Malware Profile

Adversary Classification: Unknown threat actor (UNC group) Primary Tool: TruffleHog (legitimate security tool weaponized for offensive operations) Attack Methodology: Supply chain compromise → Cross-account IAM role assumption → Cloud resource enumeration → Credential harvesting

Distribution Method: The attack originates from compromised Qubole infrastructure. Rather than deploying traditional malware, the adversary leverages native AWS APIs and legitimate IAM trust relationships to access customer environments. This 'living off the land' approach significantly reduces detection surface area, as all API calls appear to originate from a trusted third-party vendor.

Payload Behavior: Upon successful role assumption into customer accounts, the threat actor deploys TruffleHog to scan local file systems, Git repositories, and configuration files for exposed secrets. The tool scans for high-entropy strings, API keys, AWS access keys, database connection strings, and private certificates. Identified credentials are likely exfiltrated via encrypted channels to attacker-controlled infrastructure or used for further privilege escalation within the compromised AWS account.

C2 Communication: Command and control communications leverage standard HTTPS/TLS encrypted channels, likely utilizing AWS CloudFront or legitimate content delivery networks to blend with normal business traffic. The identified IPv4 indicators (45.83.220.211, 57.129.54.120, 185.209.199.73, 89.37.63.175) represent VPN exit nodes or proxy infrastructure used to mask the actor's true origin. These IPs show geolocation diversity across Northern and Eastern Europe, suggesting deliberate infrastructure distribution to evade geo-blocking and complicate threat intelligence correlation.

Persistence Mechanism: The adversary maintains persistence through the creation of additional IAM users or access keys within compromised accounts, establishing backdoor access independent of the initial Qubole trust relationship. This allows continued access even if the original vendor credentials are revoked. Additionally, the actor may modify IAM policies to grant broader permissions or create new cross-account roles for future access.

Anti-Analysis Techniques:

  • Legitimate Tool Abuse: Using TruffleHog, a recognized security tool, allows the actor to bypass application allowlisting and behavioral analytics that flag unknown binaries.
  • API-Based Operations: All malicious activity occurs via standard AWS API calls (CloudTrail logs), making detection dependent on behavioral analysis rather than signature-based detection.
  • VPN Obfuscation: Routing traffic through multiple European VPN providers obscures the true source IP and geographic location of the operators.
  • Trusted Relationship Exploitation: By operating through Qubole's established integration roles, the actor inherits legitimate access permissions, bypassing traditional 'deny-by-default' security controls.

IOC Analysis

The indicators extracted from this OTX pulse represent a multi-layered attack infrastructure requiring immediate operationalization:

IPv4 Indicators (4 total):

  • 45.83.220.211 (SE - Sweden, AS39351 31173 Services AB): Likely VPN exit node or proxy server used for initial reconnaissance and role assumption activities.
  • 57.129.54.120 (BE - Belgium, ASNone): Infrastructure potentially associated with bulletproof hosting or compromised cloud instances used for data staging.
  • 185.209.199.73 (SE - Sweden, ASNone): Secondary command and control or exfiltration endpoint.
  • 89.37.63.175 (RO - Romania, AS1239 Sprint): Eastern European infrastructure component, potentially used for credential harvesting or payload delivery.

File Hash Indicators (3 total):

  • MD5: 086d4a83181971e883c53a4c44f46da2
  • SHA1: 1c7437dac21630f53c0b888b50662c6487e23fd7
  • SHA256: 65f061281c9a712e9502793dc4c5035cae490b84da05f7d4223cefa65ad396e4

These hashes represent the TruffleHog binary or associated tooling compiled for offensive operations. SOC teams should note that TruffleHog is a legitimate tool; detection should focus on execution context (unexpected parent processes, unusual working directories) rather than hash-based blocking alone.

Operationalization Guidance:

For Network Indicators: Implement blocking at egress firewalls and web proxies for the identified IPv4 addresses. However, recognize that VPN infrastructure is ephemeral; focus detection on the behavioral patterns (cross-account role assumption from external IPs) rather than IP blocking alone.

For File Hashes: Deploy these hashes to EDR platforms (CrowdStrike, SentinelOne, Microsoft Defender for Endpoint) as 'suspicious' rather than 'malicious' to trigger investigation workflows without breaking legitimate security scanning activities.

For Cloud Environments: Enable enhanced CloudTrail logging for all IAM role assumption events. Create alerts for AssumeRole API calls where the source IP does not belong to known Qubole IP ranges or where the assumed role has not been used in the preceding 30 days.

Tooling Recommendations:

  • AWS CloudTrail Insights: Enable to detect unusual API activity patterns
  • AWS GuardDuty: Activate for IAM anomaly detection and cryptocurrency mining detection (common follow-on activity)
  • SIEM Integration: Ingest these IOCs into Splunk, Sentinel, or QRadar with 90-day lookback to identify historical compromise

Detection Engineering

YAML
---
title: Qubole Cross-Account Role Assumption Anomaly
id: 8f4e2a1b-3c5d-4e6f-9a8b-1c2d3e4f5a6b
status: experimental
description: Detects suspicious cross-account IAM role assumption originating from non-Qubole IP addresses, indicating potential abuse of vendor trust relationships
author: Security Arsenal Threat Intelligence
references:
    - https://www.wiz.io/blog/qubole-cross-account-access-abused-in-the-wild
date: 2026/11/10
modified: 2026/11/10
tags:
    - attack.t1078.004
    - attack.t1552.005
    - attack.t1199
logsource:
    product: aws
    service: cloudtrail
detection:
    selection:
        eventSource: sts.amazonaws.com
        eventName: AssumeRole
        requestParameters.roleSessionName|contains: 'qubole'
    filter_qubole_ips:
        sourceIPAddress|cidr:
            - '52.0.0.0/8'  # Example Qubole range - update with actual ranges
            - '54.0.0.0/8'
    filter_internal:
        sourceIPAddress|cidr:
            - '10.0.0.0/8'
            - '172.16.0.0/12'
            - '192.168.0.0/16'
    condition: selection and not (filter_qubole_ips or filter_internal)
falsepositives:
    - Legitimate Qubole operations from new IP ranges
    - Internal testing of vendor integrations
level: high
---
title: TruffleHog Execution in AWS Environment
id: 9a5f3b2c-4d6e-5f7a-0b1c-2d3e4f5a6b7c
status: experimental
description: Identifies execution of TruffleHog secret scanning tool, which may indicate credential harvesting activity when executed outside of approved security testing
author: Security Arsenal Threat Intelligence
date: 2026/11/10
modified: 2026/11/10
tags:
    - attack.t1552.001
    - attack.t1059
logsource:
    category: process_creation
    product: windows
detection:
    selection_img:
        Image|endswith:
            - '\trufflehog.exe'
            - '\trufflehog'
    selection_cmd:
        CommandLine|contains:
            - 'trufflehog'
            - '--entropy'
            - '--regex'
    filter_security_team:
        ParentImage|endswith:
            - '\powershell.exe'
            - '\cmd.exe'
        User|contains: 'SECURITY_TEST'
    condition: (selection_img or selection_cmd) and not filter_security_team
falsepositives:
    - Legitimate security team scanning activities
    - DevOps pipeline secret scanning
level: medium
---
title: S3 Bucket Enumeration via Cross-Account Access
id: 0b6c4d3e-5f7a-6b8c-9d0e-1f2a3b4c5d6e
status: experimental
description: Detects rapid enumeration of S3 buckets and objects potentially indicating reconnaissance for data exfiltration following cross-account compromise
author: Security Arsenal Threat Intelligence
date: 2026/11/10
modified: 2026/11/10
tags:
    - attack.t1530
    - attack.t1074
logsource:
    product: aws
    service: cloudtrail
detection:
    selection:
        eventSource: s3.amazonaws.com
        eventName:
            - ListBuckets
            - ListObjects
            - GetBucketLocation
            - GetBucketPolicy
    timeframe: 5m
    condition: selection | count() by sourceIPAddress > 20
falsepositives:
    - Legitimate backup operations
    - Data migration activities
    - Inventory management tools
level: medium
KQL — Microsoft Sentinel / Defender
// Hunt for Qubole cross-account access and credential harvesting activities
// Execute in Microsoft Sentinel or Defender ATP

let QuboleIOC = dynamic(["45.83.220.211", "57.129.54.120", "185.209.199.73", "89.37.63.175"]);
let TruffleHogHashes = dynamic(["086d4a83181971e883c53a4c44f46da2", "1c7437dac21630f53c0b888b50662c6487e23fd7", "65f061281c9a712e9502793dc4c5035cae490b84da05f7d4223cefa65ad396e4"]);

// Check for network connections to suspicious IPs
DeviceNetworkEvents
| where TimeGenerated > ago(30d)
| where RemoteIP in (QuboleIOC)
| project TimeGenerated, DeviceName, RemoteIP, RemotePort, InitiatingProcessFileName, InitiatingProcessCommandLine
| join kind=inner (
    DeviceProcessEvents
    | where TimeGenerated > ago(30d)
    | project DeviceName, ProcessId, FileName, CommandLine, InitiatingProcessFileName
) on DeviceName, InitiatingProcessFileName
| summarize FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated), Connections = count() by DeviceName, RemoteIP, FileName, CommandLine
| order by Connections desc;

// Check for TruffleHog execution
union isfuzzy=true
(DeviceProcessEvents
| where TimeGenerated > ago(30d)
| where FileName contains "trufflehog" or CommandLine contains "trufflehog"
| project TimeGenerated, DeviceName, FileName, CommandLine, InitiatingProcessFileName, AccountName),
(DeviceFileEvents
| where TimeGenerated > ago(30d)
| where FileName contains "trufflehog"
| project TimeGenerated, DeviceName, FileName, FolderPath, InitiatingProcessFileName)
| summarize FirstExecution = min(TimeGenerated) by DeviceName, FileName, CommandLine;

// AWS CloudTrail analysis for anomalous AssumeRole events
AWSCloudTrail
| where TimeGenerated > ago(30d)
| where EventSource == "sts.amazonaws.com"
| where EventName == "AssumeRole"
| where SourceIpAddress in (QuboleIOC) or SourceIpAddress !startswith "52." // Filter out known Qubole ranges
| extend RoleArn = tostring(parse_json(RequestParameters).roleArn)
| extend SessionName = tostring(parse_json(RequestParameters).roleSessionName)
| where SessionName contains "qubole" or RoleArn contains "qubole"
| project TimeGenerated, SourceIpAddress, RoleArn, SessionName, UserIdentityPrincipalId, UserIdentityArn
| summarize RoleAssumptions = count() by SourceIpAddress, RoleArn
| order by RoleAssumptions desc;
PowerShell
# Qubole Compromise Hunt Script
# Run on endpoints and AWS CloudTrail logs to identify artifacts of Qubole cross-account abuse
# Requires: AWS CLI, appropriate IAM permissions

$ErrorActionPreference = "SilentlyContinue"
$Date = Get-Date -Format "yyyy-MM-dd"
$ReportPath = "C:\Security\Qubole_Hunt_Report_$Date.txt"

# Known malicious IPs from OTX pulse
$MaliciousIPs = @(
    "45.83.220.211",
    "57.129.54.120",
    "185.209.199.73",
    "89.37.63.175"
)

# TruffleHog indicators
$TruffleHogHashes = @(
    "086d4a83181971e883c53a4c44f46da2",
    "1c7437dac21630f53c0b888b50662c6487e23fd7",
    "65f061281c9a712e9502793dc4c5035cae490b84da05f7d4223cefa65ad396e4"
)

function Write-Log {
    param($Message)
    $LogEntry = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] $Message"
    Add-Content -Path $ReportPath -Value $LogEntry
    Write-Host $LogEntry
}

Write-Log "=== Qubole Cross-Account Compromise Hunt Started ==="

# Check 1: Network connections to malicious IPs
Write-Log "`n[+] Checking network connections to suspicious IPs..."
$Connections = Get-NetTCPConnection | Where-Object { $_.RemoteAddress -in $MaliciousIPs }
if ($Connections) {
    Write-Log "[!] ALERT: Found connections to malicious IPs:"
    $Connections | ForEach-Object {
        Write-Log "    - $($_.LocalAddress):$($_.LocalPort) -> $($_.RemoteAddress):$($_.RemotePort) [$($_.State)]"
    }
} else {
    Write-Log "    No active connections to malicious IPs detected"
}

# Check 2: DNS cache for malicious IPs
Write-Log "`n[+] Checking DNS cache for malicious IP resolution..."
$DNSCache = Get-DnsClientCache | Where-Object { $_.Data -in $MaliciousIPs }
if ($DNSCache) {
    Write-Log "[!] Found DNS cache entries:"
    $DNSCache | ForEach-Object { Write-Log "    - $($_.Name) -> $($_.Data)" }
}

# Check 3: TruffleHog execution artifacts
Write-Log "`n[+] Searching for TruffleHog binaries..."
$SearchPaths = @("C:\Users", "C:\ProgramData", "C:\Windows\Temp", $env:TEMP)
foreach ($Path in $SearchPaths) {
    $Files = Get-ChildItem -Path $Path -Recurse -Filter "*trufflehog*" -ErrorAction SilentlyContinue | Select-Object -First 10
    if ($Files) {
        Write-Log "[!] Found suspicious files:"
        $Files | ForEach-Object {
            $Hash = (Get-FileHash -Path $_.FullName -Algorithm SHA256 -ErrorAction SilentlyContinue).Hash
            $Match = if ($TruffleHogHashes -contains $Hash) { " [KNOWN MALICIOUS]" } else { "" }
            Write-Log "    - $($_.FullName)$Match"
        }
    }
}

# Check 4: Recent AWS credential usage
Write-Log "`n[+] Checking AWS CLI credential files..."
$AWSCredsPath = "$env:USERPROFILE\.aws\credentials"
if (Test-Path $AWSCredsPath) {
    $CredsContent = Get-Content $AWSCredsPath -Raw
    if ($CredsContent -match "qubole") {
        Write-Log "[!] Found Qubole references in AWS credentials file"
        Write-Log "    Path: $AWSCredsPath"
        Write-Log "    Last Modified: $((Get-Item $AWSCredsPath).LastWriteTime)"
    }
}

# Check 5: Event logs for suspicious process execution (TruffleHog)
Write-Log "`n[+] Checking Windows Event Logs for TruffleHog execution..."
$Events = Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4688} -MaxEvents 5000 | 
    Where-Object { $_.Message -match "trufflehog" } | 
    Select-Object TimeCreated, Message -First 20

if ($Events) {
    Write-Log "[!] Found TruffleHog execution events:"
    $Events | ForEach-Object {
        Write-Log "    - $($_.TimeCreated): $($_.Message.Substring(0, [Math]::Min(200, $_.Message.Length)))..."
    }
}

# Check 6: AWS CloudTrail for AssumeRole events (requires AWS CLI)
Write-Log "`n[+] Querying AWS CloudTrail for suspicious AssumeRole events..."
try {
    $StartTime = (Get-Date).AddDays(-30).ToString("yyyy-MM-ddTHH:mm:ss")
    $EndTime = (Get-Date).ToString("yyyy-MM-ddTHH:mm:ss")
    
    $Events = aws cloudtrail lookup-events `
        --lookup-attributes AttributeKey=EventName,AttributeValue=AssumeRole `
        --start-time $StartTime `
        --end-time $EndTime `
        --max-results 100 `
        --query 'Events[?contains(CloudTrailEvent, `qubole`)]' `
        --output json 2>$null
    
    if ($Events -and $Events -ne "[]") {
        Write-Log "[!] Found Qubole-related AssumeRole events in CloudTrail"
        $Events | Out-File -Append $ReportPath
    } else {
        Write-Log "    No Qubole-related AssumeRole events found in CloudTrail"
    }
} catch {
    Write-Log "    [!] AWS CLI not configured or insufficient permissions to query CloudTrail"
}

# Check 7: Recent IAM user creation or access key generation
Write-Log "`n[+] Checking for recently created IAM users or access keys..."
try {
    $Users = aws iam list-users --query 'Users[?CreateDate>`2026-10-01`]' --output json 2>$null
    if ($Users -and $Users -ne "[]") {
        Write-Log "[!] Recently created IAM users detected:"
        $Users | Out-File -Append $ReportPath
    }
    
    $AccessKeys = aws iam list-access-keys --query 'AccessKeyMetadata[?CreateDate>`2026-10-01`]' --output json 2>$null
    if ($AccessKeys -and $AccessKeys -ne "[]") {
        Write-Log "[!] Recently created access keys detected:"
        $AccessKeys | Out-File -Append $ReportPath
    }
} catch {
    Write-Log "    [!] Unable to query IAM information"
}

Write-Log "`n=== Hunt Complete ==="
Write-Log "Report saved to: $ReportPath"

# Generate summary
$Summary = @"
`n=== EXECUTIVE SUMMARY ===
Date: $(Get-Date)
Hostname: $env:COMPUTERNAME
User: $env:USERNAME
Malicious IPs Checked: $($MaliciousIPs.Count)
TruffleHog Hashes Checked: $($TruffleHogHashes.Count)

Recommended Actions:
1. Review AWS CloudTrail for unauthorized AssumeRole events
2. Rotate all IAM access keys potentially exposed to Qubole integration
3. Review S3 bucket policies for unauthorized external access
4. Audit secrets stored in code repositories and configuration files
5. Implement least-privilege for cross-account roles
"@

Add-Content -Path $ReportPath -Value $Summary
Write-Host $Summary

Response Priorities

Immediate (0-4 hours):

  1. Network Isolation: Block egress traffic to the identified IPv4 addresses (45.83.220.211, 57.129.54.120, 185.209.199.73, 89.37.63.175) at the firewall and web proxy level. Implement DNS sinkholing for any domains resolving to these IPs.

  2. Credential Rotation: Immediately rotate all AWS access keys and IAM credentials that may have been exposed through Qubole integrations. Prioritize credentials with administrative or broad S3 access permissions.

  3. Hunt for TruffleHog: Deploy the provided PowerShell script across endpoints to identify TruffleHog execution. Search for the specific SHA256 hash (65f061281c9a712e9502793dc4c5035cae490b84da05f7d4223cefa65ad396e4) in EDR platforms.

  4. CloudTrail Audit: Query AWS CloudTrail for AssumeRole events originating from non-Qubole IP addresses within the past 30 days. Focus on roles with 'Qubole' in the name or session name.

24 Hours:

  1. Identity Verification: Force password resets and MFA re-enrollment for all IAM users who accessed AWS environments during the compromise window (October 14-26, 2026). Review CloudTrail for API calls made with temporary credentials generated during this period.

  2. S3 Access Review: Audit all S3 bucket access logs for unusual ListBucket or GetObject operations from external IP addresses. Identify any data exfiltration patterns or unauthorized bucket policy modifications.

  3. Secret Scanning: Conduct comprehensive scanning of code repositories, configuration files, and environment variables for exposed AWS credentials, API keys, or database connection strings that may have been harvested by TruffleHog.

  4. Vendor Communication: Contact Qubole to determine the scope of their compromise and obtain a list of potentially affected customer accounts. Request indicators of compromise specific to your organization's integration.

1 Week:

  1. Architecture Hardening: Implement least-privilege IAM policies for all third-party vendor integrations. Remove blanket S3 access and restrict cross-account roles to specific buckets or prefixes required for business operations.

  2. Enhanced Monitoring: Deploy AWS GuardDuty and enable S3 protection. Configure CloudTrail Insights to detect anomalous API call patterns. Implement alerting for any AssumeRole events originating from IP addresses outside expected geographic regions.

  3. Zero Trust Implementation: Transition from implicit trust models to explicit verification for all cross-account access. Implement AWS Resource Access Manager (RAM) with strict permission boundaries and session policies that expire after 1 hour.

  4. Supply Chain Audit: Review all third-party vendors with AWS access to your environment. Require SOC 2 Type II reports and evidence of MFA enforcement for vendor personnel. Implement contractual requirements for immediate breach notification.

Related Resources

Security Arsenal Incident Response Managed SOC & MDR Services AlertMonitor Threat Detection From The Dark Side Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.