Conversation
…mers The management-console CEF records lost the event name, kept one word of values with spaces, turned header text into field names and cut rt to a fragment, so the twelve rules that need the event name never matched. Filter 3.0.1: - Parse the CEF header by position after "CEF:"; name to log.eventDescription, header severity to log.cefSeverity. The standard severity stays unset: the CEF scale is not documented. - Drop the two parsers that stored the version slot as log.syslogHost. - Run kv only when log.restData exists. - Keep the full rt in log.ruleTime; set deviceTime from it only for the observed UTC layout. - Keep whole values for nine keys, including the last key. - Copy suser to origin.user for SystemEvent records only. Rules (names, thresholds, impact, adversary and MITRE unchanged): - memory_injection_detection: drop the deleted scratch-field branch. - target.host replaces log.syslogHost in five gates and eight groupings. - kernel_level_threat and the reputation branch require target.host. - s1_policy_downgrade fires only on Protect to Detect, paired wording included. - s1_exclusion_abuse and s1_policy_downgrade group by adversary.user. - Whole-word lists in agent tampering, mitigation failures and IoT. - threat_intelligence_matches compares confidencelevel with MALICIOUS. The actionResult steps are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
sentinel_one_filter_test.go checks the filter structure, compiles every pattern, runs the header, value and rt patterns over 52 fabricated lines and evaluates 41 predicate cases against the shipped rules with go-sdk v1.1.33. testdata/sentinel-one/replay.py replays the same lines through the public EventProcessor playground and checks every field and alert, optionally with a test-only step that supplies target.host. All inputs are invented. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Evidence basis, each change and its proof level, validation results, deferred items and known limits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The SentinelOne filter did not parse the management-console CEF records seen in the field, so none of the 19 SentinelOne rules could match a real record. This draft fixes the parser and updates 14 rules so they read what the filter now produces, without firing on ordinary console administration.
Predecessor: #2595 (closed, historical context only).
Filter (
filters/antivirus/sentinel-one.yml, 3.0.0 → 3.0.1)CEF:. The event name now reacheslog.eventDescription. The header severity is kept as vendor detail inlog.cefSeverity; standardseverityis not set.log.syslogHostfrom the product-version slot. Real records carry a console build string there.kvso lines without a CEF extension no longer produce a large parser error.rttime tolog.ruleTimeand convert it todeviceTime.suser) toorigin.userfor console events (cat=SystemEvent).actionResultblock is unchanged. A separate draft revises it.Rules (
rules/antivirus/sentinel-one/, 14 files)log.syslogHostgate and grouping withtarget.host. This ships together with the parser removal above.memory_injection_detection: remove a branch that readlog.eventDescToParse, which the filter deletes.s1_policy_downgrade: require the Protect-to-Detect direction; it no longer fires on upgrades.kernel_level_threatand the "reputation" branch ofthreat_intelligence_matchesnow requiretarget.host, so console admin text cannot fire them.adversary.user.threat_intelligence_matches: use the vendor-documented confidence valueMALICIOUSinstead of>= 90.Validation
plugins/alertsGo suite passes, linked go-sdk v1.1.33. Five new SentinelOne tests are included, and four of them fail against the original files.plugins/alerts/testdata/sentinel-one/replay.pyruns 52 fabricated raw lines through an isolated EventProcessor playground (commit497bf53). With the corrected filter and rules there were zero parser errors, and each intended local alert fired exactly once.Limits
target.host. Nothing writes it until the endpoint key is documented, and before this change those rules depended on a field that real records never had.duser→target.user, severity/action mapping, IoT/Storyline rule relevance;actionResultblock. The only expected conflict is the version comment line.See
filters/audits/sentinel-one.mdfor details.🤖 Generated with Claude Code