Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions sigma/validators/sigmahq/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,39 @@ def validate(self, rule: SigmaRuleBase) -> List[SigmaValidationIssue]:
return []


@dataclass
class SigmahqModifiedDateOrderIssue(SigmaValidationIssue):
description: ClassVar[str] = (
"Rule has a modified field that has value older than the date field. Modified will always be in the future compared to date."
)
severity: ClassVar[SigmaValidationIssueSeverity] = SigmaValidationIssueSeverity.HIGH


class SigmahqModifiedDateOrderValidator(SigmaRuleValidator):
"""Checks if a rule has a modified field that has value older than the date field."""

def validate(self, rule: SigmaRuleBase) -> List[SigmaValidationIssue]:
if rule.date is not None and rule.modified is not None:
if rule.modified < rule.date:
return [SigmahqModifiedDateOrderIssue([rule])]
return []


@dataclass
class SigmahqModifiedWithoutDateIssue(SigmaValidationIssue):
description: ClassVar[str] = "Rule has a modified field without a date field"
severity: ClassVar[SigmaValidationIssueSeverity] = SigmaValidationIssueSeverity.HIGH


class SigmahqModifiedWithoutDateValidator(SigmaRuleValidator):
"""Checks if a rule has a modified field without a date field."""

def validate(self, rule: SigmaRuleBase) -> List[SigmaValidationIssue]:
if rule.modified is not None and rule.date is None:
return [SigmahqModifiedWithoutDateIssue([rule])]
return []


@dataclass
class SigmahqDescriptionExistenceIssue(SigmaValidationIssue):
description: ClassVar[str] = "Rule is missing the description field"
Expand Down
79 changes: 79 additions & 0 deletions tests/test_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
SigmahqStatusValidator,
SigmahqDateExistenceIssue,
SigmahqDateExistenceValidator,
SigmahqModifiedDateOrderIssue,
SigmahqModifiedDateOrderValidator,
SigmahqModifiedWithoutDateIssue,
SigmahqModifiedWithoutDateValidator,
SigmahqDescriptionExistenceIssue,
SigmahqDescriptionExistenceValidator,
SigmahqDescriptionLengthIssue,
Expand Down Expand Up @@ -126,6 +130,81 @@ def test_validator_SigmahqDateExistence_valid():
assert validator.validate(rule) == []


def test_validator_SigmahqModifiedDateOrder_older():
validator = SigmahqModifiedDateOrderValidator()
rule = SigmaRule.from_yaml(
"""
title: test
status: stable
date: 2023-12-10
modified: 2023-12-05
logsource:
category: test
detection:
sel:
field: path\\*something
condition: sel
"""
)
assert validator.validate(rule) == [SigmahqModifiedDateOrderIssue([rule])]


def test_validator_SigmahqModifiedDateOrder_valid():
validator = SigmahqModifiedDateOrderValidator()
rule = SigmaRule.from_yaml(
"""
title: test
status: stable
date: 2023-12-10
modified: 2023-12-15
logsource:
category: test
detection:
sel:
field: path\\*something
condition: sel
"""
)
assert validator.validate(rule) == []


def test_validator_SigmahqModifiedWithoutDate():
validator = SigmahqModifiedWithoutDateValidator()
rule = SigmaRule.from_yaml(
"""
title: test
status: stable
modified: 2023-12-05
logsource:
category: test
detection:
sel:
field: path\\*something
condition: sel
"""
)
assert validator.validate(rule) == [SigmahqModifiedWithoutDateIssue([rule])]


def test_validator_SigmahqModifiedWithoutDate_valid():
validator = SigmahqModifiedWithoutDateValidator()
rule = SigmaRule.from_yaml(
"""
title: test
status: stable
date: 2023-12-10
modified: 2023-12-15
logsource:
category: test
detection:
sel:
field: path\\*something
condition: sel
"""
)
assert validator.validate(rule) == []


def test_validator_SigmahqStatusExistence():
validator = SigmahqStatusExistenceValidator()
rule = SigmaRule.from_yaml(
Expand Down