Conversation
The three actionResult steps wrote the nonstandard value `failed`, matched `fail` as a substring of log.mitigationStatus, missed upper-case values and labelled contradictory statuses as failures. One step now sets the standard `failure` only for an exact, case-insensitive failed threat, operation or mitigation status, and leaves the result unset when the same record also reports success. Successful remediation and console events keep no outcome. Adds ten fabricated raw lines in the observed console CEF framing and an ordered-step CEL test with go-sdk v1.1.33. 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.
Problem
The SentinelOne filter sets
actionResultin three steps, all tofailed: whenlog.threatStatusismitigation_failed, whenlog.statusisfailed, or whenlog.mitigationStatuscontains the substringfail.failedis not one of the standard outcome values (success,failure,denied) in the SDK standard event schema. The substring test also turns a value such asnot_failedinto a failure. The exact comparisons miss upper-case values such asFAILURE. A record that reports both a failed and a successful status is still labelled a failure.Change
One step replaces the three. It sets
failureonly for an exact, case-insensitive failed status:threatStatusmitigation_failed,statusfailed, ormitigationStatusfailed,failureormitigation_failed. If the same record also reports success (mitigationStatussuccess,succeededormitigated, orstatussuccessorsucceeded), the result stays unset. A successful remediation is not evidence that a connection was allowed, and console events carry no final result, so neither sets an outcome. Only the outcome block and the version comment change. The status keys are the ones this filter already used.Validation
plugins/alerts/testdata/sentinel_one_action_result.jsonholds ten fabricated raw lines. They use the console CEF framing observed in real records, with invented values,example.comnames and an RFC 5737 address. They cover each failed status, upper case, a composite value, contradictory statuses, a successful remediation, a console event, a console notification that carries a device address, and a non-CEF transport line. In an isolated EventProcessor parser (commit497bf53, parser SDKv1.1.26, with the v11 shared grok patterns), the unchanged filter passed 4/10 of these cases and the corrected filter passed 10/10, with no event errors. The device address stays vendor detail: no case producedorigin.iportarget.ip.TestSentinelOneActionResultContractruns the filter's ordered outcome steps with this branch's go-sdkv1.1.33CEL. It checks positive and negativeequals("actionResult", …)predicates for all three standard values. The fullplugins/alertssuite passes.actionResultunset on all of them. Records and identifiers stay private.actionResult.Compatibility
3.1.0. The merged filter passed both PRs' Go tests, the full suite, and the same fabricated and replayed cases in the isolated parser.Limits
SentinelOne's syslog field reference could not be retrieved through the allowlisted documentation fetcher, and no threat or mitigation record was available. The status keys and values are therefore the existing filter's, not vendor-documented ones. The isolated parser links SDK
v1.1.26while the alerts module pinsv1.1.33, so deployed behavior after rollout remains unverified. No customer configuration was changed and no production alert is claimed.CI
The Go dependency check and prompt discovery passed. The three AI review jobs stopped at the required-secret check (
THREATWINDS_API_KEYis not available to this fork's runners), so they reviewed no code, and the aggregate check reports that failure. The local regression results above are separate from those jobs.🤖 Generated with Claude Code