@@ -1613,6 +1613,7 @@ def convert_correlation_temporal_ordered_rule(
1613
1613
def convert_correlation_search (
1614
1614
self ,
1615
1615
rule : SigmaCorrelationRule ,
1616
+ ** kwargs ,
1616
1617
) -> str :
1617
1618
if ( # if the correlation rule refers only a single rule and this rule results only in a single query
1618
1619
len (rule .rules ) == 1
@@ -1625,6 +1626,7 @@ def convert_correlation_search(
1625
1626
normalization = self .convert_correlation_search_field_normalization_expression (
1626
1627
rule .aliases , rule_reference
1627
1628
),
1629
+ ** kwargs ,
1628
1630
)
1629
1631
else :
1630
1632
return self .correlation_search_multi_rule_expression .format (
@@ -1633,7 +1635,9 @@ def convert_correlation_search(
1633
1635
self .correlation_search_multi_rule_query_expression .format (
1634
1636
rule = rule_reference .rule ,
1635
1637
ruleid = rule_reference .rule .name or rule_reference .rule .id ,
1636
- query = query ,
1638
+ query = self .convert_correlation_search_multi_rule_query_postprocess (
1639
+ query
1640
+ ),
1637
1641
normalization = self .convert_correlation_search_field_normalization_expression (
1638
1642
rule .aliases ,
1639
1643
rule_reference ,
@@ -1642,33 +1646,43 @@ def convert_correlation_search(
1642
1646
for rule_reference in rule .rules
1643
1647
for query in rule_reference .rule .get_conversion_result ()
1644
1648
)
1645
- )
1649
+ ),
1650
+ ** kwargs ,
1646
1651
)
1647
1652
1653
+ def convert_correlation_search_multi_rule_query_postprocess (
1654
+ self ,
1655
+ query : str ,
1656
+ ) -> str :
1657
+ """This function is called for each query in the multi-rule correlation search phase. It can be used to postprocess the query before it is joined with the other queries."""
1658
+ return query
1659
+
1648
1660
def convert_correlation_search_field_normalization_expression (
1649
1661
self ,
1650
1662
aliases : SigmaCorrelationFieldAliases ,
1651
1663
rule_reference : SigmaRule ,
1652
1664
) -> str :
1653
- if (
1665
+ if len (aliases ) == 0 :
1666
+ return ""
1667
+ elif (
1654
1668
self .correlation_search_field_normalization_expression is None
1655
1669
or self .correlation_search_field_normalization_expression_joiner is None
1656
1670
):
1657
1671
raise NotImplementedError (
1658
1672
"Correlation field normalization is not supported by backend."
1659
1673
)
1660
-
1661
- return self .correlation_search_field_normalization_expression_joiner .join (
1662
- (
1663
- self .correlation_search_field_normalization_expression .format (
1664
- alias = alias .alias ,
1665
- field = field ,
1674
+ else :
1675
+ return self .correlation_search_field_normalization_expression_joiner .join (
1676
+ (
1677
+ self .correlation_search_field_normalization_expression .format (
1678
+ alias = alias .alias ,
1679
+ field = field ,
1680
+ )
1681
+ for alias in aliases
1682
+ for alias_rule_reference , field in alias .mapping .items ()
1683
+ if alias_rule_reference == rule_reference
1666
1684
)
1667
- for alias in aliases
1668
- for alias_rule_reference , field in alias .mapping .items ()
1669
- if alias_rule_reference == rule_reference
1670
1685
)
1671
- )
1672
1686
1673
1687
# Implementation of the typing phase of the correlation query.
1674
1688
def convert_correlation_typing (self , rule : SigmaCorrelationRule ) -> str :
@@ -1681,14 +1695,21 @@ def convert_correlation_typing(self, rule: SigmaCorrelationRule) -> str:
1681
1695
self .typing_rule_query_expression .format (
1682
1696
rule = rule_reference .rule ,
1683
1697
ruleid = rule_reference .rule .name or rule_reference .rule .id ,
1684
- query = query ,
1698
+ query = self . convert_correlation_typing_query_postprocess ( query ) ,
1685
1699
)
1686
1700
for rule_reference in rule .rules
1687
1701
for query in rule_reference .rule .get_conversion_result ()
1688
1702
)
1689
1703
)
1690
1704
)
1691
1705
1706
+ def convert_correlation_typing_query_postprocess (
1707
+ self ,
1708
+ query : str ,
1709
+ ) -> str :
1710
+ """This function is called for each query in the typing phase of the correlation query. It can be used to postprocess the query before it is joined with the other queries."""
1711
+ return query
1712
+
1692
1713
# Implementation of the aggregation phase of the correlation query.
1693
1714
def convert_correlation_aggregation_from_template (
1694
1715
self , rule : SigmaCorrelationRule , correlation_type : SigmaCorrelationTypeLiteral , method : str
0 commit comments