デフォルトの検出ルール

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 Cloud 監査
  • Google Workspace
  • 情報警告
  • マルウェア
  • MITRE ATT&CK
  • SOC Prime ルール
  • 不審な予定

各カテゴリは、データソースの表示方法に特定のアプローチを採用し、使用するイベントや一致ステートメントを指定します。

ルールと調整の例

次のルールは、イベントタイプのトラッキングに使用されるイベント変数 $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 では、1 つのルールに複数のイベント変数を設定できます。次の例では、ルールに $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 Detection Engine は指定された個別の時間ブロックのみを調べます。

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