Detection rules › Panther

Snowflake Login Without MFA

Severity
medium
Log types
Snowflake.LoginHistory
Tags
Snowflake, [MITRE] Defense Evasion, [MITRE] Modify Authentication Process
Source
github.com/panther-labs/panther-analysis

Detect Snowflake logins without multifactor authentication

MITRE ATT&CK coverage

Rule body yaml

AnalysisType: rule
Filename: snowflake_stream_login_without_mfa.py
RuleID: Snowflake.Stream.LoginWithoutMFA
DisplayName: Snowflake Login Without MFA
Enabled: false
LogTypes:
  - Snowflake.LoginHistory
Severity: Medium
Reports:
  MITRE ATT&CK:
    - TA0005:T1556
Description: Detect Snowflake logins without multifactor authentication
DedupPeriodMinutes: 1440
Tags:
  - Snowflake
  - '[MITRE] Defense Evasion'
  - '[MITRE] Modify Authentication Process'
Tests:
  - Name: Login With MFA
    ExpectedResult: false
    Log:
      {
        "p_event_time": "2024-10-08 14:38:46.061000000",
        "p_log_type": "Snowflake.LoginHistory",
        "p_source_label": "Snowflake Prod",
        "CLIENT_IP": "1.1.1.1",
        "EVENT_ID": "393754014361778",
        "EVENT_TIMESTAMP": "2024-10-08 14:38:46.061000000",
        "EVENT_TYPE": "LOGIN",
        "FIRST_AUTHENTICATION_FACTOR": "PASSWORD",
        "IS_SUCCESS": "YES",
        "RELATED_EVENT_ID": "0",
        "REPORTED_CLIENT_TYPE": "OTHER",
        "REPORTED_CLIENT_VERSION": "1.11.1",
        "SECOND_AUTHENTICATION_FACTOR": "OTP",
        "USER_NAME": "ckent@dailyplanet.org"
      }
  - Name: Login Without MFA
    ExpectedResult: true
    Log:
      {
        "p_event_time": "2024-10-08 14:38:46.061000000",
        "p_log_type": "Snowflake.LoginHistory",
        "p_source_label": "Snowflake Prod",
        "CLIENT_IP": "1.2.3.4",
        "EVENT_ID": "393754014361778",
        "EVENT_TIMESTAMP": "2024-10-08 14:38:46.061000000",
        "EVENT_TYPE": "LOGIN",
        "FIRST_AUTHENTICATION_FACTOR": "PASSWORD",
        "IS_SUCCESS": "YES",
        "RELATED_EVENT_ID": "0",
        "REPORTED_CLIENT_TYPE": "OTHER",
        "REPORTED_CLIENT_VERSION": "1.11.1",
        "USER_NAME": "luthor@lexcorp.com"
      }

Detection logic

Condition

EVENT_TYPE eq "LOGIN"
IS_SUCCESS eq "YES"
FIRST_AUTHENTICATION_FACTOR eq "PASSWORD"
SECOND_AUTHENTICATION_FACTOR is_null
USER_NAME not in ["PANTHER_READONLY", "PANTHER_ADMIN", "PANTHERACCOUNTADMIN"]

Exclusions

Top-level NOT(...) conjuncts: predicates this rule actively suppresses.

FieldKindExcluded values
USER_NAMEinPANTHERACCOUNTADMIN, PANTHER_ADMIN, PANTHER_READONLY

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.

FieldKindValues
EVENT_TYPEeq
  • LOGIN
FIRST_AUTHENTICATION_FACTOReq
  • PASSWORD
IS_SUCCESSeq
  • YES
SECOND_AUTHENTICATION_FACTORis_null
  • (no value, null check)

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
p_source_label
USER_NAME