デフォルトの検出ルール
YARA-L ルール言語
YARA-L は、Google が開発した検出ルール言語です。YARA-L の目的は、単なるデータクエリとしての検出から、実際のイベント ドリブンの調査に移行することです。YARA-L は、マルウェア分析で一般的に使用されている YARA 言語から派生しています。L はログを表します。YARA-L を使用すると、検出内の複数のソースからのすべての情報を利用し、それらのイベントを関連付けて実用的なアラートにすることが可能です。詳細については、YARA-L 2.0 言語の概要をご覧ください。
Google Security Operations のサンプル検出ルール
Google Security Operations Detection Engine の導入を迅速に進めるために、サンプルルールを含む GitHub リポジトリがあります。このリポジトリには、次のようなさまざまなカテゴリの検出ルールが含まれています。
- Google Cloud CloudAudit
- Google Workspace
- 情報提供の警告
- マルウェア
- MITRE ATT&CK
- SOC プライムルール
- 不審なイベント
各カテゴリは、データソースの表示方法に固有のアプローチを取り、使用するイベントと一致ステートメントを指定します。
ルールとチューニングの例
次のルールは、イベントタイプを追跡するために使用されるイベント変数 $e1
を作成します。イベント変数には、評価対象のデータに意味のある任意の値を指定できます。このイベントで評価される UDM フィールドは metadata.eventype
であるため、e1
と呼ぶのが適切です。次の行では、e1
内で正規表現が一致する特定の出現を検索します。Google Security Operations で検出を作成する条件は、イベント $e1
が発生したときです。調整を行うために、コマンドライン引数の特定の悪意のないパスを除外するために、not
条件が用意されています。他の既知のファイルパスから頻繁に誤検出が発生する場合は、このルールにさらに not
条件を追加できます。
rule suspicious_unusual_location_svchost_execution
{
meta:
author = "Google Cloud Security"
description = "Windows 'svchost' executed from an unusual location"
yara_version = "YL2.0"
rule_version = "1.0"
events:
$e1.metadata.event_type = "PROCESS_LAUNCH"
re.regex($e1.principal.process.command_line, `\bsvchost(\.exe)?\b`) nocase
not re.regex($e1.principal.process.command_line, `\\Windows\\System32\\`) nocase
condition:
$e1
}
複数のイベント変数を指定する
YARA-L では、ルールに複数のイベント変数を含めることができます。次の例では、ルールにイベント $e1
と $e2
があります。条件は、検出をトリガーする論理条件を指定します。
rule ExcludeZeroValues {
meta:
author = "noone@google.com"
events:
$e1.metadata.event_type = "NETWORK_DNS"
$e1.principal.hostname = $hostname
// $e1.principal.user.userid may be empty string.
$e1.principal.user.userid != "Guest"
$e2.metadata.event_type = "NETWORK_HTTP"
$e2.principal.hostname = $hostname
// $e2.target.asset_id cannot be empty string as explicitly specified.
$e2.target.asset_id != ""
match:
// $hostname cannot be empty string.
$hostname over 1h
condition:
$e1 and $e2
}
ルールの結果セクション
結果セクションを使用して、ルール検出内で保持変数を設定し、ダウンストリームでの使用のためにエンリッチメントを提供します。たとえば、分析対象のイベントのデータに基づく重大度スコア情報を追加できます。次の検出では、2 つのイベントを調べて $hostname
値の属性を特定させます。$hostnames
の値が 5 分間を超えて一致した場合、重大度スコアが適用されます。期間を使用する場合、Google Security Operations 検出エンジンは、指定した個別の時間ブロックのみを調べます。
rule OutcomeRuleMultiEvent {
meta:
author = "noone@google.com"
events:
$u.udm.principal.hostname = $hostname
$asset_context.graph.entity.hostname = $hostname
$severity = $asset_context.graph.entity.asset.vulnerabilities.severity
match:
$hostname over 5m
outcome:
$risk_score =
max(
100
+ if($hostname = "my-hostname", 100, 50)
+ if($severity = "HIGH", 10)
+ if($severity = "MEDIUM", 5)
+ if($severity = "LOW", 1)
)
$asset_id_list =
array(
if($u.principal.asset_id = "",
"Empty asset id",
$u.principal.asset_id
)
)
$asset_id_distinct_list = array_distinct($u.principal.asset_id)
$asset_id_count = count($u.principal.asset_id)
$asset_id_distinct_count = count_distinct($u.principal.asset_id)
condition:
$u and $asset_context and $risk_score > 50 and not arrays.contains($asset_id_list, "id_1234")
}
まとめ
YARA-L は柔軟な検出言語であり、データクエリを返すだけでなく、セキュリティ イベントを検査することもできます。イベント変数は、ルールの条件セクションで使用されているフィールド値を追跡するために使用されます。単一のイベント、時間の経過に伴う複数のイベントを使用し、ソースを単一の値(異なるデータソースからの $hostname など)に関連付けることができます。また、正規表現などのツールを使用して一致を指定することもできます。ルールを独自の環境に合わせて調整することが重要です。これは、ロジック内で除外を指定することで行えます。参照リストを使用してアイテムをグループ化し、そのリストをルールで参照することもできます。Google Security Operations では、すべての検出に対してアラートを送信する必要はありません。複数の目的のために検出結果を追跡し、環境で最も重要と判断した検出結果のみをアラートできます。