Sintaxis de la sección de condiciones

Disponible en:

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 las búsquedas y los paneles de control, 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 de control, solo muestra el resultado que cumple 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 consulta.

Definir la sección condition

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

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

  • Usa and entre las condiciones.

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

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

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

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

En este ejemplo de regla, se devuelve una detección cuando se producen más de cinco inicios de sesión fallidos (como se define en la sección condition) para cada usuario en un periodo 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 acotadas y no acotadas

Puedes usar condiciones acotadas o no acotadas en una consulta:

  • Las condiciones acotadas obligan a que exista la variable de evento asociada, lo que significa que el evento debe aparecer al menos una vez 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 sin límites se pueden usar para detectar la ausencia de un evento durante un periodo determinado. Por ejemplo, un evento de amenaza sin un evento de mitigación en un periodo de 10 minutos. Las condiciones ilimitadas permiten que la variable de evento asociada no exista (consultas de no existencia), lo que significa que es posible que no aparezca ninguna instancia del evento en una detección y que cualquier referencia a los campos de la variable de evento dé como resultado un valor cero.

    Las siguientes son condiciones sin límites:

    !$var // equivalent to #var = 0

    #var >= 0

    #var < n // where n > 0

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

Requisitos de las consultas de inexistencia

Para que se compile una consulta de no existencia, debe cumplir los siguientes requisitos:

  • Al menos un evento de datos de marketing unificado debe tener una condición delimitada (es decir, debe existir al menos un evento de datos de marketing unificado).
  • Si un marcador de posición tiene una condición ilimitada, debe estar asociado a al menos un evento de UDM limitado.
  • Si una entidad tiene una condición ilimitada, debe estar asociada a al menos un evento de UDM limitado.

Ejemplo: consulta de no existencia

Veamos la siguiente consulta, en la que se ha omitido la sección de condiciones:

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

Estos son algunos ejemplos válidos para la sección de condiciones:

  • $u1 and !$u2 and $e1 and $e2
    • Todos los eventos y entidades de UDM están presentes en la sección de condiciones.
    • Al menos un evento de UDM está acotado.
  • $u1 and !$u2 and $e1 and !$e2
    • $e2 no tiene límites y está permitido porque está asociado a $u1, que sí tiene límites. Si $e2 no estuviera asociado a $u1, no sería válido.
  • #port > 50 and #ip = 0
    • No hay eventos ni entidades de UDM en la sección de condiciones. Sin embargo, los marcadores de posición que hay cubren todos los eventos y entidades de UDM.
    • $ip se asigna a $u1 y $u2, y #ip = 0 es una condición sin límites. Sin embargo, las condiciones acotadas son más estrictas que las no acotadas. Como $port se asigna a $u1 y #port > 50 es una condición acotada, $u1 sigue acotada.

Sección de condición no válida

Estos son algunos ejemplos no válidos para la sección de condiciones:

  • $u1 and $e1
    • Todos los eventos y entidades de UDM que aparecen en la sección events deben aparecer en la sección condition (o tener asignado un marcador de posición que aparezca en la sección condition).
  • $u1, $u2, $e1, $u2, #port > 50
    • No se pueden usar comas como separadores de condiciones.
  • !$u1 and !$u2 and $e1 and $e2
    • Incumple el primer requisito de que al menos un evento de datos de gestión de usuarios esté delimitado.
  • ($u1 or #port < 50) and $u2 and $e1 and $e2
    • La palabra clave or no se admite con condiciones ilimitadas.
  • ($u1 or $u2) and $e1 and $e2
    • No se admite la palabra clave or entre diferentes variables de evento.
  • not $u1 and $u2 and $e1 and $e2
    • No se permite la palabra clave not en las condiciones de eventos y marcadores de posición.
  • #port < 50 and #ip = 0
    • Aunque las marcas de posición hacen referencia a todos los eventos y entidades de UDM, todas las condiciones asociadas no tienen límites. Esto significa que ninguno de los eventos de UDM está delimitado, lo que provoca que la regla no se pueda compilar.

Condiciones de resultado

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

Las condicionales de resultados se especifican de forma diferente en función del tipo de variable de resultado:

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

  • Float: compara con un literal de coma flotante con los 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 especifica una condición de resultado en una consulta que tiene una sección match, la consulta se clasifica como consulta de varios eventos para la cuota de consultas. Consulta la sintaxis de coincidencia para obtener más información sobre las clasificaciones de eventos únicos y múltiples.

Restricciones

  • No uses una variable match en la sección condition. Se trata de un error semántico porque los eventos se agrupan por el valor de la variable match.

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

  • Si usa una ventana de tiempo, la variable de evento de referencia debe estar incluida en al menos una condición delimitada.

Siguientes pasos

Información adicional

¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.