デフォルトの検出ルール
YARA-L ルール言語
YARA-L は、Google が開発した検出ルール言語です。YARA-L の目的は、単なるデータクエリとしての検出から、実際のイベント ドリブンの調査に移行することです。YARA-L は、マルウェア分析で一般的に使用される YARA 言語から派生しています。L はログを表します。YARA-L を使用すると、検出内の複数のソースからのすべての情報を利用し、それらのイベントを関連付けて実用的なアラートにすることが可能です。詳細については、YARA-L 2.0 言語の概要をご覧ください。
Google Security Operations の検出ルールのサンプル
Google SecOps 検出エンジンの導入を迅速に行うために、サンプルルールを含む GitHub リポジトリがあります。このリポジトリには、次のようなさまざまなカテゴリの検出ルールが含まれています。
- Google Cloud CloudAudit
- Google Workspace
- 情報に関する警告
- マルウェア
- MITRE ATT&CK
- SOC プライム ルール
- 不審なイベント
各カテゴリでは、データソースの表示方法と、使用するイベントと一致するステートメントの指定方法が異なります。
ルールの例とチューニング
次のルールでは、イベント タイプを追跡するために使用されるイベント変数 $e1
を作成します。イベント変数は、評価されるデータにとって意味のある任意の値にできます。このイベントで評価される UDM フィールドは metadata.eventype
であるため、e1
と呼ぶのが妥当です。次の行は、e1
内で正規表現の一致の特定の出現を検索します。Google SecOps で検出を作成する条件は、イベント $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 SecOps 検出エンジンは指定した個別の時間ブロックのみを調べます。
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 SecOps では、すべての検出でアラートを送信する必要はありません。複数の目的で検出を追跡し、環境内で最も重要と判断した検出のみをアラートで通知できます。
さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。