TandemTrace
Signal file // INC-005Severity // CriticalConfidence // Confirmed
Public-safe true-positive investigation · AWS identity

AWS access-key compromise followed by IAM privilege escalation

Confirmed unauthorized cloud activity

Public-safe case study Customer names, account IDs, principals, access-key identifiers, IP addresses, resource names, evidence locations, and case-specific identifiers have been removed or replaced. Quantitative findings and defensive lessons are retained for educational use.

Executive assessment

A long-lived access key assigned to a CI service user was used from a first-seen autonomous system to enumerate IAM, assume a deployment role, attach an inline administrator policy, and create a second access key. CloudTrail establishes a confirmed privilege-escalation chain. The original key was disabled 12 minutes 18 seconds after the first unauthorized API call; derived sessions were revoked and the persistence key deleted.

1Compromised access key
7Escalation stages
3AWS accounts reviewed
9,842CloudTrail events searched

95% autonomous investigation. 100% human authority.

TandemTrace AI agents completed 38 of 40 recorded investigation actions autonomously. The cloud security lead retained final verdict approval and containment authorization.

Investigation ownership

Agents reconstructed the identity chain. A human controlled cloud-impact decisions.

95% AI agents
38Autonomous actions2Human decisions
Investigation stageAIHuman
CloudTrail collection100
Identity enrichment80
Session correlation80
Hypothesis testing60
Cross-account scope60
Verdict approval01
Containment authorization01

Investigation dataset

Case context
Alert
GuardDuty · anomalous IAM API activity
First observed
2026-07-30 03:17:22 UTC
Principal
svc-ci-release · long-lived IAM key
Account
Production workload account
Origin
First-seen network · replacement IP
Telemetry reviewed
CloudTrail
9,842 management events · 24 hours
GuardDuty
4 related findings
IAM
23 users · 61 roles · policy history
Organizations
3 accounts · SCP evaluation
Workload
CI logs, Secrets Manager, S3 data events
GetCallerIdentitykey validation
ListRolesIAM discovery
AssumeRolerelease role
PutRolePolicyAdministratorAccess
CreateAccessKeypersistence
ArtifactSanitized valueBaselineAssessment
Access keyAKIA…7Q2MCI runner onlyUsed outside workload network
Source192.0.2[.]81Never observedTEST-NET replacement
User agentaws-cli/2.17 Python/3.11CI uses SDK/GoBaseline mismatch
PolicyEmergencySupportNo approved changeAdministrator wildcard

Evidence that changed the verdict

Impossible workload origin

The access key had only appeared from two fixed CI egress addresses during its 94-day history. The new source and CLI user agent had no baseline match.

Privilege expansion

The assumed role added an inline policy allowing all actions on all resources. No deployment workflow or approved change required IAM mutation.

Persistence created

A second key was created for the service user and immediately validated from the same external source.

Defense checks

The actor queried CloudTrail trail status and account authorization details before attempting Secrets Manager access.

Correlated timeline

03:17:22 · Key validated

GetCallerIdentity succeeds from a first-seen source and user agent.

03:17:49 · IAM discovery

ListUsers, ListRoles, and GetAccountAuthorizationDetails enumerate privilege paths.

03:19:06 · Role assumed

The compromised principal assumes the production release role.

03:20:14 · Privilege escalated

An inline wildcard policy is attached to the role.

03:21:03 · Persistence added

A second access key is created and validated.

03:29:40 · Containment

Both keys disabled, sessions revoked, and the malicious policy removed.

Competing hypotheses

HypothesisEvidence forEvidence againstOutcome
Approved CI deploymentKnown service identityWrong source, user agent, commands, and change windowRejected
Administrator troubleshootingRole name permits deploymentNo SSO session, ticket, owner confirmation, or IAM-change precedentRejected
Stolen long-lived keyBaseline break, discovery, escalation, persistenceExposure location not conclusively identifiedConfirmed use; leak path open

Scope and evidence boundary

Cross-account prevalence

3 accounts · 24h
QuestionResultMeaning
Other use of either key?0 additional sourcesObserved activity confined to one sequence
Other roles assumed?0No confirmed cross-account role chain
Secrets retrieved?3 denied, 0 successfulSecret access not observed
Data-plane access?0 matching S3 data eventsExfiltration not observed in enabled logs

Evidence boundary S3 data events were enabled for protected buckets, but not every bucket in the organization. The investigation cannot claim that no unlogged data-plane access occurred.

Response actions

Disable both access keys and revoke derived sessions

Completed after human authorization.

Remove unauthorized inline policy and snapshot IAM state

Preserve CloudTrail and IAM evidence before remediation.

Rotate downstream credentials accessible to the CI principal

Treat reachable secrets as exposed until validated.

Replace long-lived keys with workload identity

Use short-lived role credentials and restrict assumption by source and context.

Technical evidence

IDSourceEvent UTCPrincipalVerdict contribution
A-01CloudTrail03:17:22svc-ci-releaseBaseline-breaking key use
A-02CloudTrail03:19:06assumed-role/releaseRole chain established
A-03CloudTrail03:20:14assumed-role/releasePrivilege escalation confirmed
A-04CloudTrail03:21:03svc-ci-releasePersistence confirmed
A-05GuardDuty03:22:11access keyAnomalous behavior corroborated

MITRE ATT&CK mapping

TechniqueObserved behavior
T1078.004 · Cloud AccountsCompromised access key authenticated to AWS APIs.
T1087.004 · Cloud Account DiscoveryIAM users and roles enumerated.
T1098.001 · Additional Cloud CredentialsA second access key established persistence.
T1548 · Abuse Elevation Control MechanismInline wildcard policy expanded privileges.
T1526 · Cloud Service DiscoveryAccount and service configuration queried.