Skip to content

Commit 619055e

Browse files
committed
2 parents 1966d29 + 571d5fe commit 619055e

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

sigma/backends/splunk/splunk.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,9 @@ class SplunkBackend(TextQueryBackend):
235235
temporal_aggregation_expression: ClassVar[Dict[str, str]] = {
236236
"stats": "| bin _time span={timespan}\n| stats dc(event_type) as event_type_count by _time{groupby}",
237237
}
238+
temporal_extended_aggregation_expression: ClassVar[Dict[str, str]] = {
239+
"stats": "| bin _time span={timespan}\n| stats values(event_type) as event_types by _time{groupby}",
240+
}
238241

239242
timespan_mapping: ClassVar[Dict[str, str]] = {
240243
"M": "mon",
@@ -253,6 +256,13 @@ class SplunkBackend(TextQueryBackend):
253256
temporal_condition_expression: ClassVar[Dict[str, str]] = {
254257
"stats": "| search event_type_count {op} {count}"
255258
}
259+
temporal_extended_condition_expression: ClassVar[dict[str, str]] = {
260+
"stats": "| search {extended_condition}"
261+
}
262+
263+
extended_correlation_condition_rule_reference_expression: ClassVar[dict[str, str]] = {
264+
"stats": 'event_types="{ruleid}"'
265+
}
256266

257267
def __init__(
258268
self,

tests/test_backend_splunk_correlations.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,67 @@ def test_temporal_correlation_rule_stats_query(splunk_backend):
126126
127127
| search event_type_count >= 2"""]
128128

129+
def test_temporal_extended_correlation_rule_stats_query(splunk_backend):
130+
correlation_rule = SigmaCollection.from_yaml(
131+
"""
132+
title: Base rule 1
133+
name: base_rule_1
134+
status: test
135+
logsource:
136+
category: test
137+
detection:
138+
selection:
139+
fieldA: value1
140+
fieldB: value2
141+
condition: selection
142+
---
143+
title: Base rule 2
144+
name: base_rule_2
145+
status: test
146+
logsource:
147+
category: test
148+
detection:
149+
selection:
150+
fieldA: value3
151+
fieldB: value4
152+
condition: selection
153+
---
154+
title: Base rule 3
155+
name: base_rule_3
156+
status: test
157+
logsource:
158+
category: test
159+
detection:
160+
selection:
161+
fieldA: value5
162+
fieldB: value6
163+
condition: selection
164+
---
165+
title: Temporal correlation rule
166+
status: test
167+
correlation:
168+
type: temporal
169+
aliases:
170+
field:
171+
base_rule_1: fieldC
172+
base_rule_2: fieldD
173+
group-by:
174+
- fieldC
175+
condition: base_rule_1 and base_rule_2 and not base_rule_3
176+
timespan: 15m
177+
"""
178+
)
179+
assert splunk_backend.convert(correlation_rule) == [
180+
"""| multisearch
181+
[ search fieldA="value1" fieldB="value2" | eval event_type="base_rule_1" | rename fieldC as field ]
182+
[ search fieldA="value3" fieldB="value4" | eval event_type="base_rule_2" | rename fieldD as field ]
183+
[ search fieldA="value5" fieldB="value6" | eval event_type="base_rule_3" ]
184+
185+
| bin _time span=15m
186+
| stats values(event_type) as event_types by _time fieldC
187+
188+
| search event_types="base_rule_1" event_types="base_rule_2" NOT event_types="base_rule_3\""""]
189+
129190
def test_event_count_correlation_rule_with_regex_deferred(splunk_backend):
130191
"""Test that deferred regex expressions are included in correlation sub-queries."""
131192
correlation_rule = SigmaCollection.from_yaml(

0 commit comments

Comments
 (0)