Condiciones en la búsqueda y los paneles de UDM con YARA-L 2.0

Compatible con:

La sección condition define los criterios para incluir datos en los resultados de la búsqueda. Estas condiciones se evalúan en función de las variables de eventos y marcadores de posición definidas en la sección events. Puedes combinar estas condiciones con la palabra clave and.

Limitaciones

Las condiciones en la búsqueda tienen las siguientes limitaciones:

  • Obligatorio: La sección match es obligatoria. Como alternativa, puedes definir filtros no agrupados directamente en la sección events.

  • Obligatorio: Las variables de evento y de marcador de posición deben agregarse en la sección condition.

  • Solo se admiten expresiones de comparación de números enteros y de punto flotante. Estas expresiones deben tener una variable a la izquierda y un número entero o un número de punto flotante a la derecha (por ejemplo, #c > 1, $port = 80). Los operadores admitidos son <, > y =.

  • El orden de las variables y las cláusulas dentro de la sección condition no afecta los resultados.

  • Para usar variables de resultado en la sección condition, defínelas y agrégalas. Puedes filtrar las variables de resultado no agregadas en la sección events.

  • No se admiten las operaciones matemáticas directas con variables (por ejemplo, #e1 + 5 > 6, $o1.sum($pl) > 0).

  • No hay restricciones adicionales si las condiciones de OR se aplican a los mismos eventos básicos. Se aplican las siguientes restricciones cuando se usa OR en diferentes eventos:

    • Las comparaciones de no existencia no se admiten con OR. Por ejemplo, no se admite math.log($outcome1_sent_bytes) > 5 OR (#placeholder2) < 10.

    • Las variables que no son de UDM no se admiten en las cláusulas OR que abarcan diferentes eventos. Sin embargo, OR se admite dentro de un solo contexto de evento o cuando se agrupa con AND. Por ejemplo, $entity and ($udm_event_1 or $placeholder_derived_from_udm_event_1). Aquí tienes otro ejemplo: $entity and ($udm_event_1 or $outcome_udm_event_1_bytes > 1000).

Carácter de recuento (#)

El carácter #, cuando precede a un evento o a un nombre de variable de marcador de posición (por ejemplo, #c), representa la cantidad de ocurrencias distintas de ese evento o la cantidad de valores distintos que satisfacen todas las condiciones de la sección events asociada a esa variable. Por ejemplo, #c > 1 implica que el evento o el marcador de posición c deben ocurrir más de una vez.

Consulta de ejemplo:

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp

$e2.principal.hostname = $hostname
$e2.target.hostname = "homedepot.com"
$e2.target.port = 3042 // tcp/udp

match:
$hostname over 1h

condition:
#e1 > 0 or #e2 > 1

Carácter de valor ($)

La función del carácter $ depende del contexto.

  • Variable de resultado: Cuando se coloca antes del nombre de una variable de resultado (por ejemplo, $risk_score), representa el valor de la variable.

  • Variable de evento o marcador de posición: Cuando se coloca antes de un evento o un nombre de variable de marcador de posición (por ejemplo, $event), equivale a #event > 0 y significa que debe existir al menos una ocurrencia de ese evento.

Condiciones de eventos y marcadores de posición

Puedes combinar varios predicados de condición para eventos y variables de marcador de posición con la palabra clave and.

Ejemplo de uso de or (un solo evento):

condition:
  $ph2 and $ph3

Importante: Cuando escribas lógica en las secciones events o condition, usa ! para la negación. Usa la palabra clave not solo en la sección outcome.

Condiciones delimitadas y no delimitadas

Las condiciones de las variables de eventos pueden ser delimitadas o no.

Las condiciones delimitadas requieren que exista la variable de evento asociada. Esto significa que, al menos, debe aparecer un caso del evento en cualquier detección.

Ejemplos:

  • $var (equivalente a #var > 0)
  • #var > n (donde n >= 0)
  • #var >= m (donde m > 0)

Consulta de ejemplo:

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"

match:
$hostname over 1h

condition:
#e1 > 0

Las condiciones no acotadas permiten que la variable de evento asociada no exista. Esto significa que es posible que no aparezca ninguna ocurrencia del evento en una detección. Cualquier referencia a los campos de la variable del evento genera un valor cero. Úsalos para búsquedas de no existencia.

Ejemplos:

  • !$var (equivalente a #var = 0)
  • #var >= 0
  • #var < n (donde n > 0)
  • #var <= m (donde m >= 0)

Consulta de ejemplo:

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp

match:
$hostname over 1h

outcome:
$bytes_sent = sum($e1.network.sent_bytes)

condition:
$bytes_sent >= 0

Nota: Para las búsquedas de no existencia (con condiciones no acotadas), el motor de detección agrega una demora de 1 hora a la latencia esperada.

Las búsquedas con condiciones no acotadas deben cumplir con los siguientes criterios:

  • Al menos un evento del UDM debe tener una condición delimitada, es decir, debe existir al menos un evento del UDM.

  • Los marcadores de posición con condiciones no delimitadas deben asociarse con al menos un evento del UDM delimitado.

  • Las entidades con condiciones no acotadas deben asociarse con al menos un evento del UDM acotado.

Condiciones de resultado

Puedes definir condiciones de resultado con variables de resultado y combinarlas con operadores lógicos (and, or, not). La sintaxis de comparación depende del tipo de datos de la variable de resultado.

  • Números enteros y de punto flotante: Usa =, >, >=, <, <=, != (por ejemplo, $risk_score > 10, $risk_score <= 5.5).
  • cadena: Usa = o != (por ejemplo, $severity = "HIGH").
  • Lista de números enteros o arrays: Usa arrays.contains() (por ejemplo, arrays.contains($event_ids, "id_1234")).

Consulta de ejemplo:

$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
match:
$hostname over 1h

outcome:
$bytes_sent = sum($e1.network.sent_bytes)

condition:
$e1

Las condiciones de búsqueda de UDM admiten la sintaxis "N de X", que proporciona una evaluación flexible de varios criterios. Esta sintaxis te permite especificar que se cumple una condición si N (una cantidad específica) de X (una lista de expresiones booleanas) se evalúan como verdaderas.

Ejemplo: Considera una situación en la que deseas identificar procesos que exhiben varios comportamientos sospechosos, pero no necesariamente todos, a partir de una lista predefinida de etiquetas proporcionadas por el enriquecimiento de VirusTotal (VT). La sintaxis "N de X" aborda este problema, ya que te permite especificar una cantidad mínima de condiciones que se deben cumplir.

La siguiente búsqueda de UDM busca procesos en los que al menos tres de las condiciones son verdaderas:


$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process

match:
    $process

outcome:
    $first_seen = earliest($e.metadata.event_timestamp)
    $last_seen = latest($e.metadata.event_timestamp)
    $total_events = count($e.metadata.id)
    // Collect all unique tags associated with this process from all its launch events
    $tags = array_distinct($e.target.process.file.tags)

condition:
    // Trigger if at least 3 of the following conditions (tag checks) are true
    3 of [
      arrays.contains($tags, "malware"),
      arrays.contains($tags, "detect-debug-environment"),
      arrays.contains($tags, "checks-disk-space"),
      arrays.contains($tags, "checks-cpu-name"),
      arrays.contains($tags, "invalid-signature"),
      arrays.contains($tags, "self-delete")
    ]

order:
    $total_events desc

Operadores ANY of y ALL of

ANY of [expressions] se evalúa como true si al menos una de las expresiones booleanas enumeradas es true. ALL of [expressions] requiere que cada expresión enumerada sea true. Combina estos operadores con otras condiciones usando palabras clave como AND.

Ejemplo:


$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process

match:
 $process

outcome:
  $first_seen = timestamp.get_timestamp(min($e.metadata.event_timestamp.seconds))
  $last_seen = timestamp.get_timestamp(max($e.metadata.event_timestamp.seconds))
  $total = count($e.metadata.id)
  $tags = array_distinct($e.target.process.file.tags)
  $vt_first_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.first_seen_time.seconds) < 86400, 1 , 0))
  $vt_last_analysis_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_analysis_time.seconds) < 86400, 1 , 0))
  $vt_last_modification_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_modification_time.seconds) < 86400, 1 , 0))
  $vt_last_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_seen_time.seconds) < 86400, 1 , 0))

condition:
  3 of [
    arrays.contains($tags, "malware"),
    arrays.contains($tags, "detect-debug-environment"),
    arrays.contains($tags, "checks-disk-space"),
    arrays.contains($tags, "checks-cpu-name"),
    arrays.contains($tags, "invalid-signature"),
    arrays.contains($tags, "self-delete")
  ]
  and ANY of [
    $vt_first_seen_time = 1,
    $vt_last_analysis_time = 1,
    $vt_last_modification_time = 1,
    $vt_last_seen_time = 1
  ]

order:
  $total desc

unselect:
    $vt_first_seen_time,
    $vt_last_analysis_time,
    $vt_last_modification_time,
    $vt_last_seen_time

¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.