기본 감지 규칙

YARA-L 규칙 언어

YARA-L은 Google에서 개발한 감지 규칙 언어입니다. YARA-L의 목적은 단순한 데이터 쿼리와 같은 규칙에서 실제 이벤트 중심의 조사로 이동하기 위한 것입니다. YARA-L은 멀웨어 분석에서 일반적으로 사용되는 YARA 언어에서 파생됩니다. L은 로그를 의미합니다. YARA-L을 사용하면 감지 내에 있는 여러 소스의 모든 정보를 활용하고 이러한 이벤트를 연결하여 실행 가능한 알림을 제공할 수 있습니다. 자세한 내용은 YARA-L 2.0 언어 개요를 참조하세요.

Google Security Operations 샘플 감지 규칙

Google Security Operations 감지 엔진 채택을 가속화하기 위해 샘플 규칙이 포함된 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
}

이벤트 변수를 2개 이상 지정

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 값을 결정합니다. 5분 이상 동안 $hostnames 값이 일치하면 심각도 점수가 적용됩니다. 기간을 사용할 때 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에서 모든 감지에 대해 알림을 표시할 필요는 없습니다. 여러 목적에 따라 감지를 추적하고 해당 환경에서 가장 중요한 항목에 대해서만 알림을 표시할 수 있습니다.