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 was referenced Sep 24, 2026
Brings in go-sdk v1.1.36 for plugins/alerts (field names keep underscores; regexMatch matches strings only) and the coordinated vendor re-baseline. No file overlaps this draft. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d engine Official v11 d2479c1 (go-sdk v1.1.36 in plugins/alerts) and EventProcessor main 8a3ade7 (every playground plugin on v1.1.36). Field names now keep underscores and regexMatch matches strings only; neither changes this draft, because the filter writes only letters and digits in names, no kv key in the fixtures or genuine records has an underscore, and every text-search call reads a string field. Full plugins/alerts suite: 48 pass, 11 skip, 0 fail. replay.py: 52 events and 10 alerts, 59 and 17 with the endpoint harness, all as expected. v1.1.36 rule replay matches the playground alerts exactly. The private runs repeat all 4,304 assertions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion build The newest published engine image, eventprocessor:v11.2.14 (built 2026-09-24 19:13 UTC), carries EventProcessor revision 8a3ade7 with go-sdk v1.1.36, built with go1.26.8 for linux/amd64. The local build used for the re-validation is the same source compiled natively for darwin/arm64 with go1.25.7. 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
Re-checked on 2026-09-24 on the latest versions: official
v11d2479c1a(merged into this branch, no conflicts;plugins/alertsnow pins go-sdk v1.1.36) and EventProcessormain8a3ade7(playground and every plugin on go-sdk v1.1.36).regexMatchmatch strings only. Neither changes this draft: the filter writes only letters and digits in names, nokvkey in the fixtures or the genuine records contains an underscore, and everyregexMatch/containscall reads a text field. No file needed a change.plugins/alertsGo suite on go-sdk v1.1.36: 48 tests pass, 11 skip (other technologies' private-evidence tests, same as the base), 0 fail. Five new SentinelOne tests are included, and four of them fail against the original files.plugins/alerts/testdata/sentinel-one/replay.pyon the latest playground: 52 fabricated raw lines, zero parser errors, every field as inexpected.json, 10 local alerts, each from its intended rule. With--endpoint-harness: 59 events and 17 alerts.expected.json.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;8a3ade7) and this module both use go-sdk v1.1.36; neither is claimed to match a customer deployment. History searches, grouping, deduplication, production alerts and notifications were not tested. No SentinelOne threat records were available.actionResultblock. The only expected conflict is the version comment line.See
filters/audits/sentinel-one.mdfor details.🤖 Generated with Claude Code