Detection rules › Panther
GCS Bucket Made Public
Adversaries may access data objects from improperly secured cloud storage.
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Collection | T1530 Data from Cloud Storage |
Rules detecting the same action
Other rules on this platform that filter on the same API call or operation.
- Detect New Open GCP Storage Buckets (Splunk)
- GCP GCS IAM Permission Changes (Panther)
- GCP Storage Bucket Permissions Modification (Elastic)
Rule body yaml
AnalysisType: rule
Filename: gcp_gcs_public.py
RuleID: "GCP.GCS.Public"
DisplayName: "GCS Bucket Made Public"
Enabled: true
DedupPeriodMinutes: 15
LogTypes:
- GCP.AuditLog
Tags:
- GCP
- Google Cloud Storage
- Collection:Data From Cloud Storage Object
Reports:
MITRE ATT&CK:
- TA0009:T1530
Severity: High
Description: Adversaries may access data objects from improperly secured cloud storage.
Runbook: Validate the GCS bucket change was safe.
Reference: https://cloud.google.com/storage/docs/access-control/making-data-public
SummaryAttributes:
- severity
- p_any_ip_addresses
- p_any_domain_names
Tests:
- Name: GCS AllUsers Read Permission
ExpectedResult: true
Log:
{
"protoPayload":
{
"@type": "type.googleapis.com/google.cloud.audit.AuditLog",
"status": {},
"authenticationInfo":
{ "principalEmail": "user.name@runpanther.io" },
"requestMetadata":
{
"callerIp": "136.24.229.58",
"callerSuppliedUserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36,gzip(gfe)",
"requestAttributes":
{ "time": "2020-05-15T04:28:42.243082428Z", "auth": {} },
"destinationAttributes": {},
},
"serviceName": "storage.googleapis.com",
"methodName": "storage.setIamPermissions",
"authorizationInfo":
[
{
"resource": "projects/_/buckets/jacks-test-bucket",
"permission": "storage.buckets.setIamPolicy",
"granted": true,
"resourceAttributes": {},
},
],
"resourceName": "projects/_/buckets/jacks-test-bucket",
"serviceData":
{
"@type": "type.googleapis.com/google.iam.v1.logging.AuditData",
"policyDelta":
{
"bindingDeltas":
[
{
"action": "ADD",
"role": "roles/storage.objectViewer",
"member": "allUsers",
},
],
},
},
"resourceLocation": { "currentLocations": ["us"] },
},
"insertId": "15cp9rve72xt1",
"resource":
{
"type": "gcs_bucket",
"labels":
{
"bucket_name": "jacks-test-bucket",
"project_id": "western-verve-123456",
"location": "us",
},
},
"timestamp": "2020-05-15T04:28:42.237027213Z",
"severity": "NOTICE",
"logName": "projects/western-verve-123456/logs/cloudaudit.googleapis.com%2Factivity",
"receiveTimestamp": "2020-05-15T04:28:42.900626148Z",
}
Detection logic
Condition
protoPayload.methodName eq "storage.setIamPermissions"
protoPayload.serviceData is_not_null
protoPayload.serviceData.policyDelta.bindingDeltas is_not_null
protoPayload.serviceData.policyDelta.bindingDeltas array_any
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 |
|---|---|---|
protoPayload.methodName | eq |
|
protoPayload.serviceData | is_not_null | |
protoPayload.serviceData.policyDelta.bindingDeltas | is_not_null |
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 | Source |
|---|---|
bucket_name | resource.labels.bucket_name |