Skip to content

Commit 7445a60

Browse files
committed
fix: align SentinelOne filter and rule contracts
1 parent 6c3af7e commit 7445a60

3 files changed

Lines changed: 117 additions & 6 deletions

File tree

‎filters/antivirus/sentinel-one.yml‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -368,20 +368,20 @@ pipeline:
368368
function: string
369369
params:
370370
key: actionResult
371-
value: "failed"
372-
where: 'equals("log.threatStatus", "mitigation_failed")'
371+
value: failure
372+
where: equals("log.threatStatus", "mitigation_failed")
373373
- add:
374374
function: string
375375
params:
376376
key: actionResult
377-
value: "failed"
378-
where: 'equals("log.status", "failed") && !exists("actionResult")'
377+
value: failure
378+
where: equals("log.status", "failed") && !exists("actionResult")
379379
- add:
380380
function: string
381381
params:
382382
key: actionResult
383-
value: "failed"
384-
where: 'contains("log.mitigationStatus", "fail") && !exists("actionResult")'
383+
value: failure
384+
where: contains("log.mitigationStatus", "fail") && !exists("actionResult")
385385

386386
# Removing unused fields
387387
- delete:

‎filters/audits/sentinelone.md‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# SentinelOne normalization and rule review
2+
3+
Normalize mitigation and operation failures to actionResult=failure.
4+
5+
This draft targets UTMStack `v11`. It contains 1 filter changes
6+
and 0 rule changes for this technology only. Review covered
7+
1 filter configurations and 19 matching shipped rule files.
8+
Unchanged rules are listed in the regression manifest; they are not duplicated in the diff.
9+
10+
## Contract and validation
11+
12+
- Compared exact standard names/types with go-sdk v1.1.31 and the supplied UTMStack dictionaries.
13+
- Checked documented pipeline ordering, rename/move behavior, open vendor log fields,
14+
event-side versus alert-side fields, and surviving fields used by affected rule predicates/history/grouping.
15+
- Strict SDK configuration decoding and actual CEL compilation pass for this scope.
16+
- 3 synthetic normalization cases pass, including SDK Event conversion and any
17+
trigger predicate assertions recorded in the manifest.
18+
- The scoped alerts module tests and `git diff --check` pass with the shared contract runner applied.
19+
20+
The shared alert-contract PR supplies the reusable Go runner for the manifest in
21+
`plugins/alerts/testdata/filter-contracts/sentinelone.json`. Apply that support before running `go test ./...` in `plugins/alerts`.
22+
23+
The model starts from synthetic extraction results. It does not run complex grok,
24+
JSON/KV/XML/CSV extraction, time conversion, dynamic plugins, historical OpenSearch
25+
queries, or the closed EventProcessor. Raw vendor logs and resulting alerts must
26+
still be checked in staging before rollout. No customer false-positive reduction
27+
has been measured and no production rollout is included.
28+
29+
30+
31+
## References
32+
33+
- [SDK schema](https://github.com/threatwinds/go-sdk/blob/v1.1.31/plugins/plugins.proto)
34+
- [Filter steps](https://github.com/threatwinds/go-sdk/wiki/Filter-Steps-Reference)
35+
- [Standard event schema](https://github.com/threatwinds/go-sdk/wiki/Standard-Event-Schema)
36+
- [Rule implementation](https://github.com/threatwinds/go-sdk/wiki/Implementing-Rules)
37+
38+
`afterEvents`, empty noncapturing grok names, supported numeric strings, and custom
39+
`log.*` fields are accepted. Existing textual protocol casing and vendor action names
40+
are preserved unless a concrete consumer mismatch requires correction.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
{
2+
"technology": "SentinelOne",
3+
"filters": [
4+
"filters/antivirus/sentinel-one.yml"
5+
],
6+
"rules": [
7+
"rules/antivirus/sentinel-one/agent_tampering_attempts.yml",
8+
"rules/antivirus/sentinel-one/ai_based_threat_hunting_alerts.yml",
9+
"rules/antivirus/sentinel-one/behavioral_threat_detection.yml",
10+
"rules/antivirus/sentinel-one/cloud_workload_protection_alerts.yml",
11+
"rules/antivirus/sentinel-one/container_security_alerts.yml",
12+
"rules/antivirus/sentinel-one/custom_detection_rule_triggers.yml",
13+
"rules/antivirus/sentinel-one/deep_visibility_threat_indicators.yml",
14+
"rules/antivirus/sentinel-one/endpoint_detection_response_alerts.yml",
15+
"rules/antivirus/sentinel-one/iot_device_compromise_indicators.yml",
16+
"rules/antivirus/sentinel-one/kernel_level_threat.yml",
17+
"rules/antivirus/sentinel-one/memory_injection_detection.yml",
18+
"rules/antivirus/sentinel-one/rollback_operation_patterns.yml",
19+
"rules/antivirus/sentinel-one/s1_exclusion_abuse.yml",
20+
"rules/antivirus/sentinel-one/s1_policy_downgrade.yml",
21+
"rules/antivirus/sentinel-one/storyline_correlation.yml",
22+
"rules/antivirus/sentinel-one/suspicious_process_tree.yml",
23+
"rules/antivirus/sentinel-one/suspicious_script_execution.yml",
24+
"rules/antivirus/sentinel-one/threat_intelligence_matches.yml",
25+
"rules/antivirus/sentinel-one/threat_mitigation_failures.yml"
26+
],
27+
"fixtures": [
28+
{
29+
"name": "sentinel_failure_threatStatus",
30+
"filter": "antivirus/sentinel-one.yml",
31+
"input": {
32+
"log": {
33+
"threatStatus": "mitigation_failed"
34+
}
35+
},
36+
"expected": {
37+
"actionResult": "failure"
38+
},
39+
"absent": [],
40+
"rules": {}
41+
},
42+
{
43+
"name": "sentinel_failure_status",
44+
"filter": "antivirus/sentinel-one.yml",
45+
"input": {
46+
"log": {
47+
"status": "failed"
48+
}
49+
},
50+
"expected": {
51+
"actionResult": "failure"
52+
},
53+
"absent": [],
54+
"rules": {}
55+
},
56+
{
57+
"name": "sentinel_failure_mitigationStatus",
58+
"filter": "antivirus/sentinel-one.yml",
59+
"input": {
60+
"log": {
61+
"mitigationStatus": "failed"
62+
}
63+
},
64+
"expected": {
65+
"actionResult": "failure"
66+
},
67+
"absent": [],
68+
"rules": {}
69+
}
70+
]
71+
}

0 commit comments

Comments
 (0)