Panther critical experimental python

AWS RDS Instance Modified to be Publicly Accessible

Detects when an RDS instance or cluster is modified to become publicly accessible. This exposes the database to the internet and is used by attackers for persistence or data exfiltration. This detects the modification event in real-time, unlike static policy checks.

View Source

Detection Logic

from panther_aws_helpers import aws_rds_context


def rule(event):
    if event.get("eventSource") != "rds.amazonaws.com":
        return False
    modify_events = ["ModifyDBInstance", "ModifyDBCluster"]
    if event.get("eventName") not in modify_events:
        return False
    if event.deep_get("errorCode") is not None:
        return False
    publicly_accessible = event.deep_get("requestParameters", "publiclyAccessible", default=None)
    if publicly_accessible is True:
        return True
    return False


def title(event):
    event_name = event.get("eventName", "Unknown")
    db_identifier = event.deep_get("requestParameters", "dBInstanceIdentifier") or event.deep_get(
        "requestParameters", "dBClusterIdentifier", default="<UNKNOWN>"
    )
    user = event.deep_get("userIdentity", "userName") or event.deep_get(
        "userIdentity", "principalId", default="<UNKNOWN_USER>"
    )
    resource_type = "Instance" if event_name == "ModifyDBInstance" else "Cluster"
    return f"RDS {resource_type} Made Public: [{db_identifier}] by [{user}]"


def alert_context(event):
    context = aws_rds_context(event)
    context["publicly_accessible"] = event.deep_get(
        "requestParameters", "publiclyAccessible", default="N/A"
    )
    context["apply_immediately"] = event.deep_get(
        "requestParameters", "applyImmediately", default="N/A"
    )
    vpc_security_groups = event.deep_get("requestParameters", "vPCSecurityGroupIds", default=None)
    if vpc_security_groups:
        context["vpc_security_groups_modified"] = vpc_security_groups
    subnet_group = event.deep_get("requestParameters", "dBSubnetGroupName")
    if subnet_group:
        context["subnet_group_modified"] = subnet_group
    return context

Field Validations

Loading…

Comments (0)

Loading comments...