Repository navigation
[CrowdStrike] Add support for NG-SIEM in alert pipeline #19048
Description
Summary
The alert data 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 missing event.severity, host.name, user.name, and other fields.
NG-SIEM correlation-detection events are identifiable by product: "ngsiem" and type: "correlation-detection". Sample events are available on request.
Problem
When a NG-SIEM correlation-detection event 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 unprocessed json.* 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.*mappings- All
correlation_rule_*fields → lost entirely
Additionally, 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_time- Compute
event.durationin nanoseconds fromevent.startandevent.end
Event 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_hosts
User context
user_names/users[].user_name→user.name(first value) +related.user(all values) +crowdstrike.alert.user_namesusers[].sid→user.id
Alert 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 implementing
Cleanup
- Remove the temporary
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 populated -
host.name,user.name, andrule.nameare populated for NG-SIEM events -
related.hosts,related.user, andrelated.ipare populated -
rule.idis populated fromcorrelation_rule_id - All
correlation_rule_*fields land undercrowdstrike.alert.* -
json.*is removed at the end of pipeline processing - Pipeline test added with expected output validated against sample events
- Field definitions added to
fields.ymlfor any newcrowdstrike.alert.*fields introduced - Existing EPP alert pipeline tests continue to pass
Activity
infra-vault-gh-plugin-prod commentedon May 18, 2026
Pinging @elastic/security-service-integrations (Team:Security-Service Integrations)
github-actions commentedon May 18, 2026
tl;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.serviceepp,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,2066ngsiemis present in benchmark config enum, indicating intended domain support:packages/crowdstrike/_dev/benchmark/system/alert-benchmark/config.yml:58#15291migrated alert collection to/alerts/combined/alerts/v1.#18158intentionally kept unknown/new fields undercrowdstrike.alertwhile explicitly removing selected unmapped fields.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:
Detailed Action Plan
packages/crowdstrike/data_stream/alert/_dev/test/pipeline/test-alert.logwith representativeevent_category/event_type/event_name/event_source/servicefields.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).packages/crowdstrike/data_stream/alert/elasticsearch/ingest_pipeline/default.yml, add conditional mappings for NG-SIEM classification fields beforeremove_intentionally_unmapped_fields.default.yml(block atremove_intentionally_unmapped_fields) so needed NG-SIEM fields are either mapped then removed (duplicate cleanup) or retained undercrowdstrike.alertwhen appropriate.packages/crowdstrike/_dev/deploy/docker/files/config-alert.ymlwith one NG-SIEM example so local/system validation includes this path.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
#19048#15291/alerts/combined/alerts/v1#18158packages/crowdstrike/data_stream/alert/agent/stream/cel.yml.hbs:43packages/crowdstrike/data_stream/alert/elasticsearch/ingest_pipeline/default.yml:2248-2281packages/crowdstrike/data_stream/alert/_dev/test/pipeline/test-alert.log-expected.jsonpackages/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.
issue_read: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".search_issues: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".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:What is this? | From workflow: Issue Triage
Give us feedback! React with 🚀 if perfect, 👍 if helpful, 👎 if not.