MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Exfiltration | T1537 Transfer Data to Cloud Account |
Rules detecting the same action
Other rules on this platform that filter on the same API call or operation.
- ASL AWS EC2 Snapshot Shared Externally (Splunk)
- AWS EC2 EBS Snapshot Access Removed (Elastic)
- AWS EC2 EBS Snapshot Shared or Made Public (Elastic)
- AWS EC2 Snapshot Shared Externally (Splunk)
Rule body yaml
AnalysisType: rule
Filename: aws_snapshot_made_public.py
RuleID: "AWS.CloudTrail.SnapshotMadePublic"
DisplayName: "AWS Snapshot Made Public"
Enabled: true
LogTypes:
- AWS.CloudTrail
Severity: Medium
Reports:
MITRE ATT&CK:
- TA0010:T1537
Stratus Red Team:
- aws.exfiltration.ec2-share-ebs-snapshot
Description: An AWS storage snapshot was made public.
Reference:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-modifying-snapshot-permissions.html
Runbook: Adjust the snapshot configuration so that it is no longer public.
SummaryAttributes:
- userAgent
- sourceIpAddress
- recipientAccountId
- p_any_aws_arns
Tags:
- AWS
- Exfiltration:Transfer Data to Cloud Account
Tests:
- Name: Snapshot Made Publicly Accessible
ExpectedResult: true
Log:
{
"awsRegion": "us-west-2",
"eventID": "1111",
"eventName": "ModifySnapshotAttribute",
"eventSource": "ec2.amazonaws.com",
"eventTime": "2019-01-01T00:00:00Z",
"eventType": "AwsApiCall",
"eventVersion": "1.05",
"recipientAccountId": "123456789012",
"requestID": "1111",
"requestParameters": {
"attributeType": "CREATE_VOLUME_PERMISSION",
"createVolumePermission": {
"add": {
"items": [
{
"group": "all"
}
]
}
},
"snapshotId": "snap-1111"
},
"responseElements": {
"_return": true,
"requestId": "1111"
},
"sourceIPAddress": "111.111.111.111",
"userAgent": "Mozilla/2.0 (compatible; NEWT ActiveX; Win32)",
"userIdentity": {
"accessKeyId": "1111",
"accountId": "123456789012",
"arn": "arn:aws:sts::123456789012:assumed-role/example-role/example-user",
"principalId": "1111",
"sessionContext": {
"attributes": {
"creationDate": "2019-01-01T00:00:00Z",
"mfaAuthenticated": "true"
},
"sessionIssuer": {
"accountId": "123456789012",
"arn": "arn:aws:iam::123456789012:role/example-role",
"principalId": "1111",
"type": "Role",
"userName": "example-role"
},
"webIdFederationData": {}
},
"type": "AssumedRole"
}
}
- Name: Snapshot Not Made Publicly Accessible
ExpectedResult: false
Log:
{
"awsRegion": "us-west-2",
"eventID": "1111",
"eventName": "ModifySnapshotAttribute",
"eventSource": "ec2.amazonaws.com",
"eventTime": "2019-01-01T00:00:00Z",
"eventType": "AwsApiCall",
"eventVersion": "1.05",
"recipientAccountId": "123456789012",
"requestID": "1111",
"requestParameters": {
"attributeType": "CREATE_VOLUME_PERMISSION",
"createVolumePermission": {
"add": {
"items": [
{
"group": "none"
}
]
}
},
"snapshotId": "snap-1111"
},
"responseElements": {
"_return": true,
"requestId": "1111"
},
"sourceIPAddress": "111.111.111.111",
"userAgent": "Mozilla/2.0 (compatible; NEWT ActiveX; Win32)",
"userIdentity": {
"accessKeyId": "1111",
"accountId": "123456789012",
"arn": "arn:aws:sts::123456789012:assumed-role/example-role/example-user",
"principalId": "1111",
"sessionContext": {
"attributes": {
"creationDate": "2019-01-01T00:00:00Z",
"mfaAuthenticated": "true"
},
"sessionIssuer": {
"accountId": "123456789012",
"arn": "arn:aws:iam::123456789012:role/example-role",
"principalId": "1111",
"type": "Role",
"userName": "example-role"
},
"webIdFederationData": {}
},
"type": "AssumedRole"
}
}
- Name: Error Making Snapshot Publicly Accessible
ExpectedResult: false
Log:
{
"awsRegion": "us-west-2",
"errorCode": "ValidationError",
"eventID": "1111",
"eventName": "ModifySnapshotAttribute",
"eventSource": "ec2.amazonaws.com",
"eventTime": "2019-01-01T00:00:00Z",
"eventType": "AwsApiCall",
"eventVersion": "1.05",
"recipientAccountId": "123456789012",
"requestID": "1111",
"requestParameters": {
"attributeType": "CREATE_VOLUME_PERMISSION",
"createVolumePermission": {
"add": {
"items": [
{
"group": "all"
}
]
}
},
"snapshotId": "snap-1111"
},
"responseElements": {
"_return": true,
"requestId": "1111"
},
"sourceIPAddress": "111.111.111.111",
"userAgent": "Mozilla/2.0 (compatible; NEWT ActiveX; Win32)",
"userIdentity": {
"accessKeyId": "1111",
"accountId": "123456789012",
"arn": "arn:aws:sts::123456789012:assumed-role/example-role/example-user",
"principalId": "1111",
"sessionContext": {
"attributes": {
"creationDate": "2019-01-01T00:00:00Z",
"mfaAuthenticated": "true"
},
"sessionIssuer": {
"accountId": "123456789012",
"arn": "arn:aws:iam::123456789012:role/example-role",
"principalId": "1111",
"type": "Role",
"userName": "example-role"
},
"webIdFederationData": {}
},
"type": "AssumedRole"
}
}
- Name: Snapshot Mader Available to Single Person
ExpectedResult: true
Log:
{
"awsRegion": "us-west-2",
"eventID": "1111",
"eventName": "ModifySnapshotAttribute",
"eventSource": "ec2.amazonaws.com",
"eventTime": "2019-01-01T00:00:00Z",
"eventType": "AwsApiCall",
"eventVersion": "1.05",
"recipientAccountId": "123456789012",
"requestID": "1111",
"requestParameters": {
"attributeType": "CREATE_VOLUME_PERMISSION",
"createVolumePermission": {
"add": {
"items": [
{
"userId": "111122223333"
}
]
}
},
"snapshotId": "snap-1111"
},
"responseElements": {
"_return": true,
"requestId": "1111"
},
"sourceIPAddress": "111.111.111.111",
"userAgent": "Mozilla/2.0 (compatible; NEWT ActiveX; Win32)",
"userIdentity": {
"accessKeyId": "1111",
"accountId": "123456789012",
"arn": "arn:aws:sts::123456789012:assumed-role/example-role/example-user",
"principalId": "1111",
"sessionContext": {
"attributes": {
"creationDate": "2019-01-01T00:00:00Z",
"mfaAuthenticated": "true"
},
"sessionIssuer": {
"accountId": "123456789012",
"arn": "arn:aws:iam::123456789012:role/example-role",
"principalId": "1111",
"type": "Role",
"userName": "example-role"
},
"webIdFederationData": {}
},
"type": "AssumedRole"
}
}
Detection logic
Condition
not (errorCode is_not_null or errorMessage is_not_null)
eventName eq "ModifySnapshotAttribute"
requestParameters.attributeType eq "CREATE_VOLUME_PERMISSION"
This rule also runs imperative logic the parser cannot express as a filter; the conditions above are the structured part it could extract.
Exclusions
Top-level NOT(...) conjuncts: predicates this rule actively suppresses.
| Field | Kind | Excluded values |
|---|---|---|
errorCode | is_not_null | |
errorMessage | is_not_null |
Indicators
Each row is a field, operator, and value that the rule matches. The corpus column counts how many other rules in the catalog look for the same combination: high numbers point to widely-used, community-vetted indicators. Blank or 1 shows that the indicator is specific to this rule.
| Field | Kind | Values |
|---|---|---|
eventName | eq |
|
requestParameters.attributeType | eq |
|
Output fields
Fields the rule emits when it matches. Chronicle authors list these in the outcome block; they appear on the detection and $risk_score drives alerting. Sentinel / Defender XDR rules build them up through project / summarize / extend stages. Sentinel maps these into alert fields via entityMappings and customDetails; Defender XDR custom detections surface them as alert fields directly.
| Field |
|---|
eventName |
eventSource |
awsRegion |
recipientAccountId |
sourceIPAddress |
userAgent |
userIdentity |