Repository navigation
[CrowdStrike] Add support for NG-SIEM in alert pipeline #19048
Description
Activity
- addedIntegration:crowdstrikeCrowdStrikeCrowdStrikeenhancementNew feature or requestNew feature or requestTeam:Security-Service IntegrationsSecurity Service Integrations team [elastic/security-service-integrations]Security Service Integrations team [elastic/security-service-integrations]
on May 18, 2026 infra-vault-gh-plugin-prod commented
on May 18, 2026 More actionsPinging @elastic/security-service-integrations (Team:Security-Service Integrations)
github-actions commented
on May 18, 2026 on May 18, 2026 – with GitHub ActionsContributorMore actionstl;dr: the alert pipeline appears partially prepared but not explicitly validated/mapped for NG-SIEM; the safest path is to add NG-SIEM-specific normalization in the ingest pipeline and add NG-SIEM fixtures/tests so support is verifiable.
Recommendation
Implement NG-SIEM support in
packages/crowdstrike/data_stream/alert/elasticsearch/ingest_pipeline/default.ymlby mapping NG-SIEM classification fields before they are removed, and add dedicated NG-SIEM test fixtures in alert pipeline tests. This addresses both behavior and evidence gaps.Findings
packages/crowdstrike/data_stream/alert/agent/stream/cel.yml.hbs:43currently pulls alerts from only/alerts/combined/alerts/v1.packages/crowdstrike/data_stream/alert/elasticsearch/ingest_pipeline/default.yml:51-58sets ECSevent.category/event.typeonly for process/start conditions.packages/crowdstrike/data_stream/alert/elasticsearch/ingest_pipeline/default.yml:2248-2265,2281removes several generic alert classification fields, including:crowdstrike.alert.event_categorycrowdstrike.alert.event_typecrowdstrike.alert.event_namecrowdstrike.alert.event_sourcecrowdstrike.alert.service
- Alert pipeline expected fixtures currently include products
epp,idp,overwatch,fcs, but notngsiem:packages/crowdstrike/data_stream/alert/_dev/test/pipeline/test-alert.log-expected.json:186,404,602,929,1269,1447,1522,1603,1686,1891,2066
ngsiemis present in benchmark config enum, indicating intended domain support:packages/crowdstrike/_dev/benchmark/system/alert-benchmark/config.yml:58
- Relevant prior changes:
- PR
#15291migrated alert collection to/alerts/combined/alerts/v1. - PR
#18158intentionally kept unknown/new fields undercrowdstrike.alertwhile explicitly removing selected unmapped fields.
- PR
Note: I could not read issue bodies (including
#19048) due integrity restrictions in this run, so this recommendation is based on code and PR evidence.Verification
I ran repository searches to verify current state:
$ rg -n "alerts/combined/alerts/v1|alerts/queries/alerts|alerts/entities/alerts" packages/crowdstrike/data_stream/alert/agent/stream/cel.yml.hbs packages/crowdstrike/data_stream/alert/agent/stream/cel.yml.hbs:43: ... "/alerts/combined/alerts/v1?" packages/crowdstrike/data_stream/alert/agent/stream/cel.yml.hbs:100: ... "/alerts/combined/alerts/v1:" $ rg -n "remove_intentionally_unmapped_fields|event_category|event_type|event_name|event_source|service" packages/crowdstrike/data_stream/alert/elasticsearch/ingest_pipeline/default.yml ...:2248: tag: remove_intentionally_unmapped_fields ...:2261: - crowdstrike.alert.event_category ...:2263: - crowdstrike.alert.event_name ...:2264: - crowdstrike.alert.event_source ...:2265: - crowdstrike.alert.event_type ...:2281: - crowdstrike.alert.service $ rg -n "\"product\"\s*:\s*\"(ngsiem|epp|idp|overwatch|fcs)\"" packages/crowdstrike/data_stream/alert/_dev/test/pipeline/test-alert.log-expected.json ...:186: "product": "epp" ...:404: "product": "idp" ...:1447: "product": "overwatch" ...:2066: "product": "fcs" (no ngsiem matches) $ rg -n "ngsiem" packages/crowdstrike/_dev/deploy/docker/files/config-alert.yml No matches found. $ rg -n "ngsiem" packages/crowdstrike/_dev/benchmark/system/alert-benchmark/config.yml ...:58: - ngsiemDetailed Action Plan
- Add an NG-SIEM fixture event to
packages/crowdstrike/data_stream/alert/_dev/test/pipeline/test-alert.logwith representativeevent_category/event_type/event_name/event_source/servicefields. - Update
packages/crowdstrike/data_stream/alert/_dev/test/pipeline/test-alert.log-expected.jsonto assert ECS outcomes for that fixture (event.category,event.type,event.action, and preserved vendor fields as applicable). - In
packages/crowdstrike/data_stream/alert/elasticsearch/ingest_pipeline/default.yml, add conditional mappings for NG-SIEM classification fields beforeremove_intentionally_unmapped_fields. - Revisit the remove list in
default.yml(block atremove_intentionally_unmapped_fields) so needed NG-SIEM fields are either mapped then removed (duplicate cleanup) or retained undercrowdstrike.alertwhen appropriate. - Extend system mock responses in
packages/crowdstrike/_dev/deploy/docker/files/config-alert.ymlwith one NG-SIEM example so local/system validation includes this path. - Add changelog entry in
packages/crowdstrike/changelog.ymldescribing NG-SIEM alert pipeline support and test coverage addition.
If NG-SIEM payload retrieval differs from current combined endpoint behavior, consider a follow-up to add endpoint-mode branching in
packages/crowdstrike/data_stream/alert/agent/stream/cel.yml.hbs(similar to host stream patterns).Related Items
Type Link Relevance Issue #19048Target triage item (body unavailable in this run) PR #15291Alert stream migrated to /alerts/combined/alerts/v1PR #18158Alert mapping simplification; unknown fields strategy and explicit removals File packages/crowdstrike/data_stream/alert/agent/stream/cel.yml.hbs:43Current alert endpoint selection File packages/crowdstrike/data_stream/alert/elasticsearch/ingest_pipeline/default.yml:2248-2281Explicitly removed alert classification fields File packages/crowdstrike/data_stream/alert/_dev/test/pipeline/test-alert.log-expected.jsonNo NG-SIEM product fixtures today File packages/crowdstrike/_dev/benchmark/system/alert-benchmark/config.yml:58ngsiemappears in benchmark enumNote
🔒 Integrity filter blocked 3 items
The following items were blocked because they don't meet the GitHub integrity level.
- #19048
issue_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved". - #19048
search_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved". - #14135
issue_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
To allow these resources, lower
min-integrityin your GitHub frontmatter:tools: github: min-integrity: approved # merged | approved | unapproved | none
What is this? | From workflow: Issue Triage
Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.
- addedTeam:SDE-CrestCrest developers on the Security Integrations team [elastic/sit-crest-contractors]Crest developers on the Security Integrations team [elastic/sit-crest-contractors]
on May 19, 2026
Summary
The
alertdata stream pipeline currently handles EPP (endpoint protection) style alerts from the CrowdStrike Alerts REST API. CrowdStrike's NG-SIEM product generates a distinct alert type —correlation-detection— that shares only a handful of field names with EPP alerts and exposes host, user, IP, and threat context via different top-level fields. These events pass through the current pipeline largely unprocessed, resulting in missingevent.severity,host.name,user.name, and other fields.NG-SIEM correlation-detection events are identifiable by
product: "ngsiem"andtype: "correlation-detection". Sample events are available on request.Problem
When a NG-SIEM
correlation-detectionevent is ingested through the current pipeline, only 11 of its ~50 fields are processed (id,agent_id,aggregate_id,cid,composite_id,crawled_timestamp,created_timestamp,data_domains,description,falcon_host_link,name). All of the following are silently dropped into unprocessedjson.*fields:severity/severity_name→event.severityis never setstatus→crowdstrike.alert.statusis never settype: "correlation-detection"→ not captured anywherehost_names[]→ nohost.name(pipeline expects EPP-styledevice.hostname)source_ips[]→ nohost.iporrelated.ipuser_names[]/users[]→ nouser.nameorrelated.usermitre_attack[]→ nothreat.*mappingscorrelation_rule_*fields → lost entirelyAdditionally, unlike other alert pipelines (e.g. Microsoft Sentinel), the CrowdStrike alert pipeline does not remove the temporary
json.*object at the end of processing, meaning unprocessed fields accumulate in the document.Suggested approach
The following mappings are suggestions based on analysis of sample events . They should be validated against sample data and discussed with the team before implementation. Sample events are available on request.
Timestamps
updated_timestamp→crowdstrike.alert.updated_timestampstart_time→event.start+crowdstrike.alert.start_timeend_time→event.end+crowdstrike.alert.end_timeevent.durationin nanoseconds fromevent.startandevent.endEvent categorisation
severity→event.severitydirectly (already an integer in the 0–100 range per the CrowdStrike Parsing Standard — no script transformation needed, unlike the Sentinel pipeline)severity_name,status,type,product→crowdstrike.alert.*Host context
host_names[0]→host.name; full array →crowdstrike.alert.host_names+related.hostssource_ips→crowdstrike.alert.source_ips+related.ip; whether these should also populatehost.ipshould be confirmed against sample data — these are the IPs of source hosts involved in the detection, but the right ECS target depends on the nature of the eventssource_hosts→crowdstrike.alert.source_hostsUser context
user_names/users[].user_name→user.name(first value) +related.user(all values) +crowdstrike.alert.user_namesusers[].sid→user.idAlert identification
detection_id,display_name,event_ids,pattern_id,vendor_pattern_id→crowdstrike.alert.*display_name→rule.namefalcon_host_link→event.url(in addition to existingcrowdstrike.alert.falcon_host_link)Source context
source_products[0]→event.providersource_products,source_vendors→crowdstrike.alert.*Correlation rule fields
correlation_rule_id→rule.id+crowdstrike.alert.correlation_rule_idcorrelation_rule_execution_id,correlation_rule_version_id,correlation_rule_user_id,correlation_rule_user_uuid,correlation_rule_create_case→crowdstrike.alert.*MITRE ATT&CK
mitre_attack→crowdstrike.alert.mitre_attack; when the array is non-empty, populatethreat.*fields following the existing EPP pattern in this pipeline — the structure of populatedmitre_attackentries should be verified against sample data before implementingCleanup
jsonobject at the end of the pipeline and drop null/empty values, consistent with the pattern used in other alert pipelines (e.g. Microsoft Sentinel alert pipeline)Acceptance criteria
event.severity,event.start,event.end, andevent.durationare populatedhost.name,user.name, andrule.nameare populated for NG-SIEM eventsrelated.hosts,related.user, andrelated.ipare populatedrule.idis populated fromcorrelation_rule_idcorrelation_rule_*fields land undercrowdstrike.alert.*json.*is removed at the end of pipeline processingfields.ymlfor any newcrowdstrike.alert.*fields introduced