Detection rules › Panther

Panther rules: sentinelone

SentinelOne Alert Passthrough

#

This is a third-party alert feed, not a detection over modeled telemetry. Another security product raised the finding; this rule forwards or reshapes it into the SIEM. It is searchable for reference but is excluded from the detection-rule browse and the ATT&CK coverage matrix.

Severity
high
Group by
id
Log types
SentinelOne.Activity
Reference
www.sentinelone.com
Source
github.com/panther-labs/panther-analysis

SentinelOne Alert Passthrough

Detection logic

SENTINELONE_SEVERITY = {
    "E_LOW": "LOW",
    "E_MEDIUM": "MEDIUM",
    "E_HIGH": "HIGH",
    "E_CRITICAL": "CRITICAL",
}


def rule(event):
    # "3608" corresponds to new alerts
    return event.get("activitytype") == "3608"


def title(event):
    return (
        "SentinelOne "
        f"[{SENTINELONE_SEVERITY.get(event.deep_get('data', 'severity', default=''))}] "
        f"Alert - [{event.deep_get('data', 'rulename')}]"
    )


def dedup(event):
    return f"s1alerts:{event.get('id')}"


def severity(event):
    return SENTINELONE_SEVERITY.get(event.deep_get("data", "severity", default=""), "MEDIUM")


def alert_context(event):
    data_cleaned = {k: v for k, v in event.get("data", {}).items() if v != ""}
    return {
        "primarydescription": event.get("primarydescription", ""),
        "accountname": event.get("accountname", ""),
        "accountid": event.get("accountid", ""),
        "siteid": event.get("siteid", ""),
        "sitename": event.get("sitename", ""),
        "groupid": event.get("groupid", ""),
        "groupname": event.get("groupname", ""),
        "activityuuid": event.get("activityuuid", ""),
        "agentid": event.get("agentid", ""),
        "id": event.get("id", ""),
        "data": data_cleaned,
    }

Rule specification

AnalysisType: rule
Description: SentinelOne Alert Passthrough
DisplayName: "SentinelOne Alert Passthrough"
Enabled: true
Filename: sentinelone_alert_passthrough.py
Reference: https://www.sentinelone.com/blog/feature-spotlight-introducing-the-new-threat-center/
Severity: High
DedupPeriodMinutes: 60
LogTypes:
  - SentinelOne.Activity
RuleID: "SentinelOne.Alert.Passthrough"
Threshold: 1

Stages and Predicates

Fires on SentinelOne.Activity events when the condition below holds.

Condition

  • activitytype is 3608

Indicators

These rows show field, operator, and value matches.

Output fields

Fields the rule emits when it matches, drawn from the rule's alert_context.

FieldSource
primarydescription
accountname
accountid
siteid
sitename
groupid
groupname
activityuuid
agentid
id
severitydata.severity
rulenamedata.rulename

Worked example

A sample event from the rule's unit tests that triggers a match.

Sample Test Event
{
  "accountid": "12345",
  "accountname": "Account1",
  "activitytype": "3608",
  "activityuuid": "f123-345-1234",
  "agentid": "1234567",
  "createdat": "2022-12-07 17:36:05.076",
  "data": {
    "accountid": "987654",
    "accountname": "Account1",
    "actoralternateid": "",
    "agentipv4": "1.2.3.4",
    "alertid": "1570395776954206544",
    "datasourcename": "SentinelOne",
    "detectedat": "2022-12-07T17:35:48Z",
    "dnsrequest": "",
    "dnsresponse": "",
    "dstip": "",
    "dstport": 0,
    "ruledescription": "test",
    "ruleid": "12345",
    "rulename": "test-rule",
    "rulescopeid": 123,
    "rulescopelevel": "E_ACCOUNT",
    "scopeid": 123,
    "scopelevel": "Group",
    "scopename": "Default Group",
    "severity": "E_CRITICAL",
    "siteid": "12345",
    "sitename": "Default site",
    "tiindicatorsource": "",
    "tiindicatortype": "",
    "tiindicatorvalue": "",
    "userid": 432134
  },
  "groupid": "12345",
  "groupname": "Default Group",
  "id": "5423",
  "primarydescription": "Alert created for sshd from Custom Rule: test-rule in Group Default Group in Site Default site of Account Account1, detected on BobsPC.",
  "secondarydescription": "e020cd039b099b6bfdfd33d13554da5383cc4cc0",
  "siteid": "1408801957997975086",
  "sitename": "Default site",
  "updatedat": "2022-12-07 17:36:05.075",
  "userid": "1234"
}

SentinelOne Threats

#
Severity
medium
Group by
id
Log types
SentinelOne.Activity
Reference
www.sentinelone.com
Source
github.com/panther-labs/panther-analysis

Passthrough SentinelOne Threats

Detection logic

NEW_THREAT_ACTIVITYTYPES = [
    # Malicious Threats - Not Mitigated
    "19",  # New Malicious Threat Not Mitigated
    "4108",  # New Malicious Threat Not Mitigated (detected by SentinelOne Cloud)
    # Suspicious Threats - Not Mitigated
    "4003",  # New Suspicious Threat Not Mitigated
    "4109",  # New Suspicious Threat Not Mitigated (detected by SentinelOne Cloud)
    # New Threats - Mitigated/Blocked
    "18",  # New Threat Mitigated
    "20",  # New Threat Preemptive Block
    # Automated Threat Intelligence Detections
    "4106",  # STAR Active Response Marked Event As Malicious
    "4107",  # STAR Active Response Marked Event As Suspicious
    "4110",  # Singularity Threat Intelligence Engine Marked Event As Malicious
    "4111",  # Watchtower Cloud Detection Engine Marked Event As Threat
    "4112",  # Watchtower Cloud Detection Engine Marked Event As Suspicious
    "4113",  # Singularity Threat Intelligence Engine Marked Event As Suspicious
]


def rule(event):
    return event.get("activitytype") in NEW_THREAT_ACTIVITYTYPES


def title(event):
    return (
        f"SentinelOne - [{event.deep_get('data', 'confidencelevel', default='')}] level threat "
        f"[{event.deep_get('data', 'filedisplayname', default='NO FILE NAME')}] detected on "
        f"[{event.deep_get('data', 'computername', default='NO COMPUTER NAME')}]."
    )


def dedup(event):
    return f"s1threat:{event.get('id', '')}"


def severity(event):
    if event.deep_get("data", "confidencelevel", default="") == "malicious":
        return "HIGH"
    return "DEFAULT"


def alert_context(event):
    return {
        "primarydescription": event.get("primarydescription", ""),
        "accountname": event.get("accountname", ""),
        "accountid": event.get("accountid", ""),
        "siteid": event.get("siteid", ""),
        "sitename": event.get("sitename", ""),
        "threatid": event.get("threatid", ""),
        "groupid": event.get("groupid", ""),
        "groupname": event.get("groupname", ""),
        "activityuuid": event.get("activityuuid", ""),
        "agentid": event.get("agentid", ""),
        "id": event.get("id", ""),
        "data": event.get("data", {}),
    }

Rule specification

AnalysisType: rule
Description: "Passthrough SentinelOne Threats "
DisplayName: "SentinelOne Threats"
Enabled: true
Filename: sentinelone_threats.py
Reference: https://www.sentinelone.com/blog/feature-spotlight-introducing-the-new-threat-center/
Severity: Medium
DedupPeriodMinutes: 60
LogTypes:
  - SentinelOne.Activity
RuleID: "SentinelOne.Threats"
Threshold: 1

Stages and Predicates

Fires on SentinelOne.Activity events when the condition below holds.

Condition

  • activitytype is one of 19, 4108, 4003, 4109, 18 (+7 more values, see Indicators below)

Indicators

These rows show field, operator, and value matches.

FieldKindValuesSearch
activitytypein
  • 18
  • 19
  • 20
  • 4003
  • 4106
  • 4107
  • 4108
  • 4109
  • 4110
  • 4111
  • 4112
  • 4113
field:"activitytype" kind:in

Output fields

Fields the rule emits when it matches, drawn from the rule's alert_context.

FieldSource
primarydescription
accountname
accountid
siteid
sitename
threatid
groupid
groupname
activityuuid
agentid
id
data
confidenceleveldata.confidencelevel
filedisplaynamedata.filedisplayname
computernamedata.computername

Worked example

A sample event from the rule's unit tests that triggers a match.

Sample Test Event
{
  "accountid": "123456789",
  "accountname": "Account1",
  "activitytype": "19",
  "activityuuid": "123-456-678-89",
  "agentid": "1111112222233333",
  "createdat": "2022-12-07 16:08:55.703",
  "data": {
    "accountname": "Account1",
    "computername": "BobsPC",
    "confidencelevel": "malicious",
    "filecontenthash": "cf8bd9dfddff007f75adf4c2be48005cea317c62",
    "filedisplayname": "eicar.txt",
    "filepath": "/home/ubuntu/eicar.txt",
    "fullscopedetails": "Group Testing in Site Default site of Account Account1",
    "fullscopedetailspath": "Global / Account1 / Default site / Testing",
    "groupname": "Testing",
    "sitename": "Default site",
    "threatclassification": "Virus",
    "threatclassificationsource": "Cloud"
  },
  "groupid": "12345",
  "groupname": "Testing",
  "id": "11111111",
  "primarydescription": "Threat with confidence level malicious detected: eicar.txt",
  "secondarydescription": "cf8bd9dfddff007f75adf4c2be48005cea317c62",
  "siteid": "456789",
  "sitename": "Default site",
  "threatid": "123456789",
  "updatedat": "2022-12-07 16:08:55.698"
}