Sygnia’s June 2026 incident investigation produced a forensic finding that is now a cornerstone of AI-assisted attack detection: four IAM access keys belonging to four separate AWS accounts were used from the same source IP address within a single second. That specific pattern — multiple authenticated credential sets exercised in parallel from one source, within a sub-second window — is not reconcilable with manual operation. It is the signature of an AI-orchestrated workflow managing concurrent API sessions.
This guide provides detection logic for this pattern and its related signals in AWS CloudTrail, covering both retrospective hunting and alerting use cases.
Understanding the Parallelism Signal
A human operator working through an AWS environment uses one credential at a time. They authenticate with a key, run API calls, switch to another key, run more calls. Even a fast, experienced operator has inherent latency: typing, copy-paste, context-switching between terminal windows. The minimum realistic inter-key switching time for a competent human is several seconds; the realistic average across a focused engagement is 30-60 seconds.
An AI-assisted workflow — or an automated script directed by an AI orchestrator — has no such constraint. It can hold multiple credential contexts in memory, issue API calls in parallel threads, and switch between contexts at processor speed. The Sygnia case produced authenticated API calls from four distinct credential sets within one second. This is the ground truth: AI-assisted parallelism compresses timescales beyond human capability.
Secondary signals that support parallelism findings:
Rapid sequential enumeration: Hundreds of distinct API calls across Secrets Manager, Parameter Store, IAM, and EC2 within minutes from a single session — particularly covering every permission scope the credential has access to in order.
Multi-account access from single source: Multiple accounts within an AWS Organization accessed from the same source IP in the same session window, without an SSO or role-federation flow explaining the cross-account access.
Automated error patterns: AI-directed credential abuse often produces distinctive error patterns — systematic AccessDenied responses across an ordered list of permissions, followed by pivoting to discovered accessible resources. Human attackers are less systematic.
CloudTrail Event Model
All detection logic here targets AWS CloudTrail EventName and associated fields. Key fields:
| Field | Description |
|---|---|
userIdentity.accessKeyId | The access key that made the API call |
userIdentity.principalId | Account-level identity |
userIdentity.accountId | The AWS account number |
sourceIPAddress | Source IP of the API call |
eventTime | Timestamp of the event (ISO 8601) |
eventName | The API action taken |
errorCode | AccessDenied or null for success |
Sigma Rules
Rule 1: Multi-Key Parallelism from Single Source IP
Detects multiple distinct IAM access keys used from the same source IP within a configurable time window. This requires aggregation — the Sigma rule below uses condition: selection | count(userIdentity.accessKeyId) by sourceIPAddress >= 3 to fire when three or more distinct keys appear from the same IP in the event window.
title: AWS IAM Access Key Parallelism from Single Source
id: a7b3c2d1-e4f5-6789-abcd-ef0123456789
status: experimental
description: >
Detects three or more distinct IAM access keys used from the same source IP
address within a short time window. This pattern is characteristic of AI-assisted
attack workflows that operate multiple credential contexts in parallel.
author: SOC Analyst Hub
date: 2026/07/16
references:
- https://www.sygnia.co/blog/inside-an-ai-assisted-cloud-attack/
logsource:
product: aws
service: cloudtrail
detection:
selection:
eventSource: '*'
userIdentity.type: 'IAMUser'
filter_aws_services:
sourceIPAddress|endswith:
- '.amazonaws.com'
condition: selection and not filter_aws_services | count(userIdentity.accessKeyId) by sourceIPAddress > 2
timeframe: 10s
falsepositives:
- AWS automation with explicit multi-account credential rotation
- CI/CD pipelines operating multiple accounts simultaneously from one runner IP
- Multi-account scanning tools (Prowler, Scout Suite) configured to run in parallel
level: high
tags:
- attack.credential_access
- attack.t1078.004
- attack.t1552.005
Rule 2: Rapid Secrets Enumeration
Detects high-volume sequential access to Secrets Manager and Parameter Store secrets, a pattern consistent with AI-assisted credential harvesting.
title: AWS Rapid Secrets Manager Enumeration
id: b8c4d3e2-f5a6-7890-bcde-f01234567890
status: experimental
description: >
Detects rapid enumeration of AWS Secrets Manager secrets suggesting
automated credential harvesting. High GetSecretValue call volumes in
short windows are atypical for human operators.
author: SOC Analyst Hub
date: 2026/07/16
logsource:
product: aws
service: cloudtrail
detection:
selection:
eventName:
- 'GetSecretValue'
- 'ListSecrets'
- 'DescribeSecret'
eventSource: 'secretsmanager.amazonaws.com'
condition: selection | count() by userIdentity.accessKeyId > 20
timeframe: 60s
falsepositives:
- Secrets rotation automation
- Application startup sequences with many secrets
- Infrastructure scanning (HashiCorp Vault migrations)
level: medium
tags:
- attack.credential_access
- attack.t1552.005
Rule 3: Multi-Account Cross-Access from Single Principal
Detects when a single source IP accesses resources across multiple AWS account IDs that are not linked via SSO federation.
title: AWS Cross-Account Access Without Federation from Single IP
id: c9d5e4f3-a6b7-8901-cdef-012345678901
status: experimental
description: >
Detects access to multiple distinct AWS account IDs from the same
source IP without a corresponding AssumeRole or federation event.
Suggests parallel credential operation across accounts.
author: SOC Analyst Hub
date: 2026/07/16
logsource:
product: aws
service: cloudtrail
detection:
selection:
userIdentity.type: 'IAMUser'
errorCode: null
filter_sts:
eventName: 'AssumeRole'
condition: selection and not filter_sts | count(userIdentity.accountId) by sourceIPAddress > 2
timeframe: 30s
falsepositives:
- Legitimate multi-account tools operated from a single jump host
- Org-level scanning from security tooling
level: high
tags:
- attack.lateral_movement
- attack.t1078.004
KQL for Microsoft Sentinel (CloudTrail via S3 or CloudWatch Logs)
Multi-Key Parallelism Query
// AI-Assisted IAM Parallelism Detection
// Finds source IPs using 3+ distinct access keys within 10 seconds
AWSCloudTrail
| where TimeGenerated > ago(24h)
| where UserIdentityType == "IAMUser"
| where not (SourceIpAddress endswith ".amazonaws.com")
| summarize
DistinctKeys = dcount(UserIdentityAccessKeyId),
Keys = make_set(UserIdentityAccessKeyId),
Accounts = make_set(UserIdentityAccountId),
EventCount = count(),
FirstSeen = min(TimeGenerated),
LastSeen = max(TimeGenerated)
by SourceIpAddress, bin(TimeGenerated, 10s)
| where DistinctKeys >= 3
| extend WindowSeconds = datetime_diff('second', LastSeen, FirstSeen)
| project
TimeGenerated,
SourceIpAddress,
DistinctKeys,
Keys,
Accounts,
EventCount,
WindowSeconds
| sort by DistinctKeys desc
Rapid Secrets Enumeration
// Rapid AWS Secrets Manager Enumeration
// Detects >20 secret access calls from one key in 60 seconds
AWSCloudTrail
| where TimeGenerated > ago(24h)
| where EventSource == "secretsmanager.amazonaws.com"
| where EventName in ("GetSecretValue", "ListSecrets", "DescribeSecret")
| summarize
CallCount = count(),
DistinctSecrets = dcount(RequestParameters),
FirstCall = min(TimeGenerated),
LastCall = max(TimeGenerated)
by UserIdentityAccessKeyId, UserIdentityPrincipalId, SourceIpAddress, bin(TimeGenerated, 60s)
| where CallCount > 20
| extend RatePerMinute = round(CallCount * 1.0 / 1.0, 1)
| project
TimeGenerated,
UserIdentityAccessKeyId,
SourceIpAddress,
CallCount,
DistinctSecrets,
RatePerMinute
| sort by CallCount desc
Correlated Multi-Signal Hunt
// Correlate parallelism + secrets + cross-account signals for same source IP
let SuspectIPs =
AWSCloudTrail
| where TimeGenerated > ago(2h)
| where UserIdentityType == "IAMUser"
| summarize DistinctKeys = dcount(UserIdentityAccessKeyId) by SourceIpAddress, bin(TimeGenerated, 30s)
| where DistinctKeys >= 2
| distinct SourceIpAddress;
AWSCloudTrail
| where TimeGenerated > ago(2h)
| where SourceIpAddress in (SuspectIPs)
| summarize
TotalEvents = count(),
DistinctEventNames = dcount(EventName),
DistinctAccounts = dcount(UserIdentityAccountId),
DistinctKeys = dcount(UserIdentityAccessKeyId),
Services = make_set(EventSource),
AccessDeniedCount = countif(ErrorCode == "AccessDenied"),
SecretsCalls = countif(EventSource == "secretsmanager.amazonaws.com"),
IAMCalls = countif(EventSource == "iam.amazonaws.com")
by SourceIpAddress
| where DistinctKeys >= 2 or SecretsCalls > 10
| sort by TotalEvents desc
Hunting Guidance
When investigating a parallelism hit, the following sequence provides rapid triage:
1. Establish key provenance: For each distinct access key seen in the parallelism window, query CloudTrail for the first use of that key ever. Keys created recently and immediately used for high-volume enumeration are higher confidence than keys with long legitimate use histories.
2. Map the access pattern: What services were accessed? Patterns consistent with AI-directed reconnaissance include: IAM (enumerate own permissions), then STS (check role relationships), then Secrets Manager and Parameter Store (credential harvesting), then EC2/ECS/Lambda (enumerate compute), then S3 (data access). This ordered enumeration pattern is distinct from targeted human operation.
3. Check for IAM backdoor creation: Immediately query for IAM user creation, access key creation, and role policy modifications in the same timeframe from the same source IP. Creating backdoor identities is Akira’s and other groups’ documented persistence mechanism.
4. Cross-reference with VPN and authentication logs: The source IP for AWS API calls in AI-assisted intrusions frequently correlates to VPN egress points, AWS API proxy services, or residential proxy infrastructure. Cross-referencing the source IP against your threat intel feeds and VPN logs can identify whether this is a legitimate asset.
False Positive Management
The primary false positive scenarios for parallelism detection:
Multi-account CI/CD pipelines: Legitimate DevOps pipelines running from a single runner instance frequently hold multiple AWS account credentials and may switch between them rapidly. Establishing a baseline of known CI/CD source IPs and excluding them from high-sensitivity parallelism alerts significantly reduces noise.
Security scanning tools: Prowler, Scout Suite, and similar tools can exercise multiple accounts rapidly from single hosts. Maintain an allowlist of known scanner IPs.
Secrets Manager batch operations: Application deployment pipelines that pull all secrets at startup can produce high GetSecretValue volumes. Establish per-role baseline call rates and alert on significant deviations rather than absolute thresholds.
The 10-second window and three-key minimum threshold in the Sigma rules above are conservative starting points. In most environments, the false positive rate will be low enough that initial investigation of all hits is feasible, with allowlisting applied as patterns are identified.