Detection rules › Panther

Snowflake Data Exfiltration

Severity
critical
Time window
36h
Match by
p_alert_context.stage
Tags
Snowflake, Data Exfiltration, Database, Cloud Security
Reference
https://cloud.google.com/blog/topics/threat-intelligence/unc5537-snowflake-data-theft-extortion/
Source
github.com/panther-labs/panther-analysis

Detects multi-step Snowflake data exfiltration by identifying temporary stage creation, table data copied to stage, and file downloads. This technique was used in the April 2024 Snowflake breach (UNC5537) targeting accounts without MFA. The correlation of all three steps provides high-confidence evidence of active data theft beyond legitimate ETL operations.

MITRE ATT&CK coverage

Rule body yaml

AnalysisType: correlation_rule
RuleID: "Snowflake.Stream.DataExfiltration"
DisplayName: "Snowflake Data Exfiltration"
Enabled: true
Tags:
  - Snowflake
  - Data Exfiltration
  - Database
  - Cloud Security
Severity: Critical
Description: >
  Detects multi-step Snowflake data exfiltration by identifying temporary stage creation, table data copied to stage, and file downloads. This technique was used in the April 2024 Snowflake breach (UNC5537) targeting accounts without MFA. The correlation of all three steps provides high-confidence evidence of active data theft beyond legitimate ETL operations.
Runbook: |
  1. Query Snowflake's QUERY_HISTORY and ACCESS_HISTORY views for the stage name in p_alert_context.stage to identify the user account, session ID, source IP addresses, client application, and all tables that were copied into the stage
  2. Review the specific tables copied into the stage to determine data sensitivity (PII, financial records, intellectual property) and estimate the volume of data exfiltrated, then check Snowflake's LOGIN_HISTORY to verify if the user account had MFA enabled
  3. Analyze the source IP addresses used during the exfiltration sequence against threat intelligence feeds to determine if they are corporate IPs, suspicious cloud providers, or known malicious infrastructure, and check for impossible travel patterns
Reference: https://cloud.google.com/blog/topics/threat-intelligence/unc5537-snowflake-data-theft-extortion/
Reports:
  MITRE ATT&CK:
    - TA0010:T1041 # Exfiltration: Exfiltration Over C2 Channel
    - TA0010:T1530 # Exfiltration: Data from Cloud Storage
    - TA0009:T1213 # Collection: Data from Information Repositories
Detection:
  - Sequence:
      - ID: SnowflakeTempStageCreated
        RuleID: Snowflake.Stream.TempStageCreated
      - ID: SnowflakeCopyIntoStage
        RuleID: Snowflake.Stream.TableCopiedIntoStage
      - ID: SnowflakeFileDownloaded
        RuleID: Snowflake.Stream.FileDownloaded
    Transitions:
      - ID: Match SnowflakeTempStageCreated and SnowflakeCopyIntoStage on stage
        From: SnowflakeTempStageCreated
        To: SnowflakeCopyIntoStage
        Match:
          - On: p_alert_context.stage
      - ID: Match SnowflakeCopyIntoStage and SnowflakeFileDownloaded on path
        From: SnowflakeCopyIntoStage
        To: SnowflakeFileDownloaded
        Match:
          - On: p_alert_context.stage
    Schedule:
      RateMinutes: 1440
      TimeoutMinutes: 15
    LookbackWindowMinutes: 2160
Tests:
    - Name: Data Exfiltration
      ExpectedResult: true
      RuleOutputs:
        - ID: SnowflakeTempStageCreated
          Matches:
            p_alert_context.stage:
                LOGS.PUBLIC.data_exfil:
                    - "2006-01-02T15:04:05Z"
                    - "2006-01-02T15:04:06Z"
        - ID: SnowflakeCopyIntoStage
          Matches:
            p_alert_context.stage:
                LOGS.PUBLIC.data_exfil:
                    - "2006-01-02T15:04:05Z"
                    - "2006-01-02T15:04:06Z"
        - ID: SnowflakeFileDownloaded
          Matches:
            p_alert_context.stage:
                LOGS.PUBLIC.data_exfil:
                    - "2006-01-02T15:04:05Z"
                    - "2006-01-02T15:04:06Z"
    - Name: Data Staged but not Downloaded
      ExpectedResult: false
      RuleOutputs:
        - ID: SnowflakeTempStageCreated
          Matches:
            p_alert_context.stage:
                LOGS.PUBLIC.data_exfil:
                    - "2006-01-02T15:04:05Z"
                    - "2006-01-02T15:04:06Z"
        - ID: SnowflakeCopyIntoStage
          Matches:
            p_alert_context.stage:
                LOGS.PUBLIC.data_exfil:
                    - "2006-01-02T15:04:05Z"
                    - "2006-01-02T15:04:06Z"

Detection logic

Stage 1: step SnowflakeTempStageCreated ordered before $SnowflakeCopyIntoStage

References detection Snowflake.Stream.TempStageCreated.

Stage 2: step SnowflakeCopyIntoStage ordered before $SnowflakeFileDownloaded ordered after $SnowflakeTempStageCreated

References detection Snowflake.Stream.TableCopiedIntoStage.

Stage 3: step SnowflakeFileDownloaded ordered after $SnowflakeCopyIntoStage

References detection Snowflake.Stream.FileDownloaded.