Use nested if statements for more complex logic
You can use if
statements in both the outcome
and events
sections. You can also use if
statements within
the then
else
clauses of another if
statement. This capability lets you
introduce more complicated logic to your query.
This syntax is supported in Rules, Search, and Dashboards.
Syntax
if(BOOL_CLAUSE, THEN_CLAUSE, ELSE_CLAUSE)
Nested if
examples
Search example: outcome section
This example assigns an outcome score based on principal.hostname
.
$nested_if.principal.hostname != ""
outcome:
$score = max(
if($nested_if.principal.hostname = /win-adfs/,
5,
if($nested_if.principal.hostname = /server/,
3,
if($nested_if.principal.hostname = /win-atomic/,
1,
0))))
Search example: events section
This example assigns the placeholder IP to target.ip
or principal.ip
so long as
they're non-empty. If the IP values are missing, it assigns no_valid_ip
.
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$ip = if($e.target.ip != "",
$e.target.ip,
if($e.principal.ip != "",
$e.principal.ip,
"no_valid_ip"))
match:
$ip
Rule example: nested if
in outcome
section
rule nested_if_outcome_example {
meta:
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$e.principal.ip = $ip
match:
$ip over 5m
outcome:
$score = max(
if($e.principal.hostname = /win-adfs/,
5,
if($e.principal.hostname = /server/,
3,
if($e.principal.hostname = /win-atomic/,
1,
0))))
condition:
$e
}
Rule example: nested if
in events
section
rule nested_if_events_example {
meta:
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$ip = if($e.target.ip != "",
$e.target.ip,
if($e.principal.ip != "",
$e.principal.ip,
"no_valid_ip"))
match:
$ip over 5m
condition:
$e
}
Known limitation
The if()
statement is a function in YARA-L 2.0 and subject to the function
depth limit of 20.
Need more help? Get answers from Community members and Google SecOps professionals.

