Condiciones en búsquedas y paneles de control de UDM con YARA-L 2.0
La sección condition
define los criterios para incluir datos en los resultados de búsqueda.
Estas condiciones se evalúan en función de las variables de evento y de marcador de posición definidas en la sección events
. Puede combinar estas condiciones
con la palabra clave and
.
Limitaciones
Las condiciones de búsqueda tienen las siguientes limitaciones:
Obligatorio: la sección
match
es obligatoria. También puedes definir filtros sin agrupar directamente en la secciónevents
.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 coma flotante. Estas expresiones deben tener una variable a la izquierda y un número entero o un número decimal a la derecha (por ejemplo,
#c > 1
o$port = 80
). Los operadores admitidos son<
,>
y=
.El orden de las variables y las cláusulas de la sección
condition
no afecta a los resultados.Para usar variables de resultados en la sección
condition
, defínelas y agrégalas. Puede filtrar las variables de resultado no agregadas en la secciónevents
.No se admiten operaciones matemáticas directas con variables (por ejemplo,
#e1 + 5 > 6
o$o1.sum($pl) > 0
).No hay restricciones adicionales si las condiciones de
OR
se aplican a los mismos eventos base. Se aplican las siguientes restricciones cuando se usaOR
en diferentes eventos:No se admiten comparaciones de inexistencia con
OR
. Por ejemplo, no se admitemath.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 en un contexto de evento único o cuando se agrupa conAND
. 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)
.
Recuento de caracteres (#
)
El carácter #
, cuando precede al nombre de una variable de evento o de marcador de posición (por ejemplo, #c
), representa el número de ocurrencias distintas de ese evento o el número de valores distintos que cumplen 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
debe producirse 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.Evento o variable de marcador de posición: si se coloca antes del nombre de un evento o de una variable de marcador de posición (por ejemplo,
$event
), equivale a#event > 0
e implica que debe haber al menos una instancia de ese evento.
Condiciones de evento y de marcador 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
(evento único):
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 acotadas y no acotadas
Las condiciones de las variables de evento pueden ser acotadas o no acotadas.
Las condiciones acotadas requieren que exista la variable de evento asociada. Esto significa que debe aparecer al menos una vez en cualquier detección.
Ejemplos:
$var
(equivalente a#var > 0
)#var > n
(donden >= 0
)#var >= m
(dondem > 0
)
Consulta de ejemplo:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
match:
$hostname over 1h
condition:
#e1 > 0
Las condiciones sin límites permiten que la variable de evento asociada no exista. Esto significa que es posible que no aparezca ninguna instancia del evento en una detección. Cualquier referencia a campos de la variable de evento da como resultado el valor cero. Úsalos para búsquedas de no existencia.
Ejemplos:
!$var
(equivalente a#var = 0
)#var >= 0
#var < n
(donden > 0
)#var <= m
(dondem >= 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: En el caso de las consultas de búsqueda de no existencia (con condiciones ilimitadas), el motor de detección añade un retraso de 1 hora a la latencia esperada.
Las consultas de búsqueda con condiciones ilimitadas deben cumplir los siguientes criterios:
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.
Los marcadores de posición con condiciones ilimitadas deben asociarse con al menos un evento de UDM limitado.
Las entidades con condiciones ilimitadas deben asociarse con al menos un evento de UDM limitado.
Condiciones de resultado
Puedes definir condiciones de resultado mediante variables de resultado y combinarlas con operadores lógicos (and
, or
y not
). La sintaxis de comparación depende del tipo de datos de la variable de resultado.
- Entero y decimal: usa
=
,>
,>=
,<
,<=
y!=
(por ejemplo,$risk_score > 10
y$risk_score <= 5.5
). - Cadena: usa
=
o!=
(por ejemplo,$severity = "HIGH"
). - Lista de números enteros o matrices: 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
Condiciones de N de X en la búsqueda de UDM
Las condiciones de búsqueda de UDM admiten la sintaxis "N de X", que permite evaluar de forma flexible varios criterios. Esta sintaxis le permite especificar que se cumple una condición si N
(un número específico) de X
(una lista de expresiones booleanas) se evalúan como verdaderas.
Ejemplo: Supongamos que quieres identificar procesos que muestren varios comportamientos sospechosos, pero no necesariamente todos, a partir de una lista predefinida de etiquetas proporcionada por el enriquecimiento de VirusTotal (VT). La sintaxis "N de X" soluciona este problema, ya que le permite especificar un número mínimo de condiciones que se deben cumplir.
La siguiente consulta de búsqueda de UDM busca procesos en los que se cumplan al menos tres de las condiciones:
$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]
da como resultado true
si al menos una de las expresiones booleanas de la lista es true
. ALL of [expressions]
requiere que todas las expresiones que se incluyan sean true
. Combina estos operadores con otras condiciones mediante 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? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.