First Seen Network Flow Exporter Followed by Suspicious Source Activity
Identifies a newly observed NetFlow, IPFIX, or sFlow exporter IP followed by another detection alert with medium-or-higher severity or an elevated risk score, where that exporter IP is the source of the detected activity in the same data stream namespace. This correlation adds behavioral evidence that can help distinguish routine exporter onboarding from a potentially unauthorized or compromised exporter introduced as part of defense evasion.
Elastic rule (View on GitHub)
1[metadata]
2creation_date = "2026/08/24"
3integration = ["netflow", "goflow2"]
4maturity = "production"
5updated_date = "2026/09/18"
6
7[rule]
8author = ["Elastic"]
9description = """
10Identifies a newly observed NetFlow, IPFIX, or sFlow exporter IP followed by another detection alert with
11medium-or-higher severity or an elevated risk score, where that exporter IP is the source of the detected activity in
12the same data stream namespace. This correlation adds behavioral evidence that can help distinguish routine exporter
13onboarding from a potentially unauthorized or compromised exporter introduced as part of defense evasion.
14"""
15false_positives = [
16 """
17 Newly deployed network devices may legitimately generate other detection alerts during commissioning, testing,
18 vulnerability scanning, or monitoring validation. Shared addresses, network address translation, and incomplete
19 asset attribution can also cause unrelated activity to correlate to the exporter IP.
20 """,
21]
22from = "now-45m"
23interval = "15m"
24language = "esql"
25license = "Elastic License v2"
26name = "First Seen Network Flow Exporter Followed by Suspicious Source Activity"
27note = """## Triage and analysis
28
29### Investigating First Seen Network Flow Exporter Followed by Suspicious Source Activity
30
31This higher-order rule correlates the building-block alert "First Seen Network Flow Exporter" with a later detection
32alert that has medium-or-higher severity or an elevated risk score within 30 minutes. The new exporter's `observer.ip`
33must equal the later alert's `source.ip`, and both alerts must share the same `data_stream.namespace`.
34
35This relationship provides stronger evidence than suspicious flows merely reported by the exporter. It indicates that
36the exporter address itself was subsequently identified as the source of separately detected activity. It does not by
37itself prove telemetry injection, exporter compromise, or the addition of a rogue collector. A rogue collector receives
38flow exports and generally requires network-device configuration or audit telemetry to detect directly.
39
40### Possible investigation steps
41
42- Review the `observer.ip`, `source.ip`, correlation timestamps, and suspicious rule names and IDs surfaced in the
43 alert. Pivot to the contributing alerts to review their risk score, destination, host, and user context.
44- Confirm that `observer.ip` belongs to the newly observed exporter and that NAT, shared addressing, or stale asset
45 records did not cause the correlation.
46- Examine the second alert's rule name and determine what behavior associated the exporter address with `source.ip`.
47- Verify the exporter's owner, device type, software version, management plane, recent configuration changes, and
48 approved collector destinations.
49- Review authentication, process, network-device audit, and configuration telemetry for the exporter around the
50 correlation window.
51- Compare observation domains, exporter version, uptime, sequence values, templates, sampling configuration, and flow
52 volume with established exporters.
53- Search for additional alerts involving the exporter address and for malformed, implausible, or conflicting flow
54 records received from it.
55
56### False positive analysis
57
58- Validate recent device onboarding, migrations, disaster-recovery activation, penetration tests, vulnerability scans,
59 and monitoring validation.
60- Determine whether `source.ip` represents the exporter itself or a shared NAT, proxy, scanner, or management address.
61- Confirm that the correlated source alert is a meaningful behavioral detection rather than an expected administrative
62 or discovery event.
63
64### Response and remediation
65
66- If the exporter is unauthorized or compromised, restrict it at the collector boundary and isolate its management
67 plane as appropriate.
68- Preserve flow records, source alerts, configuration history, authentication events, and network evidence.
69- Remove unauthorized export configuration, restore trusted device configuration, rotate affected credentials, and
70 review collector ACLs and authentication.
71"""
72references = [
73 "https://www.elastic.co/docs/solutions/security/detect-and-alert/about-building-block-rules",
74 "https://www.elastic.co/docs/reference/integrations/netflow",
75 "https://www.elastic.co/docs/reference/integrations/goflow2",
76 "https://datatracker.ietf.org/doc/html/rfc7011",
77 "https://sflow.org/sflow_version_5.txt",
78]
79risk_score = 73
80rule_id = "882c8edc-1e39-4a60-80b2-485491b6c91c"
81setup = """## Setup
82
83Enable the building-block rule "First Seen Network Flow Exporter" and detection rules that can identify suspicious
84activity with `source.ip` populated. The building-block rule requires decoded NetFlow, IPFIX, or sFlow records from the
85Elastic NetFlow (`netflow.log`) or GoFlow2 (`goflow2.sflow`) integration.
86
87The higher-order rule searches Elastic Security alert indices. The correlated source alert must preserve the exporter
88address in `source.ip` and preserve `data_stream.namespace`; alerts without either field cannot contribute to this
89correlation. Building-block, higher-order, machine-learning, new-terms, threat-match, and deprecated-rule alerts are
90excluded as the second event.
91"""
92severity = "high"
93tags = [
94 "Domain: Network",
95 "Use Case: Network Security Monitoring",
96 "Use Case: Threat Detection",
97 "Tactic: Defense Evasion",
98 "Rule Type: Higher-Order Rule",
99 "Data Source: Elastic Security",
100 "Data Source: NetFlow",
101 "Data Source: GoFlow2",
102 "Resources: Investigation Guide",
103 "Rule Type: ES|QL",
104]
105timestamp_override = "event.ingested"
106type = "esql"
107
108query = '''
109FROM .alerts-security.*
110| WHERE event.kind == "signal"
111 AND data_stream.namespace IS NOT NULL
112 AND (
113 (kibana.alert.rule.rule_id == "dfe3f626-4224-417e-aff1-8ef9a72c3191" AND observer.ip IS NOT NULL)
114 OR
115 (source.ip IS NOT NULL
116 AND kibana.alert.rule.name IS NOT NULL
117 AND kibana.alert.rule.rule_id IS NOT NULL
118 AND kibana.alert.rule.rule_id != "dfe3f626-4224-417e-aff1-8ef9a72c3191"
119 AND (kibana.alert.risk_score >= 47 OR kibana.alert.severity IN ("medium", "high", "critical"))
120 AND KQL("""NOT kibana.alert.building_block_type : *""")
121 AND NOT kibana.alert.rule.type IN ("machine_learning", "new_terms", "threat_match")
122 AND NOT kibana.alert.rule.name LIKE "Deprecated - *"
123 AND NOT KQL("""kibana.alert.rule.tags : "Rule Type: Higher-Order Rule" """))
124 )
125| EVAL
126 Esql.is_exporter_alert = kibana.alert.rule.rule_id == "dfe3f626-4224-417e-aff1-8ef9a72c3191",
127 Esql.is_suspicious_source_alert = kibana.alert.rule.rule_id != "dfe3f626-4224-417e-aff1-8ef9a72c3191",
128 Esql.correlation_ip = CASE(Esql.is_exporter_alert, observer.ip, source.ip),
129 Esql.exporter_alert_timestamp = CASE(Esql.is_exporter_alert, @timestamp, null),
130 Esql.suspicious_source_alert_timestamp = CASE(Esql.is_suspicious_source_alert, @timestamp, null),
131 Esql.suspicious_rule_name = CASE(Esql.is_suspicious_source_alert, kibana.alert.rule.name, null),
132 Esql.suspicious_rule_id = CASE(Esql.is_suspicious_source_alert, kibana.alert.rule.rule_id, null)
133| WHERE Esql.correlation_ip IS NOT NULL
134| STATS
135 Esql.exporter_alert_count = SUM(CASE(Esql.is_exporter_alert, 1, 0)),
136 Esql.suspicious_source_alert_count = SUM(CASE(Esql.is_suspicious_source_alert, 1, 0)),
137 observer.ip = MAX(CASE(Esql.is_exporter_alert, Esql.correlation_ip, null)),
138 source.ip = MAX(CASE(Esql.is_suspicious_source_alert, Esql.correlation_ip, null)),
139 Esql.exporter_alert_timestamp = MIN(Esql.exporter_alert_timestamp),
140 Esql.suspicious_source_alert_timestamp = MAX(Esql.suspicious_source_alert_timestamp),
141 Esql.suspicious_rule_name_values = VALUES(Esql.suspicious_rule_name),
142 Esql.suspicious_rule_id_values = VALUES(Esql.suspicious_rule_id)
143 BY data_stream.namespace, Esql.correlation_ip
144| EVAL Esql.time_diff_seconds = DATE_DIFF(
145 "second", Esql.exporter_alert_timestamp, Esql.suspicious_source_alert_timestamp
146 )
147| WHERE Esql.exporter_alert_count > 0
148 AND Esql.suspicious_source_alert_count > 0
149 AND Esql.time_diff_seconds >= 0
150 AND Esql.time_diff_seconds <= 1800
151| KEEP
152 data_stream.namespace,
153 observer.ip,
154 source.ip,
155 Esql.correlation_ip,
156 Esql.exporter_alert_count,
157 Esql.suspicious_source_alert_count,
158 Esql.exporter_alert_timestamp,
159 Esql.suspicious_source_alert_timestamp,
160 Esql.suspicious_rule_name_values,
161 Esql.suspicious_rule_id_values,
162 Esql.time_diff_seconds
163'''
164
165
166[[rule.threat]]
167framework = "MITRE ATT&CK"
168[[rule.threat.technique]]
169id = "T1562"
170name = "Impair Defenses"
171reference = "https://attack.mitre.org/techniques/T1562/"
172
173
174[rule.threat.tactic]
175id = "TA0005"
176name = "Defense Evasion"
177reference = "https://attack.mitre.org/tactics/TA0005/"
178
179[rule.investigation_fields]
180field_names = [
181 "observer.ip",
182 "source.ip",
183 "data_stream.namespace",
184 "Esql.exporter_alert_timestamp",
185 "Esql.suspicious_source_alert_timestamp",
186 "Esql.suspicious_rule_name_values",
187 "Esql.suspicious_rule_id_values",
188 "Esql.time_diff_seconds",
189]
Triage and analysis
Investigating First Seen Network Flow Exporter Followed by Suspicious Source Activity
This higher-order rule correlates the building-block alert "First Seen Network Flow Exporter" with a later detection
alert that has medium-or-higher severity or an elevated risk score within 30 minutes. The new exporter's observer.ip
must equal the later alert's source.ip, and both alerts must share the same data_stream.namespace.
This relationship provides stronger evidence than suspicious flows merely reported by the exporter. It indicates that the exporter address itself was subsequently identified as the source of separately detected activity. It does not by itself prove telemetry injection, exporter compromise, or the addition of a rogue collector. A rogue collector receives flow exports and generally requires network-device configuration or audit telemetry to detect directly.
Possible investigation steps
- Review the
observer.ip,source.ip, correlation timestamps, and suspicious rule names and IDs surfaced in the alert. Pivot to the contributing alerts to review their risk score, destination, host, and user context. - Confirm that
observer.ipbelongs to the newly observed exporter and that NAT, shared addressing, or stale asset records did not cause the correlation. - Examine the second alert's rule name and determine what behavior associated the exporter address with
source.ip. - Verify the exporter's owner, device type, software version, management plane, recent configuration changes, and approved collector destinations.
- Review authentication, process, network-device audit, and configuration telemetry for the exporter around the correlation window.
- Compare observation domains, exporter version, uptime, sequence values, templates, sampling configuration, and flow volume with established exporters.
- Search for additional alerts involving the exporter address and for malformed, implausible, or conflicting flow records received from it.
False positive analysis
- Validate recent device onboarding, migrations, disaster-recovery activation, penetration tests, vulnerability scans, and monitoring validation.
- Determine whether
source.iprepresents the exporter itself or a shared NAT, proxy, scanner, or management address. - Confirm that the correlated source alert is a meaningful behavioral detection rather than an expected administrative or discovery event.
Response and remediation
- If the exporter is unauthorized or compromised, restrict it at the collector boundary and isolate its management plane as appropriate.
- Preserve flow records, source alerts, configuration history, authentication events, and network evidence.
- Remove unauthorized export configuration, restore trusted device configuration, rotate affected credentials, and review collector ACLs and authentication.
References
Related rules
- Elastic Defend and Network Security Alerts Correlation
- Multiple DHCP Servers Responding to the Same Transaction
- Newly Observed FortiGate Alert
- Newly Observed High Severity Suricata Alert
- Newly Observed Palo Alto Network Alert