SentinelOne Singularity (sentinelone) — Vendor Schema¶
Source:
schemas/vendors/sentinel-one/sentinelone-threat.yaml
Identity¶
| Field | Value |
|---|---|
| vendor | sentinelone |
| product | SentinelOne Singularity |
| data_source | sentinelone_v2_generic_alert_raw |
| category | Endpoint |
Raw Schema¶
Fields available in the raw ingest dataset.
| Field | Type | Array | Status | JSON Subfields |
|---|---|---|---|---|
_alert_data |
json |
declared | ||
threatinfo |
json |
declared | ||
sourceprocessinfo |
json |
declared | ||
sourceparentprocessinfo |
json |
declared | ||
targetprocessinfo |
json |
declared | ||
agentrealtimeinfo |
json |
declared | ||
agentdetectioninfo |
json |
declared | ||
indicators |
json |
✓ | declared |
Modeling Rule — SentinelOne Singularity Modeling Rule¶
| Field | Value |
|---|---|
| modeling_rule_id | SentinelOne_V2_ModelingRule |
| modeling_rule_name | SentinelOne Singularity Modeling Rule |
| directory_name | SentinelOneV2_ModelingRule |
| fromversion | 6.10.0 |
Field Mappings¶
What each XDM field is, where it sources from, what issue field it surfaces on, and why the mapping is shaped the way it is.
| XDM Path | Expression | Sources | Issue Field | Description |
|---|---|---|---|---|
xdm.source.user.username |
if( coalesce( json_extract_scalar(threatinfo, "$.rootProcessUpn"), ... |
threatinfo, sourceprocessinfo |
username |
rootProcessUpn is always clean; sourceprocessinfo.user kept only when it is a real account (SYSTEM/service nulled). processUser dropped — it is the intended field but ~40% arrives encoding-corrupted (mojibake domain prefix), an upstream ingestion bug. Null is preferred over garbage. agentLastLoggedIn* intentionally excluded — it is the host session, not the actor that started the process. |
xdm.target.host.hostname |
json_extract_scalar(agentrealtimeinfo, "$.agentComputerName") |
agentrealtimeinfo |
hostname |
|
xdm.target.host.device_id |
json_extract_scalar(agentrealtimeinfo, "$.agentId") |
agentrealtimeinfo |
agentid |
|
xdm.source.process.name |
json_extract_scalar(sourceprocessinfo, "$.name") |
sourceprocessinfo |
initiatedby |
|
xdm.source.process.executable.path |
json_extract_scalar(sourceprocessinfo, "$.filePath") |
sourceprocessinfo |
initiatorpath |
|
xdm.source.process.executable.sha256 |
json_extract_scalar(sourceprocessinfo, "$.fileHashSha256") |
sourceprocessinfo |
initiatorsha256 |
|
xdm.target.file.sha256 |
json_extract_scalar(threatinfo, "$.sha256") |
threatinfo |
filesha256 |
|
xdm.target.file.filename |
json_extract_scalar(threatinfo, "$.threatName") |
threatinfo |
filename |
|
xdm.alert.name |
coalesce(json_extract_scalar(_alert_data, "$.alert_name"), json_extract_scala... |
_alert_data, threatinfo |
alertname |
|
xdm.alert.severity |
lowercase(json_extract_scalar(_alert_data, "$.severity")) |
_alert_data |
severity |
|
xdm.alert.description |
json_extract_scalar(_alert_data, "$.alert_description") |
_alert_data |
eventdescription |
|
xdm.observer.vendor |
"SentinelOne" |
observervendor |
||
xdm.observer.product |
"SentinelOne Singularity" |
observerproduct |
Contributes (Artifacts.*)¶
Fields populated for downstream lifecycle Artifacts schemas:
UserEndpoint.HostnameEndpoint.AgentIDProcess.NameProcess.PathProcess.SHA256Target.FileTarget.SHA256VendorProduct
Correlation Rules¶
SOC SentinelOne Threat¶
| Field | Value |
|---|---|
| global_rule_id | SOC SentinelOne Threat |
| subtype | passthrough |
| fromversion | 6.10.0 |
Creates an XSIAM passthrough alert for each SentinelOne Singularity threat, normalized to the SOC Framework endpoint contract.
Tags: SOCFramework, Passthrough, Endpoint, SentinelOne
Schema Constants¶
| Field | Value |
|---|---|
| rule_id | 0 |
| alert_category | User Defined |
| alert_domain | DOMAIN_SECURITY |
| action | ALERTS |
| execution_mode | SCHEDULED |
| mapping_strategy | CUSTOM |
| user_defined_category | tactic |
| user_defined_severity | severity |
| is_enabled | ✓ |
| drilldown_query_timeframe | ALERT |
| severity | User Defined |
Suppression¶
| Field | Value |
|---|---|
| enabled | ✓ |
| duration | 1 hours |
| fields | threat_id |
threatId is SentinelOne's per-threat unique id.
Alert Fields¶
Issue-field assignments emitted by the correlation rule. The Description column captures intent — when present, this is what downstream playbooks rely on the field meaning.
| Issue Field | Source | Bucket | Description |
|---|---|---|---|
vendor |
vendor_name |
computed |
|
product |
product_name |
computed |
|
severity |
severity |
computed |
|
alert_description |
alert_description |
computed |
|
originalalertid |
originalalertid |
computed |
|
originalalertname |
originalalertname |
computed |
|
mitretacticid |
mitretacticid |
computed |
|
mitretacticname |
mitretacticname |
computed |
|
mitretechniqueid |
mitretechniqueid |
computed |
|
agent_hostname |
agent_hostname |
computed |
|
agent_id |
agent_id |
computed |
|
agent_device_domain |
agent_device_domain |
computed |
|
actor_effective_username |
actor_effective_username |
computed |
|
actor_process_image_name |
actor_process_image_name |
computed |
|
actor_process_image_path |
actor_process_image_path |
computed |
|
actor_process_image_sha256 |
actor_process_image_sha256 |
computed |
|
actor_process_command_line |
actor_process_command_line |
computed |
|
actor_process_os_pid |
actor_process_os_pid |
computed |
|
causality_actor_process_image_name |
causality_actor_process_image_name |
computed |
|
causality_actor_process_image_sha256 |
causality_actor_process_image_sha256 |
computed |
|
action_file_name |
action_file_name |
computed |
|
action_file_sha256 |
action_file_sha256 |
computed |
|
action_local_ip |
action_local_ip |
computed |
|
alert_name |
alert_name |
computed |
|
causality_actor_causality_id |
causality_actor_causality_id |
computed |
|
xdmsourceprocesscausalityid |
causality_actor_causality_id |
computed |
|
causality_actor_process_image_path |
causality_actor_process_image_path |
computed |
|
causality_actor_process_command_line |
causality_actor_process_command_line |
computed |
|
user_principal |
user_principal |
computed |
|
actor_process_signature_vendor |
actor_process_signature_vendor |
computed |
|
initiatorsigner |
actor_process_signature_vendor |
computed |
|
filehash |
action_file_sha256 |
computed |
|
deviceosname |
deviceosname |
computed |
|
deviceexternalips |
deviceexternalips |
computed |
|
filesha1 |
file_sha1 |
computed |
|
filemd5 |
file_md5 |
computed |
|
sentinelonethreatid |
threat_id |
computed |
|
username |
actor_effective_username |
computed |
|
hostname |
agent_hostname |
computed |
|
domain |
agent_device_domain |
computed |
|
agentid |
agent_id |
computed |
|
initiatedby |
actor_process_image_name |
computed |
|
initiatorpath |
actor_process_image_path |
computed |
|
initiatorsha256 |
actor_process_image_sha256 |
computed |
|
initiatorcmd |
actor_process_command_line |
computed |
|
initiatorpid |
actor_process_os_pid |
computed |
|
cgosha256 |
causality_actor_process_image_sha256 |
computed |
|
filename |
action_file_name |
computed |
|
filesha256 |
action_file_sha256 |
computed |
|
localip |
action_local_ip |
computed |
Pre-Alter XQL¶
| filter _alert_data != null
| alter
vendor_name = "SentinelOne",
product_name = "SentinelOne Singularity",
severity = lowercase(json_extract_scalar(_alert_data, "$.severity")),
alert_description = json_extract_scalar(_alert_data, "$.alert_description"),
threat_id = json_extract_scalar(threatinfo, "$.threatId"),
threat_name = json_extract_scalar(threatinfo, "$.threatName"),
classification = json_extract_scalar(threatinfo, "$.classification"),
confidence = json_extract_scalar(threatinfo, "$.confidenceLevel")
// ---- host ----
| alter
agent_hostname = json_extract_scalar(agentrealtimeinfo, "$.agentComputerName"),
agent_id = json_extract_scalar(agentrealtimeinfo, "$.agentId"),
agent_device_domain = json_extract_scalar(agentrealtimeinfo, "$.agentDomain"),
deviceosname = json_extract_scalar(agentrealtimeinfo, "$.agentOsName"),
action_local_ip = json_extract_scalar(agentdetectioninfo, "$.agentIpV4"),
deviceexternalips = json_extract_scalar(agentdetectioninfo, "$.externalIp")
// ---- user: clean process-context only; null unless a real account ----
// rootProcessUpn always clean; sourceprocessinfo.user kept only when not
// SYSTEM/service. processUser dropped — ~40% arrives encoding-corrupted.
| alter
user_candidate = coalesce(
json_extract_scalar(threatinfo, "$.rootProcessUpn"),
json_extract_scalar(sourceprocessinfo, "$.user"))
| alter
user_filtered = if(
user_candidate = null, null,
lowercase(user_candidate) contains "nt authority", null,
lowercase(user_candidate) in ("system", "local service", "network service"), null,
user_candidate)
// Username normalization: lowercase, DOMAIN\-prefix-stripped, full
// principal. rootProcessUpn cases emit lowercase full UPN (matches TAP and
// CrowdStrike); DOMAIN\user cases strip to bare sam (best available --
// string ops only, REAL_TIME forbids the identity-map join, 101704).
// user_principal keeps the raw-case UPN as the parallel pivot.
| alter
actor_effective_username = lowercase(
arrayindex(regextract(coalesce(user_filtered, ""), "(?:.*\\)?(.+)"), 0)),
user_principal = if(user_filtered contains "@", user_filtered, null)
// ---- initiator process ----
| alter
actor_process_image_name = json_extract_scalar(sourceprocessinfo, "$.name"),
actor_process_image_path = json_extract_scalar(sourceprocessinfo, "$.filePath"),
actor_process_image_sha256 = json_extract_scalar(sourceprocessinfo, "$.fileHashSha256"),
actor_process_command_line = json_extract_scalar(sourceprocessinfo, "$.commandline"),
actor_process_os_pid = json_extract_scalar(sourceprocessinfo, "$.pid"),
actor_process_signature_vendor = json_extract_scalar(sourceprocessinfo, "$.fileSignerIdentity")
// ---- parent / causality (CGO) ----
| alter
causality_actor_process_image_name = json_extract_scalar(sourceparentprocessinfo, "$.name"),
causality_actor_process_image_path = json_extract_scalar(sourceparentprocessinfo, "$.filePath"),
causality_actor_process_image_sha256 = json_extract_scalar(sourceparentprocessinfo, "$.fileHashSha256"),
causality_actor_process_command_line = json_extract_scalar(sourceparentprocessinfo, "$.commandline"),
causality_actor_causality_id = coalesce(
json_extract_scalar(threatinfo, "$.storyline"),
json_extract_scalar(sourceprocessinfo, "$.storyline"))
// ---- file / threat (detection target) ----
| alter
action_file_name = threat_name,
action_file_sha256 = json_extract_scalar(threatinfo, "$.sha256"),
file_sha1 = json_extract_scalar(threatinfo, "$.sha1"),
file_md5 = json_extract_scalar(threatinfo, "$.md5")
// ---- MITRE (best-effort; SentinelOne indicators rarely carry ATT&CK) ----
| alter
mitretacticname = arraystring(arraymap(arrayfilter(indicators -> [], array_length("@element" -> tactics[]) > 0), "@element" -> category), ", "),
mitretacticid = null,
mitretechniqueid = null
| alter
originalalertid = threat_id,
originalalertname = threat_name,
alert_name = concat(
"[Endpoint] ",
coalesce(agent_hostname, "Unknown Host"), " | ",
coalesce(classification, "Threat"), " | ",
coalesce(threat_name, "Detection"))