sigma.grammar module

Sigma rule detection condition grammar parsing rules and classes. The classes defined here facilitate the abstract parsing of detection rules into Python-processable class structures. You should not need to interact directly with this module except when implementing serializers.

There are two main types of expressions defined here: core expressions and field comparisons. Core expressions are parsed from the Rule.detection.condition property and are things like the core logical expressions. While field comparisons are constructed from the detection matching identifiers and are things like field equality tests

class sigma.grammar.Base64FieldEquality(*, parent: Expression = None, field: str, value: Union[str, bytes])

Bases: sigma.grammar.FieldComparison

Test for field equality of base64 string

to_detection() Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

value: Union[str, bytes]
class sigma.grammar.CoreExpression(*, parent: Expression = None, args: List[Union[sigma.grammar.Expression, str]])

Bases: sigma.grammar.Expression

Core expressions are the ones directly parsed from the condition grammar (as opposed to equality expressions parsed from detection tests).

args: List[Union[sigma.grammar.Expression, str]]
classmethod from_parsed(s: str, loc: int, tokens: pyparsing.results.ParseResults) sigma.grammar.Expression

Convert the parsed expression into an expression instance

postprocess(rule: sigma.schema.RuleDetection, parent: Optional[Expression] = None) Expression
class sigma.grammar.Expression(*, parent: Expression = None)

Bases: pydantic.main.BaseModel

Base class for all grammar expressions (and, or, not, identifier, selector)

operator: ClassVar[bool] = False
parent: Optional[sigma.grammar.Expression]
postprocess(rule: sigma.schema.RuleDetection, parent: Optional[Expression] = None) Expression
to_detection() Tuple[str, List[Union[List, Dict]]]

Convert an expression to a condition string and a dict of new detection selectors.

visit(callback: Callable[[sigma.grammar.Expression], sigma.grammar.Expression]) sigma.grammar.Expression

Execute the given callback for each expression in the tree. The callback must return an expression to replace to visited expression (or the same reference to leave it unchanged).

class sigma.grammar.FieldComparison(*, parent: Expression = None, field: str, value: Any = None)

Bases: sigma.grammar.Expression

Base class for direct field comparisons

field: str
to_detection() Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

to_field_with_modifiers() str
value: Any
class sigma.grammar.FieldContains(*, parent: Expression = None, field: str, value: str)

Bases: sigma.grammar.FieldComparison

Test if a string is in the field somewhere

to_detection() Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

to_field_with_modifiers() str
value: str
class sigma.grammar.FieldEndsWith(*, parent: Expression = None, field: str, value: str)

Bases: sigma.grammar.FieldComparison

Test if a field ends with a token

to_detection() Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

to_field_with_modifiers() str
value: str
class sigma.grammar.FieldEquality(*, parent: Expression = None, field: str, value: Any = None)

Bases: sigma.grammar.FieldComparison

Test for field equality

field: str
parent: Optional[sigma.grammar.Expression]
to_detection() Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

value: Any
class sigma.grammar.FieldLike(*, parent: Expression = None, field: str, value: Any = None)

Bases: sigma.grammar.FieldComparison

Test for field equality

field: str
parent: Optional[sigma.grammar.Expression]
postprocess(rule: sigma.schema.RuleDetection, parent: Optional[Expression] = None) Expression
to_detection() Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

value: Any
class sigma.grammar.FieldLookup(*, parent: Expression = None, field: str, value: List[Any])

Bases: sigma.grammar.FieldComparison

Check if the field is in a list of values with wildcard matching

value: List[Any]
class sigma.grammar.FieldLookupRegex(*, parent: Expression = None, field: str, value: List[str])

Bases: sigma.grammar.FieldLookup

Field lookup but with a regex modifier

to_field_with_modifiers() str
value: List[str]
class sigma.grammar.FieldNotEmpty(*, parent: Expression = None, field: str, value: None = None)

Bases: sigma.grammar.FieldComparison

A field comparison such as ‘field is not null’

to_detection() Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

value: None
class sigma.grammar.FieldRegex(*, parent: Expression = None, field: str, value: str)

Bases: sigma.grammar.FieldComparison

Compare a field with a regular expression

to_detection() Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

to_field_with_modifiers() str
value: str
class sigma.grammar.FieldStartsWith(*, parent: Expression = None, field: str, value: str)

Bases: sigma.grammar.FieldComparison

Test if a field starts with a token

to_detection() Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

to_field_with_modifiers() str
value: str
class sigma.grammar.Identifier(*, parent: Expression = None, args: List[Union[sigma.grammar.Expression, str]])

Bases: sigma.grammar.CoreExpression

Expression which identifies a specific detection condition

args: List[Union[sigma.grammar.Expression, str]]
property identifier: str

Shortcut for grabbing the identifier

parent: Optional[sigma.grammar.Expression]
postprocess(rule: sigma.schema.Rule, parent: Optional[sigma.grammar.Expression] = None) sigma.grammar.Expression

Resolve the detection identifier

class sigma.grammar.KeywordSearch(*, parent: Expression = None, value: Any = None)

Bases: sigma.grammar.Expression

Search for a literal keyword/string instead of a direct comparison

to_detection() Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

value: Any
class sigma.grammar.LogicalAnd(*, parent: Expression = None, args: List[Union[sigma.grammar.Expression, str]])

Bases: sigma.grammar.LogicalExpression

Logical And Expression

operator: ClassVar[bool] = True
postprocess(rule: sigma.schema.RuleDetection, parent: Optional[Expression] = None) Expression
to_detection(group: bool = True) Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

class sigma.grammar.LogicalExpression(*, parent: Expression = None, args: List[Union[sigma.grammar.Expression, str]])

Bases: sigma.grammar.CoreExpression

Logical expression

operator: ClassVar[bool] = True
postprocess(rule: sigma.schema.RuleDetection, parent: Optional[Expression] = None) Expression
class sigma.grammar.LogicalNot(*, parent: Expression = None, args: List[Union[sigma.grammar.Expression, str]])

Bases: sigma.grammar.LogicalExpression

Logical not expression

operator: ClassVar[bool] = True
postprocess(detection: sigma.schema.RuleDetection, parent: Optional[Expression] = None) Expression

Handle “not null” situations

to_detection() Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

class sigma.grammar.LogicalOr(*, parent: Expression = None, args: List[Union[sigma.grammar.Expression, str]])

Bases: sigma.grammar.LogicalExpression

Logical Or expression

operator: ClassVar[bool] = True
postprocess(rule: sigma.schema.RuleDetection, parent: Optional[Expression] = None) Expression
to_detection(group: bool = True) Tuple[str, List[Union[List, Dict]]]

Convert a not expression to a detection condition

class sigma.grammar.Selector(*, parent: Expression = None, args: List[Union[sigma.grammar.Expression, str]])

Bases: sigma.grammar.CoreExpression

Selector expression which is converted to LogicalAnd or LogicalOr

args: List[Union[sigma.grammar.Expression, str]]
property condition: Type[sigma.grammar.CoreExpression]
parent: Optional[sigma.grammar.Expression]
property pattern: str
postprocess(rule: sigma.schema.Rule, parent: Optional[sigma.grammar.Expression] = None) sigma.grammar.Expression

Collapse selector into either a logical OR or AND expression

sigma.grammar.base64_modifier(field: str, value: Any) str

Base64 encode the field

sigma.grammar.base64offset_modifier(field: str, value: Any) List[str]

Build the expression for matching a base64offset modified expression.

NOTE: I don’t fully understand what’s going on here, but I ripped it from pySigma… :eyes:

sigma.grammar.build_grammar_parser()

Build the pyparsing grammar parser for the condition field

sigma.grammar.build_key_value_expression(key: str, value: Union[list, str]) sigma.grammar.Expression

Evaluate any modifiers in the given key and return a valid expression representing the key/value pair. These are taken directly from the detection definition.

sigma.grammar.utf16_modifier(field: str, value: Any) bytes
sigma.grammar.utf16be_modifier(field: str, value: Any) bytes
sigma.grammar.utf16le_modifier(field: str, value: Any, modifier: str = 'utf16le') bytes

Transform the value into bytes

sigma.grammar.wide_modifier(field: str, value: Any) bytes