Skip to content

Commit

Permalink
THREAT-445 Stratus-GCP-Exfiltration - updated
Browse files Browse the repository at this point in the history
  • Loading branch information
akozlovets098 committed Mar 7, 2025
1 parent 1cbfc38 commit 7dd5b42
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 9 deletions.
10 changes: 6 additions & 4 deletions rules/gcp_audit_rules/gcp_iam_corp_email.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
from panther_base_helpers import deep_get

EXPECTED_DOMAIN = "@your-domain.tld"


def rule(event):
if event.deep_get("protoPayload", "methodName") != "SetIamPolicy":
Expand All @@ -11,15 +9,19 @@ def rule(event):
if not service_data:
return False

# Reference: bit.ly/2WsJdZS
authenticated = event.deep_get(
"protoPayload", "authenticationInfo", "principalEmail", default=""
)
expected_domain = authenticated.split("@")[-1]

binding_deltas = deep_get(service_data, "policyDelta", "bindingDeltas")
if not binding_deltas:
return False

for delta in binding_deltas:
if delta.get("action") != "ADD":
continue
if delta.get("member", "").endswith(EXPECTED_DOMAIN):
if delta.get("member", "").endswith(f"@{expected_domain}"):
return False
return True

Expand Down
2 changes: 1 addition & 1 deletion rules/gcp_audit_rules/gcp_iam_corp_email.yml
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ Tests:
{
"action": "ADD",
"role": "roles/viewer",
"member": "user:username@your-domain.tld",
"member": "user:username@runpanther.com",
},
],
},
Expand Down
9 changes: 6 additions & 3 deletions rules/gcp_audit_rules/gcp_invite_external_user_as_owner.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
from panther_gcp_helpers import gcp_alert_context

EXPECTED_DOMAIN = "@your-domain.tld"


def rule(event):
if event.deep_get("protoPayload", "response", "error"):
Expand All @@ -11,8 +9,13 @@ def rule(event):
if method != "InsertProjectOwnershipInvite":
return False

authenticated = event.deep_get(
"protoPayload", "authenticationInfo", "principalEmail", default=""
)
expected_domain = authenticated.split("@")[-1]

if event.deep_get("protoPayload", "request", "member", default="MEMBER_NOT_FOUND").endswith(
EXPECTED_DOMAIN
f"@{expected_domain}"
):
return False

Expand Down
8 changes: 7 additions & 1 deletion rules/gcp_audit_rules/gcp_invite_external_user_as_owner.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ Tests:
"@type": "type.googleapis.com/google.cloud.audit.AuditLog",
"methodName": "InsertProjectOwnershipInvite",
"resourceName": "projects/target-project",
"authenticationInfo": {
"principalEmail": "[email protected]"
},
"request": {
"member": "user:[email protected]",
"projectId": "target-project",
Expand Down Expand Up @@ -54,8 +57,11 @@ Tests:
"@type": "type.googleapis.com/google.cloud.audit.AuditLog",
"methodName": "InsertProjectOwnershipInvite",
"resourceName": "projects/target-project",
"authenticationInfo": {
"principalEmail": "[email protected]"
},
"request": {
"member": "user:internal-user@your-domain.tld",
"member": "user:internal-user@runpanther.com",
"projectId": "target-project",
"@type": "type.googleapis.com/google.internal.cloud.resourcemanager.InsertProjectOwnershipInviteRequest"
},
Expand Down
2 changes: 2 additions & 0 deletions rules/gcp_audit_rules/gcp_snapshot_insert.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ RuleID: "GCP.Compute.Snapshot.UnexpectedDomain"
Severity: Medium
LogTypes:
- GCP.AuditLog
Tags:
- Configuration Required
Description: >
This rule detects when someone with an unexpected email domain creates a snapshot of a Compute Disk.
Runbook: >
Expand Down

0 comments on commit 7dd5b42

Please sign in to comment.