Skip to content

Commit acf2959

Browse files
feat: add validator for modified date order (#55)
* feat: add validator for modified date order * fix: poetry black reformatting issues * remove redundant test * Apply suggestions from code review Co-authored-by: phantinuss <79651203+phantinuss@users.noreply.github.com> * reformatting --------- Co-authored-by: phantinuss <79651203+phantinuss@users.noreply.github.com>
1 parent 0d30ef9 commit acf2959

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed

sigma/validators/sigmahq/metadata.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,41 @@ def validate(self, rule: SigmaRuleBase) -> List[SigmaValidationIssue]:
7777
return []
7878

7979

80+
@dataclass
81+
class SigmahqModifiedDateOrderIssue(SigmaValidationIssue):
82+
description: ClassVar[str] = (
83+
"Rule has a modified field whose value is older than that of the date field. The modified date has always to be newer than date."
84+
)
85+
severity: ClassVar[SigmaValidationIssueSeverity] = SigmaValidationIssueSeverity.MEDIUM
86+
87+
88+
class SigmahqModifiedDateOrderValidator(SigmaRuleValidator):
89+
"""Checks if a rule has a modified field that has value older than the date field."""
90+
91+
def validate(self, rule: SigmaRuleBase) -> List[SigmaValidationIssue]:
92+
if rule.date is not None and rule.modified is not None:
93+
if rule.modified < rule.date:
94+
return [SigmahqModifiedDateOrderIssue([rule])]
95+
return []
96+
97+
98+
@dataclass
99+
class SigmahqModifiedWithoutDateIssue(SigmaValidationIssue):
100+
description: ClassVar[str] = (
101+
"Rule has a modified field without a date field. New rules should only have a date field."
102+
)
103+
severity: ClassVar[SigmaValidationIssueSeverity] = SigmaValidationIssueSeverity.HIGH
104+
105+
106+
class SigmahqModifiedWithoutDateValidator(SigmaRuleValidator):
107+
"""Checks if a rule has a modified field without a date field."""
108+
109+
def validate(self, rule: SigmaRuleBase) -> List[SigmaValidationIssue]:
110+
if rule.modified is not None and rule.date is None:
111+
return [SigmahqModifiedWithoutDateIssue([rule])]
112+
return []
113+
114+
80115
@dataclass
81116
class SigmahqDescriptionExistenceIssue(SigmaValidationIssue):
82117
description: ClassVar[str] = "Rule is missing the description field"

tests/test_metadata.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
SigmahqStatusValidator,
1414
SigmahqDateExistenceIssue,
1515
SigmahqDateExistenceValidator,
16+
SigmahqModifiedDateOrderIssue,
17+
SigmahqModifiedDateOrderValidator,
18+
SigmahqModifiedWithoutDateIssue,
19+
SigmahqModifiedWithoutDateValidator,
1620
SigmahqDescriptionExistenceIssue,
1721
SigmahqDescriptionExistenceValidator,
1822
SigmahqDescriptionLengthIssue,
@@ -126,6 +130,81 @@ def test_validator_SigmahqDateExistence_valid():
126130
assert validator.validate(rule) == []
127131

128132

133+
def test_validator_SigmahqModifiedDateOrder_older():
134+
validator = SigmahqModifiedDateOrderValidator()
135+
rule = SigmaRule.from_yaml(
136+
"""
137+
title: test
138+
status: stable
139+
date: 2023-12-10
140+
modified: 2023-12-05
141+
logsource:
142+
category: test
143+
detection:
144+
sel:
145+
field: path\\*something
146+
condition: sel
147+
"""
148+
)
149+
assert validator.validate(rule) == [SigmahqModifiedDateOrderIssue([rule])]
150+
151+
152+
def test_validator_SigmahqModifiedDateOrder_valid():
153+
validator = SigmahqModifiedDateOrderValidator()
154+
rule = SigmaRule.from_yaml(
155+
"""
156+
title: test
157+
status: stable
158+
date: 2023-12-10
159+
modified: 2023-12-15
160+
logsource:
161+
category: test
162+
detection:
163+
sel:
164+
field: path\\*something
165+
condition: sel
166+
"""
167+
)
168+
assert validator.validate(rule) == []
169+
170+
171+
def test_validator_SigmahqModifiedWithoutDate():
172+
validator = SigmahqModifiedWithoutDateValidator()
173+
rule = SigmaRule.from_yaml(
174+
"""
175+
title: test
176+
status: stable
177+
modified: 2023-12-05
178+
logsource:
179+
category: test
180+
detection:
181+
sel:
182+
field: path\\*something
183+
condition: sel
184+
"""
185+
)
186+
assert validator.validate(rule) == [SigmahqModifiedWithoutDateIssue([rule])]
187+
188+
189+
def test_validator_SigmahqModifiedWithoutDate_valid():
190+
validator = SigmahqModifiedWithoutDateValidator()
191+
rule = SigmaRule.from_yaml(
192+
"""
193+
title: test
194+
status: stable
195+
date: 2023-12-10
196+
modified: 2023-12-15
197+
logsource:
198+
category: test
199+
detection:
200+
sel:
201+
field: path\\*something
202+
condition: sel
203+
"""
204+
)
205+
assert validator.validate(rule) == []
206+
207+
129208
def test_validator_SigmahqStatusExistence():
130209
validator = SigmahqStatusExistenceValidator()
131210
rule = SigmaRule.from_yaml(

0 commit comments

Comments
 (0)