Sintaxis de la sección Condition

Se admite en los siguientes sistemas operativos:

En este documento, se describe cómo puedes usar la sección condition de una consulta de YARA-L. La sección condition se usa en la búsqueda y los paneles, es obligatoria para las reglas y contiene lógica para filtrar aún más los resultados. Cuando se usa en una búsqueda o en una consulta de panel, solo muestra el resultado que cumple con las condiciones. Cuando se usa en una regla de detección, se deben cumplir las condiciones para activar una alerta.

En la sección condition, puedes usar operadores booleanos, operadores de comparación y resultados de variables outcome para determinar si se debe activar la búsqueda.

Define la sección condition

Define las expresiones de condición para los eventos y las variables de marcador de posición en la sección condition. También puedes especificar una condición de coincidencia para los eventos y los marcadores de posición definidos en la sección events y, de manera opcional, usar la palabra clave and para especificar una condición de coincidencia con las variables de resultado definidas en la sección outcome (consulta la sintaxis de la sección de resultados).

Puedes unir las expresiones con las palabras clave and o or:

  • Usa and entre las condiciones.

  • Usa or solo cuando la consulta contenga una sola variable de evento.

Usa el carácter # en la sección condition antes de cualquier evento o nombre de variable de marcador de posición para representar la cantidad de eventos o valores distintos que satisfacen todas las condiciones de la sección events. Por ejemplo:

#c > 1 significa que la variable c debe aparecer más de 1 vez.

Usa el carácter $ en la sección condition antes de cualquier nombre de variable de resultado para representar el valor de ese resultado. Si se usa antes de cualquier nombre de variable de evento o marcador de posición (por ejemplo, $event), representa #event > 0.

Este ejemplo de regla devuelve una detección cuando hay más de cinco (como se define en la sección condition) intentos de acceso fallidos para cada usuario en un período de 10 minutos (como se define en la sección match):

rule failed_logins
{
  meta:
   author = "Security Team"
   description = "Detects multiple failed user logins within 10-minute windows."
   severity = "HIGH"

  events:
   $e.metadata.event_type = "USER_LOGIN"
   $e.security_result.action = "FAIL"
   $user = $e.target.user.userid

  match:
   $user over 10m

  outcome:
   $failed_login_count = count($e.metadata.id)
   $first_fail_time = min($e.metadata.event_timestamp.seconds)

  condition:
    #e >= 5
}

Condiciones delimitadas y no delimitadas

Puedes usar condiciones delimitadas o no delimitadas en una consulta:

  • Las condiciones acotadas fuerzan la existencia de la variable de evento asociada, lo que significa que debe aparecer al menos una ocurrencia del evento en la detección. Las siguientes son condiciones acotadas:

    $var // equivalent to #var > 0

    #var > n // where n >= 0

    #var >= m // where m > 0

  • Las condiciones no acotadas se pueden usar para detectar la ausencia de un evento durante un período; por ejemplo, un evento de amenaza sin un evento de mitigación en un período de 10 minutos. Las condiciones no acotadas permiten que la variable de evento asociada no exista (consultas de no existencia), lo que significa que es posible que no aparezca ninguna ocurrencia del evento en una detección y que cualquier referencia a los campos de la variable de evento genere un valor cero.

    Las siguientes son condiciones no acotadas:

    !$var // equivalent to #var = 0

    #var >= 0

    #var < n // where n > 0

    #var <= m // where m >= 0

Requisitos para las búsquedas de no existencia

Para que se compile una búsqueda de no existencia, debe satisfacer los siguientes requisitos:

  • Al menos un evento del UDM debe tener una condición delimitada (es decir, debe existir al menos un evento del UDM).
  • Si un marcador de posición tiene una condición no acotada, debe estar asociado con al menos un evento de UDM acotado.
  • Si una entidad tiene una condición no acotada, debe estar asociada con al menos un evento del UDM acotado.

Ejemplo: Consulta de no existencia

Considera la siguiente consulta con la sección de condición omitida:

rule NonexistenceExample {
  meta:
      author = "Google Security"
      description = "Example: non-existence query."
  events:
      $u1.metadata.event_type = "NETWORK_CONNECTION" // $u1 is a UDM event.
      $u2.metadata.event_type = "NETWORK_CONNECTION" // $u2 is a UDM event.
      $e1.graph.metadata.entity_type = "FILE"        // $e1 is an entity.
      $e2.graph.metadata.entity_type = "FILE"        // $e2 is an entity.

      $user = $u1.principal.user.userid // Match variable is required for multi-event query.

      // Placeholder Associations:
      //   u1        u2
      //   |  \    /
      // port   ip
      //   |       \
      //   e1        e2
      $u1.target.port = $port
      $e1.graph.entity.port = $port
      $u1.principal.ip = $ip
      $u2.target.ip = $ip
      $e2.graph.entity.ip = $ip

      // UDM-Entity Associations:
      // u1 - u2
      // |  \  |
      // e1   e2
      $u1.metadata.event_type = $u2.metadata.event_type
      $e1.graph.entity.hostname = $u1.principal.hostname
      $e2.graph.entity.hostname = $u1.target.hostname
      $e2.graph.entity.hostname = $u2.principal.hostname

  match:
    $user over 5m

  condition:
      //Add valid condition
}

Sección de condición válida

Los siguientes son ejemplos válidos para la sección de condición:

  • $u1 and !$u2 and $e1 and $e2
    • Todos los eventos y entidades del UDM están presentes en la sección de condiciones.
    • Al menos un evento de UDM está delimitado.
  • $u1 and !$u2 and $e1 and !$e2
    • $e2no está acotada y se permite porque está asociada a $u1, que sí está acotada. Si $e2 no se asoció con $u1, esto no sería válido.
  • #port > 50 and #ip = 0
    • No hay eventos ni entidades del UDM presentes en la sección de condiciones. Sin embargo, los marcadores de posición presentes abarcan todos los eventos y entidades del UDM.
    • $ip se asigna a $u1 y $u2, y #ip = 0 es una condición no acotada. Sin embargo, las condiciones acotadas son más sólidas que las no acotadas. Como $port se asigna a $u1 y #port > 50 es una condición acotada, $u1 sigue siendo acotada.

Sección de condición no válida

Los siguientes son ejemplos no válidos para la sección de condiciones:

  • $u1 and $e1
    • Cada evento y entidad del UDM que aparezca en la sección events debe aparecer en la sección condition (o tener un marcador de posición asignado que aparezca en la sección condition).
  • $u1, $u2, $e1, $u2, #port > 50
    • No se permiten comas como separadores de condiciones.
  • !$u1 and !$u2 and $e1 and $e2
    • Incumple el primer requisito de que al menos un evento del UDM esté delimitado.
  • ($u1 or #port < 50) and $u2 and $e1 and $e2
    • La palabra clave or no se admite con condiciones no acotadas.
  • ($u1 or $u2) and $e1 and $e2
    • La palabra clave or no se admite entre diferentes variables de eventos.
  • not $u1 and $u2 and $e1 and $e2
    • No se permite la palabra clave not para las condiciones de eventos y marcadores de posición.
  • #port < 50 and #ip = 0
    • Si bien los marcadores de posición hacen referencia a todos los eventos y entidades del UDM, cada condición asociada no está limitada. Esto significa que ninguno de los eventos de UDM está delimitado, lo que provoca que la regla no se compile.

Condiciones de resultado

Puedes incluir condiciones para las variables de resultado en la sección condition, unidas con la palabra clave and o or, o precedidas por la palabra clave not.

Los condicionales de resultado se especifican de manera diferente según el tipo de variable de resultado:

  • integer: Compara con un literal de número entero con los operadores =, >, >=, <, <=, != Por ejemplo: $risk_score > 10

  • float: Compara con un literal de número de punto flotante con operadores =, >, >=, <, <=, != Por ejemplo: $risk_score <= 5.5

  • string: Compara con un literal de cadena con = o !=. Por ejemplo: $severity = "HIGH"

  • Lista de números enteros o arrays: Especifica la condición con la función arrays.contains. Por ejemplo: arrays.contains($event_ids, "id_1234")

Si especificas una condición de resultado en una búsqueda que tiene una sección match, la búsqueda se clasifica como una búsqueda de varios eventos para la cuota de búsquedas. Consulta la sintaxis de coincidencia para obtener más información sobre las clasificaciones de eventos únicos y múltiples.

Restricciones

  • Evita usar una variable match en la sección condition. Es un error semántico porque los eventos se agrupan según el valor de la variable match.

  • Evita especificar solo condiciones no acotadas en todas las variables event a las que se asigna una variable match. Es un error semántico. Para que se muestre un valor de variable match, debe existir al menos un evento que contenga el valor.

  • En caso de usar una ventana deslizante, la variable del evento pivote debe estar involucrada en al menos una condición acotada.

Próximos pasos

Información adicional

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