デフォルトの検出ルール

以下でサポートされています。

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 では、すべての検出に対してアラートを送信する必要はありません。複数の目的のために検出結果を追跡し、環境で最も重要と判断した検出結果のみをアラートできます。