YARA-L 2.0 を使用した UDM 検索とダッシュボードの条件
condition
セクションでは、検索結果にデータを含めるための条件を定義します。これらの条件は、events
セクションで定義されているイベント変数とプレースホルダ変数に対して評価されます。これらの条件は、and
キーワードを使用して組み合わせることができます。
制限事項
検索の条件には次の制限があります。
必須:
match
セクションは必須です。また、グループ化されていないフィルタをevents
セクション内で直接定義することもできます。必須: イベント変数とプレースホルダ変数は
condition
セクション内で集計する必要があります。整数と浮動小数点数の比較式のみがサポートされています。これらの式では、左側に変数、右側に整数または浮動小数点数が必要です(例:
#c > 1
、$port = 80
)。サポートされている演算子は<
、>
、=
です。condition
セクション内の変数と句の順序は結果に影響しません。condition
セクションで結果変数を使用するには、結果変数を定義して集計します。events
セクションで、集計されていない結果変数をフィルタできます。変数を使用した直接的な数学演算はサポートされていません(
#e1 + 5 > 6
、$o1.sum($pl) > 0
など)。OR
条件が同じベースイベントに適用される場合、追加の制限はありません。異なるイベント間でOR
を使用する場合、次の制限が適用されます。OR
では非存在比較はサポートされていません。たとえば、math.log($outcome1_sent_bytes) > 5 OR (#placeholder2) < 10
はサポートされていません。異なるイベントにまたがる
OR
句では、UDM 以外の変数はサポートされていません。ただし、OR
は単一のイベント コンテキスト内、またはAND
とグループ化されている場合にサポートされます。たとえば、$entity and ($udm_event_1 or $placeholder_derived_from_udm_event_1)
のようにします。別の例として、$entity and ($udm_event_1 or $outcome_udm_event_1_bytes > 1000)
を示します。
カウント文字(#
)
#
文字は、イベント名またはプレースホルダ変数名(#c
など)の前に付く場合、そのイベントの個別の発生回数、またはその変数に関連付けられた events
セクションのすべての条件を満たす個別の値の数を表します。たとえば、#c > 1
は、イベントまたはプレースホルダ c
が複数回発生する必要があることを意味します。
クエリの例:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
$e2.principal.hostname = $hostname
$e2.target.hostname = "homedepot.com"
$e2.target.port = 3042 // tcp/udp
match:
$hostname over 1h
condition:
#e1 > 0 or #e2 > 1
値文字($
)
$
文字の機能はコンテキストによって異なります。
結果変数: 結果変数名の前(例:
$risk_score
)に配置すると、変数の値を表します。イベント変数またはプレースホルダ変数: イベント名またはプレースホルダ変数名の前(
$event
など)に配置すると、#event > 0
と同等になり、そのイベントが少なくとも 1 回発生している必要があることを意味します。
イベントとプレースホルダの条件
and
キーワードを使用すると、イベントとプレースホルダ変数の複数の条件述語を組み合わせることができます。
or
の使用例(単一イベント):
condition:
$ph2 and $ph3
重要: events
セクションまたは condition
セクションでロジックを記述する場合は、否定に !
を使用します。not
キーワードは outcome
セクションでのみ使用します。
制限付き条件と制限なし条件
イベント変数の条件は、制限付きまたは制限なしにできます。
境界条件では、関連付けられたイベント変数が存在する必要があります。つまり、検出によりイベントが少なくとも 1 回出現する必要があります。
例:
$var
(#var > 0
と同等)#var > n
(n >= 0
の場合)#var >= m
(m > 0
の場合)
クエリの例:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
match:
$hostname over 1h
condition:
#e1 > 0
制限なし条件では、関連付けられたイベント変数が存在しないようにします。つまり、検出でイベントのオカレンスがない可能性があります。イベント変数のフィールドを参照すると、ゼロ値が返されます。これらは非存在検索に使用します。
例:
!$var
(#var = 0
と同等)#var >= 0
#var < n
(n > 0
の場合)#var <= m
(m >= 0
の場合)
クエリの例:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
match:
$hostname over 1h
outcome:
$bytes_sent = sum($e1.network.sent_bytes)
condition:
$bytes_sent >= 0
注: 存在しない検索クエリ(上限のない条件を使用)の場合、検出エンジンは予想されるレイテンシに 1 時間の遅延を追加します。
制限なし条件を含む検索クエリは、次の条件を満たしている必要があります。
少なくとも 1 つの UDM イベントに制限付き条件が必要です。つまり、少なくとも 1 つの UDM イベントが存在する必要があります。
制限なし条件が設定されているプレースホルダは、少なくとも 1 つの制限付き UDM イベントに関連付ける必要があります。
制限なし条件を持つエンティティは、少なくとも 1 つの制限付き UDM イベントに関連付ける必要があります。
結果条件
結果変数を使用して結果条件を定義し、論理演算子(and
、or
、not
)と組み合わせることができます。比較構文は、結果変数のデータ型によって異なります。
- 整数と浮動小数点数:
=
、>
、>=
、<
、<=
、!=
を使用します(例:$risk_score > 10
、$risk_score <= 5.5
)。 - 文字列:
=
または!=
を使用します(例:$severity = "HIGH"
)。 - 整数のリストまたは配列:
arrays.contains()
(arrays.contains($event_ids, "id_1234")
など)を使用します。
サンプルクエリ:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
match:
$hostname over 1h
outcome:
$bytes_sent = sum($e1.network.sent_bytes)
condition:
$e1
UDM 検索の N of X 条件
UDM 検索条件は「N of X」構文をサポートしています。これにより、複数の条件を柔軟に評価できます。この構文を使用すると、X
(ブール式のリスト)の N
(特定の数)が true と評価された場合に条件が満たされるように指定できます。
例: VirusTotal(VT)の拡充によって提供される事前定義されたタグのリストから、複数の不審な動作を示すプロセスを特定したいが、必ずしもすべてのプロセスを特定する必要はないシナリオを考えてみましょう。「N of X」構文では、満たす必要のある条件の最小数を指定することで、この問題に対処します。
次の UDM 検索クエリは、3 つ以上の条件が満たされているプロセスを検索します。
$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process
match:
$process
outcome:
$first_seen = earliest($e.metadata.event_timestamp)
$last_seen = latest($e.metadata.event_timestamp)
$total_events = count($e.metadata.id)
// Collect all unique tags associated with this process from all its launch events
$tags = array_distinct($e.target.process.file.tags)
condition:
// Trigger if at least 3 of the following conditions (tag checks) are true
3 of [
arrays.contains($tags, "malware"),
arrays.contains($tags, "detect-debug-environment"),
arrays.contains($tags, "checks-disk-space"),
arrays.contains($tags, "checks-cpu-name"),
arrays.contains($tags, "invalid-signature"),
arrays.contains($tags, "self-delete")
]
order:
$total_events desc
ANY of 演算子と ALL of 演算子
リストされているブール式のうち少なくとも 1 つが true
の場合、ANY of [expressions]
は true
と評価されます。ALL of [expressions]
では、リストされているすべての式が true
である必要があります。これらの演算子を AND
などのキーワードを使用して他の条件と組み合わせます。
例:
$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process
match:
$process
outcome:
$first_seen = timestamp.get_timestamp(min($e.metadata.event_timestamp.seconds))
$last_seen = timestamp.get_timestamp(max($e.metadata.event_timestamp.seconds))
$total = count($e.metadata.id)
$tags = array_distinct($e.target.process.file.tags)
$vt_first_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.first_seen_time.seconds) < 86400, 1 , 0))
$vt_last_analysis_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_analysis_time.seconds) < 86400, 1 , 0))
$vt_last_modification_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_modification_time.seconds) < 86400, 1 , 0))
$vt_last_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_seen_time.seconds) < 86400, 1 , 0))
condition:
3 of [
arrays.contains($tags, "malware"),
arrays.contains($tags, "detect-debug-environment"),
arrays.contains($tags, "checks-disk-space"),
arrays.contains($tags, "checks-cpu-name"),
arrays.contains($tags, "invalid-signature"),
arrays.contains($tags, "self-delete")
]
and ANY of [
$vt_first_seen_time = 1,
$vt_last_analysis_time = 1,
$vt_last_modification_time = 1,
$vt_last_seen_time = 1
]
order:
$total desc
unselect:
$vt_first_seen_time,
$vt_last_analysis_time,
$vt_last_modification_time,
$vt_last_seen_time
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。