Sintaxis del lenguaje YARA-L 2.0
En esta sección se describen los elementos principales de la sintaxis de YARA-L. Consulta también la descripción general del lenguaje YARA-L 2.0.
Estructura de la regla
En YARA-L 2.0, debes especificar las declaraciones, las definiciones y los usos de las variables en el siguiente orden:
- meta
- eventos
- match (opcional)
- resultado (opcional)
- condición
- options (opcional)
En el siguiente ejemplo se muestra la estructura genérica de una regla:
rule <rule Name>
{
meta:
// Stores arbitrary key-value pairs of rule details, such as who wrote
// it, what it detects on, version control, etc.
events:
// Conditions to filter events and the relationship between events.
match:
// Values to return when matches are found.
outcome:
// Additional information extracted from each detection.
condition:
// Condition to check events and the variables used to find matches.
options:
// Options to turn on or off while executing this rule.
}
Sintaxis de la sección meta
La sección Meta se compone de varias líneas, donde cada línea define un par clave-valor. La parte de la clave debe ser una cadena sin comillas y la parte del valor debe ser una cadena entre comillas:
<key> = "<value>"
A continuación, se muestra un ejemplo de una línea de sección meta
válida:
meta:
author = "Google"
severity = "HIGH"
Sintaxis de la sección Events
En la sección events
, enumera los predicados para especificar lo siguiente:
- Declaraciones de variables
- Filtros de variables de evento
- Uniones de variables de evento
Declaraciones de variables
Para las declaraciones de variables, utilice la siguiente sintaxis:
<EVENT_FIELD> = <VAR>
<VAR> = <EVENT_FIELD>
Ambas son equivalentes, como se muestra en los siguientes ejemplos:
$e.source.hostname = $hostname
$userid = $e.principal.user.userid
Esta declaración indica que esta variable representa el campo especificado de la variable de evento. Cuando el campo de evento es un campo repetido, la variable de coincidencia puede representar cualquier valor de la matriz. También es posible asignar varios campos de evento a una sola variable de coincidencia o de marcador de posición. Esta es una condición de unión transitiva.
Por ejemplo, lo siguiente:
$e1.source.ip = $ip
$e2.target.ip = $ip
Son equivalentes a:
$e1.source.ip = $ip
$e1.source.ip = $e2.target.ip
Cuando se usa una variable, debe declararse mediante la declaración de variables. Si se usa una variable sin ninguna declaración, se considera un error de compilación.
Filtros de variables de evento
Una expresión booleana que actúa sobre una sola variable de evento se considera un filtro.
Uniones de variables de evento
Todas las variables de evento que se usen en la regla deben combinarse con todas las demás variables de evento de una de las siguientes formas:
Directamente mediante una comparación de igualdad entre los campos de evento de las dos variables de evento combinadas. Por ejemplo:
$e1.field = $e2.field
. La expresión no debe incluir aritmética.Indirectamente, a través de una unión transitiva que solo incluya un campo de evento (consulta la declaración de variable para ver la definición de "unión transitiva"). La expresión no debe incluir aritmética.
Por ejemplo, si se usan $e1, $e2 y $e3 en la regla, las siguientes secciones events
son válidas.
events:
$e1.principal.hostname = $e2.src.hostname // $e1 joins with $e2
$e2.principal.ip = $e3.src.ip // $e2 joins with $e3
events:
// $e1 joins with $e2 using function to event comparison
re.capture($e1.src.hostname, ".*") = $e2.target.hostname
events:
// $e1 joins with $e2 using an `or` expression
$e1.principal.hostname = $e2.src.hostname
or $e1.principal.hostname = $e2.target.hostname
or $e1.principal.hostname = $e2.principal.hostname
events:
// all of $e1, $e2 and $e3 are transitively joined using the placeholder variable $ip
$e1.src.ip = $ip
$e2.target.ip = $ip
$e3.about.ip = $ip
events:
// $e1 and $e2 are transitively joined using function to event comparison
re.capture($e2.principal.application, ".*") = $app
$e1.principal.hostname = $app
Sin embargo, a continuación se muestran ejemplos de secciones events
no válidas.
events:
// Event to arithmetic comparison is an invalid join condition for $e1 and $e2.
$e1.principal.port = $e2.src.port + 1
events:
$e1.src.ip = $ip
$e2.target.ip = $ip
$e3.about.ip = "192.1.2.0" //$e3 is not joined with $e1 or $e2.
events:
$e1.src.port = $port
// Arithmetic to placeholder comparison is an invalid transitive join condition.
$e2.principal.port + 800 = $port
Sintaxis de la sección de coincidencias
En la sección match
, enumere las variables de coincidencia de los eventos de grupo antes de comprobar las condiciones de coincidencia. Esos campos se devuelven con cada coincidencia.
- Especifica qué representa cada variable de coincidencia en la sección
events
. - Especifica la duración que se debe usar para correlacionar eventos después de la palabra clave
over
. Los eventos que se produzcan fuera de ese periodo se ignorarán. Usa la siguiente sintaxis para especificar la duración:
<number><m/h/d>
Donde
m/h/d
significa minutos, horas y días, respectivamente.El tiempo mínimo que puedes especificar es 1 minuto.
El tiempo máximo que puedes especificar es de 14 días.
A continuación, se muestra un ejemplo de un objeto match
válido:
$var1, $var2 over 5m
Esta instrucción devuelve $var1
y $var2
(definidos en la sección events
) cuando la regla encuentra una coincidencia. El tiempo especificado es de 5 minutos. Los eventos que se producen con más de 5 minutos de diferencia no se correlacionan y, por lo tanto, la regla los ignora.
A continuación, se muestra otro ejemplo de sección match
válida:
$user over 1h
Esta instrucción devuelve $user
cuando la regla encuentra una coincidencia. El periodo especificado es de 1 hora. Los eventos que tienen más de una hora de diferencia no se correlacionan. La regla no los considera detecciones.
A continuación, se muestra otro ejemplo de sección match
válida:
$source_ip, $target_ip, $hostname over 2m
Esta instrucción devuelve $source_ip
, $target_ip
y $hostname
cuando la regla encuentra una coincidencia. El periodo especificado es de 2 minutos. Los eventos que se produzcan con más de 2 minutos de diferencia no se correlacionarán. La regla no los considera detecciones.
En los siguientes ejemplos se muestran secciones no válidas match
:
var1, var2 over 5m // invalid variable name
$user 1h // missing keyword
Gestión de valores cero en la sección de coincidencias
Rules Engine filtra implícitamente los valores cero de todos los marcadores de posición que se usan en la sección de coincidencias (""
para cadenas, 0
para números, false
para valores booleanos y el valor de la posición 0 para tipos enumerados).
En el siguiente ejemplo se muestran reglas que filtran los valores cero.
rule ZeroValuePlaceholderExample {
meta:
events:
// Because $host is used in the match section, the rule behaves
// as if the following predicate was added to the events section:
// $host != ""
$host = $e.principal.hostname
// Because $otherPlaceholder was not used in the match section,
// there is no implicit filtering of zero values for $otherPlaceholder.
$otherPlaceholder = $e.principal.ip
match:
$host over 5m
condition:
$e
}
Sin embargo, si se asigna un marcador de posición a una función, las reglas no filtran implícitamente los valores cero de los marcadores de posición que se usan en la sección de coincidencias. En el siguiente ejemplo se muestran reglas que filtran los valores cero:
rule ZeroValueFunctionPlaceholder {
meta:
events:
// Even though $ph is used in the match section, there is no
// implicit filtering of zero values for $ph, because $ph is assigned to a function.
$ph = re.capture($e.principal.hostname, "some-regex")
match:
$ph over 5m
condition:
$e
}
Para inhabilitar el filtrado implícito de los valores cero, puede usar la opción allow_zero_values
de la sección de opciones.
Ventana de salto
De forma predeterminada, las reglas de YARA-L 2.0 con una sección de coincidencias se evalúan mediante ventanas de salto.
El intervalo de tiempo de la ejecución de la regla se divide en un conjunto de ventanas de salto superpuestas, cada una con la duración especificada en la sección match
. A continuación, los eventos se correlacionan en cada ventana de salto.
Por ejemplo, en una regla que se ejecuta en el intervalo de tiempo [1:00, 2:00], con una sección match
de 30m
, se podrían generar los siguientes conjuntos de ventanas de salto superpuestas: [1:00, 1:30], [1:03, 1:33] y [1:06, 1:36].
Estas ventanas se usan para correlacionar varios eventos.
Ventana deslizante
Usar ventanas de salto no es una forma eficaz de buscar eventos que se produzcan en un orden específico (por ejemplo, e1
se produce hasta 2 minutos después de e2
). Un evento e1
y un evento e2
se correlacionan solo si se producen en la misma ventana de salto generada.
Una forma más eficaz de buscar este tipo de secuencias de eventos es usar ventanas deslizantes.
Las ventanas deslizantes con la duración especificada en la sección match
se generan cuando
empiezan o terminan con una variable de evento de referencia especificada. Después, los eventos se correlacionan en cada ventana de tiempo. De esta forma, se pueden buscar eventos que se produzcan en un orden específico (por ejemplo, e1
se produce en un plazo de 2 minutos después de e2
). Se correlacionan una instancia del evento e1
y una instancia del evento e2
si el evento e1
se produce en el periodo de la ventana de tiempo después del evento e2
.
Especifique ventanas de tiempo en la sección match
de una regla de la siguiente manera:
<match-var-1>, <match-var-2>, ... over <duration> before|after <pivot-event-var>
La variable de evento de referencia es la variable de evento en la que se basan las ventanas de tiempo. Si usa la palabra clave before
, se generan ventanas deslizantes que terminan con cada aparición del evento de pivote. Si se usa la palabra clave after
, se generan ventanas deslizantes a partir de cada instancia del evento de referencia.
A continuación, se muestran ejemplos de usos válidos de la ventana de tiempo:
$var1, $var2 over 5m after $e1
$user over 1h before $e2
Consulta un ejemplo de regla de ventana deslizante.
No recomendamos usar ventanas deslizantes en reglas de un solo evento, ya que están diseñadas para detectar varios eventos. Si una de tus reglas pertenece a esta categoría, te recomendamos que pruebes una de las siguientes soluciones alternativas:
- Convierte la regla para que use varias variables de evento y actualiza la sección de condiciones si la regla requiere más de una ocurrencia del evento.
- También puedes añadir filtros de marca de tiempo en lugar de usar una ventana de tiempo.
Por ejemplo,
$permission_change.metadata.event_timestamp.seconds < $file_creation.metadata.event_timestamp.seconds
- También puedes añadir filtros de marca de tiempo en lugar de usar una ventana de tiempo.
Por ejemplo,
- Quita la ventana corredera.
Sintaxis de la sección de resultados
En la sección outcome
, puede definir hasta 20 variables de resultado con nombres arbitrarios. Estos resultados se almacenarán en las detecciones generadas por la regla. Cada detección puede tener valores diferentes para los resultados.
El nombre del resultado, $risk_score
, es especial. También puedes definir un resultado con este nombre. Si lo haces, debe ser de tipo entero o flotante. Si se rellena, el risk_score
se mostrará en la vista Estadísticas de empresa para las alertas que procedan de detecciones de reglas.
Si no incluye una variable $risk_score
en la sección de resultados de una regla, se definirá uno de los siguientes valores predeterminados:
- Si la regla está configurada para generar una alerta,
$risk_score
se establece en 40. - Si la regla no está configurada para generar una alerta,
$risk_score
se asigna el valor 15.
El valor de $risk_score
se almacena en el campo de UDM security_result.risk_score
.
Para la puntuación de riesgo segmentada en detecciones compuestas, puedes definir una variable de resultado opcional, $risk_entity_to_score
. Esta variable permite que las reglas apliquen de forma selectiva puntuaciones de riesgo a entidades específicas definidas en el resultado.
Puedes definir esta variable de resultado como una cadena o una lista de cadenas.
Si no incluye una variable $risk_entity_to_score en la sección de resultados de una regla, consulte el ejemplo de cálculo de la puntuación de riesgo para obtener un desglose detallado de cómo se atribuyen las puntuaciones de riesgo.
Por ejemplo, puedes usar $risk_entity_to_score
de la siguiente manera:
none
events:
$bad_host = $e.principal.hostname
outcome:
$risk_entity_to_score = $bad_host // only this entity will get a risk score
$risk_score = 60
Tipos de datos de variables de resultados
Cada variable de resultado puede tener un tipo de datos diferente, que se determina mediante la expresión utilizada para calcularla. Admitimos los siguientes tipos de datos de resultados:
- entero
- flotantes
- cadena
- listas de números enteros
- listas de flotantes
- listas de cadenas
Lógica condicional
Puedes usar la lógica condicional para calcular el valor de un resultado. Las condicionales se especifican mediante el siguiente patrón de sintaxis:
if(BOOL_CLAUSE, THEN_CLAUSE)
if(BOOL_CLAUSE, THEN_CLAUSE, ELSE_CLAUSE)
Puedes leer una expresión condicional como "si BOOL_CLAUSE es true, devuelve THEN_CLAUSE; de lo contrario, devuelve ELSE_CLAUSE".
BOOL_CLAUSE debe dar como resultado un valor booleano. Una expresión BOOL_CLAUSE tiene una forma similar a las expresiones de la sección events
. Por ejemplo, puede contener lo siguiente:
Nombres de campos de UDM con operador de comparación, por ejemplo:
if($context.graph.entity.user.title = "Vendor", 100, 0)
variable de marcador de posición definida en la sección
events
. Por ejemplo:if($severity = "HIGH", 100, 0)
otra variable de resultado definida en la sección
outcome
, por ejemplo:if($risk_score > 20, "HIGH", "LOW")
funciones que devuelven un valor booleano, como las siguientes:
if(re.regex($e.network.email.from, `.*altostrat.com`), 100, 0)
buscar en una lista de referencias, por ejemplo:
if($u.principal.hostname in %my_reference_list_name, 100, 0)
Comparación de agregación, por ejemplo:
if(count($login.metadata.event_timestamp.seconds) > 5, 100, 0)
Las cláusulas THEN_CLAUSE y ELSE_CLAUSE deben ser del mismo tipo de datos. Admitimos números enteros, números de coma flotante y cadenas.
Puedes omitir ELSE_CLAUSE si el tipo de datos es un número entero o un número de coma flotante. Si se omite, la cláusula ELSE se evalúa como 0. Por ejemplo:
`if($e.field = "a", 5)` is equivalent to `if($e.field = "a", 5, 0)`
Debes proporcionar la cláusula ELSE si el tipo de datos es una cadena o si la cláusula THEN es una variable de marcador de posición o una variable de resultado.
Operaciones matemáticas
Puede usar operaciones matemáticas para calcular el tipo de datos entero o flotante en las secciones outcome
y events
de una regla. Google Security Operations admite la suma, la resta, la multiplicación, la división y el módulo como operadores de nivel superior en un cálculo.
El siguiente fragmento es un ejemplo de cálculo en la sección outcome
:
outcome:
$risk_score = max(100 + if($severity = "HIGH", 10, 5) - if($severity = "LOW", 20, 0))
Se permiten operaciones matemáticas en los siguientes tipos de operandos, siempre que cada operando y toda la expresión aritmética se agreguen correctamente (consulta Agregaciones):
- Campos de evento numéricos
- Variables de marcador de posición numéricas definidas en la sección
events
- Variables de resultados numéricas definidas en la sección
outcome
- Funciones que devuelven números enteros o de coma flotante
- Agregaciones que devuelven números enteros o de coma flotante
No se permite el módulo en los números de coma flotante.
Variables de marcador de posición en los resultados
Al calcular las variables de resultado, puede usar variables de marcador de posición que se hayan definido en la sección de eventos de su regla. En este ejemplo, supongamos que $email_sent_bytes
se ha definido en la sección de eventos de la regla:
Ejemplo de un solo evento:
// No match section, so this is a single-event rule.
outcome:
// Use placeholder directly as an outcome value.
$my_outcome = $email_sent_bytes
// Use placeholder in a conditional.
$other_outcome = if($file_size > 1024, "SEVERE", "MODERATE")
condition:
$e
Ejemplo de varios eventos:
match:
// This is a multi event rule with a match section.
$hostname over 5m
outcome:
// Use placeholder directly in an aggregation function.
$max_email_size = max($email_sent_bytes)
// Use placeholder in a mathematical computation.
$total_bytes_exfiltrated = sum(
1024
+ $email_sent_bytes
+ $file_event.principal.file.size
)
condition:
$email_event and $file_event
Variables de resultado en expresiones de asignación de resultados
Las variables de resultado se pueden usar para obtener otras variables de resultado, de forma similar a las variables de marcador de posición definidas en la sección events
. Puede hacer referencia a una variable de resultado en la asignación de otra variable de resultado con un token $
seguido del nombre de la variable. Las variables de resultado deben definirse antes de que se pueda hacer referencia a ellas en el texto de la regla. Cuando se usan en una expresión de asignación, las variables de resultado no se deben agregar (consulta Agregaciones).
En el siguiente ejemplo, la variable de resultado $risk_score
obtiene su valor de la variable de resultado $event_count
:
Ejemplo de varios eventos:
match:
// This is a multi event rule with a match section.
$hostname over 5m
outcome:
// Aggregates all timestamp on login events in the 5 minute match window.
$event_count = count($login.metadata.event_timestamp.seconds)
// $event_count cannot be aggregated again.
$risk_score = if($event_count > 5, "SEVERE", "MODERATE")
// This is the equivalent of the two preceding outcomes combined.
$risk_score2 = if(count($login.metadata.event_timestamp.seconds) > 5, "SEVERE", "MODERATE")
condition:
$e
Las variables de resultado se pueden usar en cualquier tipo de expresión de la parte derecha de una asignación de resultado, excepto en las siguientes expresiones:
- Agregaciones
Arrays.length()
llamadas de funciones- Con los modificadores
any
oall
Agregaciones
Los campos de evento repetidos son valores no escalares. Es decir, una sola variable apunta a varios valores. Por ejemplo, la variable de campo de evento $e.target.ip
es un campo repetido y puede tener cero, uno o muchos valores de IP. Es un valor no escalar. Por otro lado, la variable de campo de evento $e.principal.hostname
no es un campo repetido y solo tiene un valor (es decir, un valor escalar).
Del mismo modo, tanto los campos de evento no repetidos como los repetidos que se usan en la sección de resultados de una regla con una ventana de coincidencia son valores no escalares. Por ejemplo, la siguiente regla agrupa eventos mediante una sección de coincidencias y hace referencia a un campo de evento no repetido en la sección de resultados:
rule OutcomeAndMatchWindow{
...
match:
$userid over 5m
outcome:
$hostnames = array($e.principal.hostname)
...
}
Cualquier periodo de 5 minutos durante el que se ejecute la regla puede contener cero, uno o varios eventos. La sección de resultados
funciona con todos los eventos de una ventana de partido. Cualquier variable de campo de evento a la que se haga referencia en la sección
resultado puede apuntar a cero, uno o varios valores del campo en cada evento de la ventana de coincidencia.
Por ejemplo, si una ventana de 5 minutos contiene 5 eventos $e
, $e.principal.hostname
de la sección de resultados apunta a cinco nombres de host diferentes. La variable de campo de evento
$e.principal.hostname
se trata como un valor no escalar en la sección outcome
de esta regla.
Como las variables de resultado siempre deben producir un único valor escalar, cualquier valor no escalar del que dependa una asignación de resultado debe agregarse para producir un único valor escalar. En una sección de resultados, los siguientes valores no son escalares y deben agregarse:
- Campos de evento (repetidos o no repetidos) cuando la regla usa una sección de coincidencia
- Marcadores de posición de eventos (repetidos o no repetidos) cuando la regla usa una sección de coincidencia
- Campos de evento repetidos cuando la regla no usa una sección de coincidencia
- Marcadores de posición de eventos repetidos cuando la regla no usa una sección de coincidencia
Los campos de eventos escalares, los marcadores de posición de eventos escalares y las constantes se pueden incluir en funciones de agregación en reglas que no incluyan una sección de coincidencia. Sin embargo, en la mayoría de los casos, estas agregaciones devuelven el valor envuelto, por lo que no son necesarias.
Una excepción es la agregación array()
, que puedes usar para convertir explícitamente un valor escalar en una matriz.
Las variables de resultado se tratan como agregaciones: no se deben volver a agregar cuando se haga referencia a ellas en otra asignación de resultado.
Puedes usar las siguientes funciones de agregación:
max()
: muestra el máximo de todos los valores posibles. Solo funciona con números enteros y de coma flotante.min()
: muestra el mínimo de todos los valores posibles. Solo funciona con números enteros y de coma flotante.sum()
: muestra la suma de todos los valores posibles. Solo funciona con números enteros y de coma flotante.count_distinct()
: recoge todos los valores posibles y, a continuación, muestra el recuento de valores posibles distintos.count()
: se comporta comocount_distinct()
, pero devuelve un recuento no distinto de los valores posibles.array_distinct()
: recoge todos los valores distintos posibles y, a continuación, genera una lista con estos valores. Recorta la lista de valores distintos a 1000 elementos aleatorios. Primero se aplica la desduplicación para obtener una lista de elementos distintos y, después, se aplica el truncamiento.array()
: se comporta comoarray_distinct()
, pero devuelve una lista no distinta de valores. También trunca la lista de valores a 1000 elementos aleatorios.period_start_for_max()
: inicio del periodo en el que se produjo el máximo del valor indicado.period_start_for_min()
: inicio del periodo en el que se produjo el mínimo del valor indicado.
La función de agregación es importante cuando una regla incluye una sección condition
que especifica que deben existir varios eventos, ya que la función de agregación operará en todos los eventos que hayan generado la detección.
Por ejemplo, si las secciones outcome
y condition
contienen lo siguiente:
outcome:
$asset_id_count = count($event.principal.asset_id)
$asset_id_distinct_count = count_distinct($event.principal.asset_id)
$asset_id_list = array($event.principal.asset_id)
$asset_id_distinct_list = array_distinct($event.principal.asset_id)
condition:
#event > 1
Como en la sección de condiciones se requiere que haya más de un event
por cada detección, las funciones de agregación operarán en varios eventos. Supongamos que los siguientes eventos han generado una detección:
event:
// UDM event 1
asset_id="asset-a"
event:
// UDM event 2
asset_id="asset-b"
event:
// UDM event 3
asset_id="asset-b"
Los valores de los resultados serán los siguientes:
- $asset_id_count =
3
- $asset_id_distinct_count =
2
- $asset_id_list =
["asset-a", "asset-b", "asset-b"]
- $asset_id_distinct_list =
["asset-a", "asset-b"]
Aspectos que debes tener en cuenta al usar la sección de resultados:
Otras notas y restricciones:
- La sección
outcome
no puede hacer referencia a una variable de marcador de posición nueva que no se haya definido en la secciónevents
o en la secciónoutcome
. - La sección
outcome
no puede usar variables de evento que no se hayan definido en la secciónevents
. - En la sección
outcome
se puede usar un campo de evento que no se haya usado en la secciónevents
, siempre que la variable de evento a la que pertenece el campo de evento ya se haya definido en la secciónevents
. - En la sección
outcome
solo se pueden correlacionar las variables de evento que ya se hayan correlacionado en la secciónevents
. Las correlaciones se producen cuando se igualan dos campos de eventos de variables de eventos diferentes.
Puedes consultar un ejemplo en la sección de resultados del artículo Descripción general de YARA-L 2.0. Consulta Crear analíticas contextuales para obtener información sobre la deduplicación de detecciones con la sección de resultados.
Sintaxis de la sección de condiciones
- especificar una condición de coincidencia en eventos y marcadores de posición definidos en la sección
events
. Consulta la siguiente sección, Condicionales de eventos y marcadores de posición, para obtener más información. - (opcional) Usa la palabra clave
and
para especificar una condición de coincidencia con las variables de resultado definidas en la secciónoutcome
. Consulta la siguiente sección, Condicionales de resultados, para obtener más información.
Contar caracteres
El carácter #
es un carácter especial en la sección condition
. Si se usa antes de cualquier nombre de evento o de variable de marcador de posición, representa el número de eventos o valores distintos que cumplen todas las condiciones de la sección events
.
Por ejemplo, #c > 1
significa que la variable c
debe aparecer más de una vez.
Carácter de valor
El carácter $
es un carácter especial en la sección condition
. Si se usa antes del nombre de una variable de resultado, representa 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
.
Condicionales de eventos y marcadores de posición
Aquí se enumeran los predicados de condición de los eventos y las variables de marcador de posición.
Puedes combinar estos predicados con las palabras clave and
o or
.
Usa la palabra clave
and
entre las condiciones.Usa la palabra clave
or
solo cuando la regla contenga una única variable de evento.
Este es un ejemplo válido de uso de or
entre dos marcadores de posición del mismo evento:
rule ValidConditionOr {
meta:
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
// Note that all placeholders use the same event variable.
$ph = $e.principal.user.userid // Define a placeholder variable to put in match section.
$ph2 = $e.principal.ip // Define a second placeholder variable to put in condition section.
$ph3 = $e.principal.hostname // Define a third placeholder variable to put in condition section.
match:
$ph over 5m
condition:
$ph2 or $ph3
}
Ejemplo no válido de uso de or
entre dos condiciones de eventos diferentes:
rule InvalidConditionOr {
meta:
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$e2.graph.metadata.entity_type = "FILE"
$e2.graph.entity.hostname = $e.principal.hostname
$ph = $e.principal.user.userid // Define a placeholder variable to put in match section.
match:
$ph over 5m
condition:
$e or $e2 // This line will cause an error because there is an or between events.
}
Condiciones acotadas y no acotadas
Las siguientes condiciones son condiciones acotadas. Fuerzan la existencia de la variable de evento asociada, lo que significa que debe aparecer al menos una instancia del evento en cualquier detección.
$var // equivalent to #var > 0
#var > n // where n >= 0
#var >= m // where m > 0
Las siguientes condiciones son condiciones no acotadas. Permiten que la variable de evento asociada no exista, 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 condiciones sin límites se pueden usar para detectar la ausencia de un evento durante un periodo. Por ejemplo, un evento de amenaza sin un evento de mitigación en un periodo de 10 minutos. Las reglas que usan condiciones sin límites se denominan reglas de no existencia.
!$var // equivalent to #var = 0
#var >= 0
#var < n // where n > 0
#var <= m // where m >= 0
Requisitos de inexistencia
Para que se compile una regla con no existencia, debe cumplir los siguientes requisitos:
- Al menos un evento de datos de gestión de usuarios debe tener una condición delimitada (es decir, debe haber al menos un evento de datos de gestión de usuarios).
- 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.
Veamos la siguiente regla, en la que se ha omitido la sección de condiciones:
rule NonexistenceExample {
meta:
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 Rule.
// 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:
<condition_section>
}
A continuación, se muestran ejemplos válidos de <condition_section>
:
$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, lo cual está permitido porque está asociado a$u1
, que sí los tiene. 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.
A continuación, se muestran ejemplos no válidos para el <condition_section>
:
$u1 and $e1
- Todos los eventos y entidades de UDM que aparecen en la sección Eventos deben aparecer en la sección Condición (o tener asignado un marcador de posición que aparezca en la sección Condición).
$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 UDM esté delimitado.
($u1 or #port < 50) and $u2 and $e1 and $e2
- La palabra clave
or
no se admite con condiciones ilimitadas.
- La palabra clave
($u1 or $u2) and $e1 and $e2
- No se admite la palabra clave
or
entre diferentes variables de evento.
- No se admite la palabra clave
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.
- No se permite la palabra clave
#port < 50 and #ip = 0
- Los marcadores de posición que se incluyen abarcan todos los eventos y entidades de UDM. Sin embargo, todas las condiciones son ilimitadas. Esto significa que ninguno de los eventos de UDM está delimitado, lo que provoca que la regla no se pueda compilar.
Condicionales de resultados
Aquí se enumeran los predicados de condición de las variables de resultado, unidos con la palabra clave and
o or
, o precedidos por la palabra clave not
.
Especifica las condiciones de los resultados de forma diferente en función del tipo de variable de resultado:
Número entero: compara con un literal de número entero con operadores
=, >, >=, <, <=, !=
, por ejemplo:$risk_score > 10
Float: compara con un literal de tipo float 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")
Clasificación de la regla
Si especifica un resultado condicional en una regla que tiene una sección de coincidencias, la regla se clasificará como multievento a efectos de la cuota de reglas. Consulta Regla de un solo evento y Regla de varios eventos para obtener más información sobre las clasificaciones de uno y varios eventos.
Sintaxis de la sección Options
En la sección options
, puede especificar las opciones de la regla. A continuación, se muestra un ejemplo de cómo especificar la sección de opciones:
rule RuleOptionsExample {
// Other rule sections
options:
allow_zero_values = true
}
Puede especificar opciones con la sintaxis key = value
, donde key
debe ser un nombre de opción predefinido y value
debe ser un valor válido para la opción, tal como se especifica en las siguientes opciones:
allow_zero_values
Los valores válidos de esta opción son true
y false
, que determinan si la opción está habilitada o no. El valor predeterminado es false
. Esta opción está inhabilitada si no se especifica en la regla.
Para habilitar este ajuste, añade lo siguiente
a la sección de opciones de tu regla: allow_zero_values = true
. De esta forma, se evitará que la regla filtre implícitamente los valores cero de los marcadores de posición que se usan en la sección de coincidencia, tal como se describe en la sección Gestión de valores cero en la sección de coincidencia.
suppression_window
La opción suppression_window
te permite controlar con qué frecuencia se activa una regla para detectar algo. Evita que la misma regla genere varias detecciones en un periodo determinado, aunque se cumplan las condiciones de la regla varias veces.
La ventana de supresión usa un enfoque de ventana de tiempo, que suprime los duplicados en una ventana de tamaño fijo que no se superpone.
También puede proporcionar un suppression_key
para acotar aún más las instancias de la regla que se suprimen en el periodo de supresión. Si no se especifica, se suprimen todas las instancias de la regla. Esta clave se define como una variable de resultado.
En el siguiente ejemplo, suppression_window
se asigna a 5m
y suppression_key
se asigna a la variable $hostname
. Después de que la regla active una detección de $hostname
, se suprimirán las detecciones posteriores de $hostname
durante los cinco minutos siguientes. Sin embargo, si la regla se activa en un evento con un nombre de host diferente, se crea una detección.
El valor predeterminado de suppression_window
es 0
, es decir, la ventana de supresión está inhabilitada de forma predeterminada. Esta opción solo funciona con las reglas de un solo evento que no tienen una sección match
.
Ejemplo:
rule SuppressionWindowExample {
// Other rule sections
outcome:
$suppression_key = $hostname
options:
suppression_window = 5m
}
Reglas de detección compuestas
La detección compuesta en Google SecOps implica conectar varias reglas YARA-L. En esta sección se explica cómo crear una regla compuesta. Para obtener una descripción general de las detecciones compuestas, consulta el artículo Información general sobre las detecciones compuestas.
Comprender la estructura de las reglas
Las reglas de detección compuestas son siempre reglas de varios eventos y siguen la misma estructura y sintaxis.
Una regla compuesta tiene los siguientes componentes esenciales:
events
Bloque: define las entradas, es decir, las detecciones o los eventos específicos que analiza la regla.Bloque
match
: especifica cómo se deben conectar las entradas durante un periodo definido.condition
: contiene la lógica final que determina si los eventos unidos cumplen los criterios para activar una alerta.
Define las entradas en el bloque events
.
El primer paso es definir las entradas de la regla en el bloque events
. Las entradas de las reglas compuestas proceden de colecciones, que almacenan las detecciones generadas por otras reglas.
Google SecOps ofrece los dos métodos siguientes para acceder a los datos de las colecciones.
Hacer referencia a contenido detectado mediante variables de resultado, variables de coincidencia o etiquetas meta
Para acceder a los datos de una detección sin hacer referencia a los eventos de UDM originales, usa variables outcome
, variables match
o etiquetas meta
. Te recomendamos este enfoque porque ofrece una mayor flexibilidad y una mejor compatibilidad entre los distintos tipos de reglas.
Por ejemplo, varias reglas pueden almacenar una cadena (como una URL, un nombre de archivo o una clave de registro) en una variable outcome
común si buscas esa cadena en diferentes contextos. Para acceder a esta cadena desde una regla compuesta, empieza por detection
y busca la información pertinente con elementos del recurso Collection.
Ejemplo: Supongamos que una regla de detección genera la siguiente información:
Variable de resultado:
dest_domain = "cymbal.com"
Campo de UDM:
target.hostname = "cymbal.com"
En la regla compuesta, puede acceder a estos datos mediante las siguientes rutas:
detection.detection.outcomes["dest_domain"]
para acceder a la variable de resultadodest_domain
.detection.collection_elements.references.event.target.hostname
para acceder al campotarget.hostname
UDM.detection.time_window.start_time.seconds
para acceder a la marca de tiempo de la detección.
La API Collection y la API SecurityResult
proporcionan acceso a lo siguiente:
- Metadatos de detección y valores de resultados (
detection.detection
) - Eventos de UDM subyacentes de reglas referenciadas (
collection_elements
)
Hacer referencia al contenido de detección mediante el ID o el nombre de la regla
Puedes hacer referencia a una regla por su nombre o por su ID. Te recomendamos que uses este método cuando tu lógica de detección dependa de reglas específicas. Hacer referencia a reglas relevantes por nombre o ID mejora el rendimiento y evita los tiempos de espera al reducir los datos analizados. Por ejemplo, puedes consultar directamente campos como target.url
o principal.ip
a partir de una detección anterior conocida.
Hacer referencia a una regla por su ID (opción recomendada): use el campo
detection.detection.rule_id
para hacer referencia a una regla por su ID. Puedes encontrar el ID de la regla en la URL de la regla en Google SecOps. Las reglas generadas por los usuarios tienen IDs con el formatoru_UUID
, mientras que las detecciones seleccionadas tienen IDs con el formatour_UUID
. Por ejemplo:detection.detection.rule_id = "ru_e0d3f371-6832-4d20-b0ad-1f4e234acb2b"
Hacer referencia a una regla por su nombre: usa el campo
detection.detection.rule_name
para hacer referencia a una regla por su nombre. Puedes especificar el nombre exacto de la regla o usar una expresión regular para que coincida. Por ejemplo:detection.detection.rule_name = "My Rule Name"
detection.detection.rule_name = "/PartOfName/"
Combina tus aportaciones en la sección match
Para conectar detecciones, eventos o entidades relacionados en una regla compuesta, define la sección match
con variables definidas en la sección events
. Estas variables pueden incluir etiquetas de reglas, variables de resultados, variables de coincidencias, campos de detección o elementos de colección.
Para obtener información sobre la sintaxis, consulta Sintaxis de la sección Match.
Definir la sección condition
Define la sección condition
para evaluar los resultados de la sección match
.
Si la condición es true
, se genera una alerta. Para obtener información sobre la sintaxis, consulta Sintaxis de la sección "Condition".
Usar técnicas avanzadas
En esta sección se explica cómo aplicar técnicas avanzadas al crear reglas compuestas.
Combinar eventos y detecciones
Las reglas compuestas pueden combinar varias fuentes de datos, incluidos eventos de UDM, datos de gráficos de entidades y campos de detección. Deben aplicarse las siguientes directrices:
Usar variables distintas por fuente: asigna variables de evento únicas a cada fuente de datos (por ejemplo,
$e
para eventos y$d
para detecciones), donde la fuente de datos incluya eventos, entidades y detecciones.Unir fuentes en un contexto compartido: conecte fuentes de datos mediante valores comunes, como IDs de usuario, direcciones IP o nombres de dominio, en las condiciones de su regla.
Define una ventana de coincidencia: incluye siempre una cláusula
match
con una ventana de tiempo de 14 días como máximo.
Por ejemplo:
rule CheckCuratedDetection_with_EDR_and_EG {
meta:
author = "noone@cymbal.com"
events:
$d.detection.detection.rule_name = /SCC: Custom Modules: Configurable Bad Domain/
$d.detection.collection_elements.references.event.network.dns.questions.name = $domain
$d.detection.collection_elements.references.event.principal.asset.hostname = $hostname
$e.metadata.log_type = "LIMACHARLIE_EDR"
$e.metadata.product_event_type = "NETWORK_CONNECTIONS"
$domain = re.capture($e.principal.process.command_line, "\\s([a-zA-Z0-9.-]+\\.[a-zA-Z0-9.-]+)$")
$hostname = re.capture($e.principal.hostname, "([^.]*)")
$prevalence.graph.metadata.entity_type = "DOMAIN_NAME"
$prevalence.graph.metadata.source_type = "DERIVED_CONTEXT"
$prevalence.graph.entity.hostname = $domain
$prevalence.graph.entity.domain.prevalence.day_count = 10
$prevalence.graph.entity.domain.prevalence.rolling_max <= 5
$prevalence.graph.entity.domain.prevalence.rolling_max > 0
match:
$hostname over 1h
outcome:
$risk_score = 80
$CL_target = array($domain)
condition:
$e and $d and $prevalence
}
Crear detecciones compuestas secuenciales
Las detecciones compuestas secuenciales identifican patrones de eventos relacionados en los que la secuencia de detecciones es importante, como una detección de intento de inicio de sesión por fuerza bruta, seguida de un inicio de sesión correcto. Estos patrones pueden combinar varias detecciones básicas, eventos UDM sin procesar o ambos.
Para crear una detección compuesta secuencial, debes aplicar ese orden en tu regla. Para aplicar la secuencia esperada, utilice uno de los siguientes métodos:
Ventanas deslizantes: define la secuencia de detecciones mediante ventanas deslizantes en tus condiciones
match
.Comparaciones de marcas de tiempo: compara las marcas de tiempo de las detecciones dentro de la lógica de tu regla para verificar que se producen en el orden seleccionado.
Por ejemplo:
events:
$d1.detection.detection.rule_name = "fileEvent_rule"
$userid = $d1.detection.detection.outcomes["user"]
$hostname = $d1.detection.detection.outcomes["hostname"]
$d2.detection.detection.rule_name = "processExecution_rule"
$userid = $d2.detection.detection.outcomes["user"]
$hostname = $d2.detection.detection.outcomes["hostname"]
$d3.detection.detection.rule_name = "networkEvent_rule"
$userid = $d3.detection.detection.outcomes["user"]
$hostname = $d3.detection.detection.outcomes["hostname"]
$d3.detection.collection_elements.references.event.metadata.event_timestamp.seconds > $d2.detection.collection_elements.references.event.metadata.event_timestamp.seconds
match:
$userid over 24h after $d1
Puntuaciones de riesgo
El risk_score
es un número entero entre 0 y 100 que representa la gravedad o el impacto potenciales de una detección. Una puntuación más alta indica un resultado más crítico, siempre que la detección sea true
.
Para que haya coherencia en toda la plataforma, te recomendamos que utilices los siguientes intervalos de puntuación al asignar un risk_score
a tus detecciones personalizadas. Esta
alineación ayuda a estandarizar la priorización de alertas y los flujos de trabajo de respuesta.
Gravedad | Intervalo de puntuación | Descripción | Ejemplo |
---|---|---|---|
Alertas - Críticas | 90 - 100 | Compromiso activo con el potencial de tener un impacto más allá de una sola cuenta de usuario o endpoint. Requiere una revisión inmediata. | Mimikatz se ha ejecutado en el controlador de dominio. |
Alertas - Alto | 80 - 89 | Compromiso activo de un único endpoint o entidad. Debería recibir una revisión inmediata. | El servidor de producción llama a un C2 reciente y conocido. |
Alertas - Medio | 50 - 79 | Posible problema de seguridad que requiere una investigación. No se ha confirmado ninguna vulneración, pero es posible que se produzca. | Una credencial expuesta sin indicios de uso inadecuado. |
Sin alertas - Baja | 20 - 49 | Evento de seguridad de bajo impacto que, cuando se combina con otros indicadores u observaciones, podría dar lugar a un incidente más importante. Por lo general, no es necesario revisarlo. Se puede combinar con otras detecciones mediante reglas compuestas para crear una alerta. | Análisis de puertos internos. |
Observaciones sin alertas | 1 - 19 | Por lo general, se trata de detecciones basadas en información cuyo objetivo es crear una conciencia situacional de una amenaza. Por lo general, no requiere revisión. Se puede combinar con otras detecciones mediante reglas compuestas para generar alertas. | Un evento de inicio de sesión, sin signos de uso inadecuado. |
Expresiones booleanas
Las expresiones booleanas son expresiones con un tipo booleano.
Comparación
Para usar una expresión binaria como condición, utiliza la siguiente sintaxis:
<EXPR> <OP> <EXPR>
La expresión puede ser un campo de evento, una variable, un literal o una expresión de función.
Por ejemplo:
$e.source.hostname = "host1234"
$e.source.port < 1024
1024 < $e.source.port
$e1.source.hostname != $e2.target.hostname
$e1.metadata.collected_timestamp.seconds > $e2.metadata.collected_timestamp.seconds
$port >= 25
$host = $e2.target.hostname
"google-test" = strings.concat($e.principal.hostname, "-test")
"email@google.org" = re.replace($e.network.email.from, "com", "org")
Si ambos lados son literales, se considera un error de compilación.
Functions
Algunas expresiones de función devuelven un valor booleano, que se puede usar como predicado individual en la sección events
. Estas funciones son las siguientes:
re.regex()
net.ip_in_range_cidr()
Por ejemplo:
re.regex($e.principal.hostname, `.*\.google\.com`)
net.ip_in_range_cidr($e.principal.ip, "192.0.2.0/24")
Expresiones de lista de referencias
Puede usar listas de referencia en la sección de eventos. Consulta la sección sobre listas de referencia para obtener más información.
Expresiones lógicas
Puede usar los operadores lógicos and
y or
en la sección events
, como se muestra en los siguientes ejemplos:
$e.metadata.event_type = "NETWORK_DNS" or $e.metadata.event_type = "NETWORK_DHCP"
($e.metadata.event_type = "NETWORK_DNS" and $e.principal.ip = "192.0.2.12") or ($e.metadata.event_type = "NETWORK_DHCP" and $e.principal.mac = "AB:CD:01:10:EF:22")
not $e.metadata.event_type = "NETWORK_DNS"
De forma predeterminada, el orden de precedencia de mayor a menor es not
, and
y or
.
Por ejemplo, "a or b and c" se evalúa como "a or (b and c)" cuando los operadores or
y and
se definen explícitamente en la expresión.
En la sección events
, los predicados se unen mediante el operador and
si no se define un operador de forma explícita.
El orden de evaluación puede ser diferente si el operador and
está implícito en la expresión.
Por ejemplo, considere las siguientes expresiones de comparación en las que or
se define explícitamente. El operador and
está implícito.
$e1.field = "bat"
or $e1.field = "baz"
$e2.field = "bar"
Este ejemplo se interpreta de la siguiente manera:
($e1.field = "bat" or $e1.field = "baz")
and ($e2.field = "bar")
Como or
se define explícitamente, los predicados que rodean a or
se agrupan y se evalúan primero.
El último predicado, $e2.field = "bar"
, se une implícitamente mediante and
. El resultado es que el orden de evaluación cambia.
Tipos enumerados
Puedes usar los operadores con tipos enumerados. Se puede aplicar a las reglas para simplificar y optimizar el rendimiento (usar operadores en lugar de listas de referencia).
En el siguiente ejemplo, "USER_UNCATEGORIZED" y "USER_RESOURCE_DELETION" corresponden a 15000 y 15014, por lo que la regla buscará todos los eventos enumerados:
$e.metadata.event_type >= "USER_CATEGORIZED" and $e.metadata.event_type <= "USER_RESOURCE_DELETION"
Lista de eventos:
- USER_RESOURCE_DELETION
- USER_RESOURCE_UPDATE_CONTENT
- USER_RESOURCE_UPDATE_PERMISSIONS
- USER_STATS
- USER_UNCATEGORIZED
Modificador Nocase
Cuando tengas una expresión de comparación entre valores de cadena o una expresión regular, puedes añadir "nocase" al final de la expresión para ignorar las mayúsculas y minúsculas.
$e.principal.hostname != "http-server" nocase
$e1.principal.hostname = $e2.target.hostname nocase
$e.principal.hostname = /dns-server-[0-9]+/ nocase
re.regex($e.target.hostname, `client-[0-9]+`) nocase
No se puede usar cuando un tipo de campo es un valor enumerado. Los siguientes ejemplos no son válidos y generarán errores de compilación:
$e.metadata.event_type = "NETWORK_DNS" nocase
$e.network.ip_protocol = "TCP" nocase
Campos repetidos
En el modelo de datos unificado (UDM), algunos campos se etiquetan como repetidos, lo que indica que son listas de valores u otros tipos de mensajes.
Campos repetidos y expresiones booleanas
Hay dos tipos de expresiones booleanas que actúan sobre campos repetidos:
- Última modificación
- Sin modificar
Consideremos el siguiente evento:
event_original {
principal {
// ip is a repeated field
ip: [ "192.0.2.1", "192.0.2.2", "192.0.2.3" ]
hostname: "host"
}
}
Expresiones modificadas
En las siguientes secciones se describe la finalidad de los modificadores any
y all
en las expresiones, así como su uso.
Cualquiera.
Si cualquier elemento del campo repetido cumple la condición, el evento en su conjunto la cumple.
event_original
satisfaceany $e.principal.ip = "192.0.2.1"
.event_original
fallaany $e.repeated_field.field_a = "9.9.9.9
.
todos
Si todos los elementos del campo repetido cumplen la condición, el evento en su conjunto la cumple.
event_original
satisfacenet.ip_in_range_cidr(all $e.principal.ip, "192.0.2.0/8")
.event_original
fallaall $e.principal.ip = "192.0.2.2"
.
Cuando escribas una condición con any
o all
, ten en cuenta que negar la condición con not
puede no tener el mismo significado que usar el operador negado.
Por ejemplo:
not all $e.principal.ip = "192.168.12.16"
comprueba si no todas las direcciones IP coinciden con192.168.12.16
, lo que significa que la regla comprueba si al menos una dirección IP no coincide con192.168.12.16
.all $e.principal.ip != "192.168.12.16"
comprueba si todas las direcciones IP no coinciden192.168.12.16
, lo que significa que la regla comprueba que ninguna dirección IP coincide con192.168.12.16
.
Restricciones:
- Los operadores
any
yall
solo son compatibles con campos repetidos (no con campos escalares). any
yall
no se pueden usar para combinar dos campos repetidos. Por ejemplo,any $e1.principal.ip = $e2.principal.ip
no es válido.- Los operadores
any
yall
no se admiten con la expresión de lista de referencia.
Expresiones sin modificar
Con las expresiones sin modificar, cada elemento del campo repetido se trata de forma individual. Si el campo repetido de un evento contiene n elementos, la regla se aplica a n copias del evento, donde cada copia tiene uno de los elementos del campo repetido. Estas copias son transitorias y no se almacenan.
La regla se aplica en las siguientes copias:
copia del evento | principal.ip | principal.hostname |
---|---|---|
event_copy_1 | "192.0.2.1" | "host" |
event_copy_2 | "192.0.2.2" | "host" |
event_copy_3 | "192.0.2.3" | "host" |
Si alguna copia del evento cumple todas las condiciones sin modificar del campo repetido, el evento en su conjunto cumple todas las condiciones. Esto significa que, si tienes varias condiciones en un campo repetido, la copia del evento debe cumplir todas ellas. En los siguientes ejemplos de reglas se usa el conjunto de datos de ejemplo anterior para mostrar este comportamiento.
La siguiente regla devuelve una coincidencia cuando se ejecuta en el conjunto de datos de ejemplo event_original
, porque event_copy_1
cumple todos los predicados de eventos:
rule repeated_field_1 {
meta:
events:
net.ip_in_range_cidr($e.principal.ip, "192.0.2.0/8") // Checks if IP address matches 192.x.x.x
$e.principal.ip = "192.0.2.1"
condition:
$e
}
La siguiente regla no devuelve ninguna coincidencia cuando se ejecuta en el conjunto de datos de ejemplo event_original
porque no hay ninguna copia del evento en $e.principal.ip
que
cumpla todos los predicados del evento.
rule repeated_field_2 {
meta:
events:
$e.principal.ip = "192.0.2.1"
$e.principal.ip = "192.0.2.2"
condition:
$e
}
Las expresiones modificadas en campos repetidos son compatibles con las expresiones sin modificar en campos repetidos porque la lista de elementos es la misma para cada copia del evento. Considera la siguiente regla:
rule repeated_field_3 {
meta:
events:
any $e.principal.ip = "192.0.2.1"
$e.principal.ip = "192.0.2.3"
condition:
$e
}
La regla se aplica en las siguientes copias:
copia del evento | principal.ip | any $e.principal.ip |
---|---|---|
event_copy_1 | "192.0.2.1" | ["192.0.2.1", "192.0.2.2", "192.0.2.3"] |
event_copy_2 | "192.0.2.2" | ["192.0.2.1", "192.0.2.2", "192.0.2.3"] |
event_copy_3 | "192.0.2.3" | ["192.0.2.1", "192.0.2.2", "192.0.2.3"] |
En este caso, todas las copias cumplen any $e.principal.ip = "192.0.2.1"
, pero solo event_copy_3
cumple $e.principal.ip = "192.0.2.3". Como resultado, el evento en su conjunto coincidiría.
Otra forma de entender estos tipos de expresiones es la siguiente:
- Las expresiones de campos repetidos que usan
any
oall
operan en la lista deevent_original
. - Las expresiones de campos repetidos que no usan
any
niall
operan en eventosevent_copy_n
individuales.
Campos repetidos y marcadores de posición
Los campos repetidos funcionan con asignaciones de marcadores de posición. Al igual que ocurre con las expresiones sin modificar en los campos repetidos, se hace una copia del evento por cada elemento. Siguiendo con el ejemplo de event_copy
, el marcador de posición toma el valor del campo repetido de event_copy_n
en cada una de las copias del evento, donde n es el número de copia del evento. Si el marcador de posición se usa en la sección de coincidencias, puede dar lugar a varias coincidencias.
En el siguiente ejemplo se genera una coincidencia. El marcador de posición $ip
es igual a 192.0.2.1
para event_copy_1
, lo que cumple los predicados de la regla.
Las muestras de eventos de la coincidencia contienen un solo elemento, event_original
.
// Generates 1 match.
rule repeated_field_placeholder1 {
meta:
events:
$ip = $e.principal.ip
$ip = "192.0.2.1"
$host = $e.principal.hostname
match:
$host over 5m
condition:
$e
}
En el siguiente ejemplo se generan tres coincidencias. El marcador de posición $ip
es igual a diferentes valores para cada una de las copias de event_copy_n
.
La agrupación se hace en $ip
, ya que está en la sección de coincidencias. Por lo tanto, obtienes tres coincidencias, cada una con un valor diferente para la variable de coincidencia $ip
. Cada coincidencia tiene el mismo ejemplo de evento: un solo elemento, event_original
.
// Generates 3 matches.
rule repeated_field_placeholder2 {
meta:
events:
$ip = $e.principal.ip
net.ip_in_range_cidr($ip, "192.0.2.0/8") // Checks if IP matches 192.x.x.x
match:
$ip over 5m
condition:
$e
}
Resultados al usar marcadores de posición asignados a campos repetidos
Los marcadores de posición se asignan a cada elemento de cada campo repetido, no a toda la lista. Por lo tanto, cuando se usan en la sección de resultados, estos se calculan usando solo los elementos que cumplen los requisitos de las secciones anteriores.
Considera la siguiente regla:
rule outcome_repeated_field_placeholder {
meta:
events:
$ip = $e.principal.ip
$ip = "192.0.2.1" or $ip = "192.0.2.2"
$host = $e.principal.hostname
match:
$host over 5m
outcome:
$o = array_distinct($ip)
condition:
$e
}
Esta regla tiene cuatro fases de ejecución. La primera fase es la copia de eventos:
copia del evento | $ip | $host | $e |
---|---|---|---|
event_copy_1 | "192.0.2.1" | "host" | event_id |
event_copy_2 | "192.0.2.2" | "host" | event_id |
event_copy_3 | "192.0.2.3" | "host" | event_id |
En la sección de eventos, se filtrarán las filas que no coincidan con los filtros:
copia del evento | $ip | $host | $e |
---|---|---|---|
event_copy_1 | "192.0.2.1" | "host" | event_id |
event_copy_2 | "192.0.2.2" | "host" | event_id |
Se ha excluido event_copy_3
porque "192.0.2.3"
no cumple $ip = "192.0.2.1" or $ip = "192.0.2.2"
.
La sección de coincidencias se agrupará por variables de coincidencia y la sección de resultados agregará los datos de cada grupo:
$host | $o | $e |
---|---|---|
"host" | ["192.0.2.1", "192.0.2.2"] | event_id |
$o = array_distinct($ip)
se calcula a partir de $ip
de la fase anterior, no de la fase de copia de eventos.
Por último, la sección de condiciones filtrará cada grupo. Como esta regla solo comprueba si existe $e, la fila anterior generará una sola detección.
$o
no contiene todos los elementos de $e.principal.ip
porque no todos los elementos cumplen todas las condiciones de la sección de eventos. Sin embargo, todos los elementos de e.principal.ip
aparecerán en la muestra de eventos porque esta usa event_original
.
Indexación de arrays
Puedes realizar indexación de arrays en campos repetidos. Para acceder al elemento del campo repetido n-ésimo, usa la sintaxis de lista estándar (los elementos se indexan a partir de 0). Si el elemento está fuera de los límites, se devuelve el valor predeterminado.
$e.principal.ip[0] = "192.168.12.16"
$e.principal.ip[999] = ""
Si hay menos de 1000 elementos, el resultado estrue
.
Restricciones:
- Un índice debe ser un literal de número entero no negativo. Por ejemplo,
$e.principal.ip[-1]
no es válido. - Los valores que tienen el tipo
int
(por ejemplo, un marcador de posición con el valorint
) no se tienen en cuenta. - La indexación de arrays no se puede combinar con
any
niall
. Por ejemplo,any $e.intermediary.ip[0]
no es válido. - La indexación de arrays no se puede combinar con la sintaxis de mapas. Por ejemplo,
$e.additional.fields[0]["key"]
no es válido. - Si la ruta del campo contiene varios campos repetidos, todos ellos deben usar la indexación de arrays. Por ejemplo,
$e.intermediary.ip[0]
no es válido porqueintermediary
yip
son campos repetidos, pero solo hay un índice paraip
.
Mensajes repetidos
Cuando se repite un campo message
, se reduce la probabilidad de que se produzca una coincidencia. Esto se ilustra en los siguientes ejemplos.
Consideremos el siguiente evento:
event_repeated_message {
// about is a repeated message field.
about {
// ip is a repeated string field.
ip: [ "192.0.2.1", "192.0.2.2", "192.0.2.3" ]
hostname: "alice"
}
about {
hostname: "bob"
}
}
Como se ha indicado en el caso de las expresiones sin modificar en campos repetidos, se crea una copia temporal del evento para cada elemento del campo repetido. Considera la siguiente regla:
rule repeated_message_1 {
meta:
events:
$e.about.ip = "192.0.2.1"
$e.about.hostname = "bob"
condition:
$e
}
La regla se aplica en las siguientes copias:
copia del evento | about.ip | about.hostname |
---|---|---|
event_copy_1 | "192.0.2.1" | "alice" |
event_copy_2 | "192.0.2.2" | "alice" |
event_copy_3 | "192.0.2.3" | "alice" |
event_copy_4 | "" | "bob" |
El evento no coincide con la regla porque no hay ninguna copia del evento que cumpla todas las expresiones.
Mensajes repetidos e indexación de arrays
Otro comportamiento inesperado puede producirse al usar la indexación de arrays con expresiones sin modificar en campos de mensajes repetidos. Veamos la siguiente regla de ejemplo que usa la indexación de arrays:
rule repeated_message_2 {
meta:
events:
$e.about.ip = "192.0.2.1"
$e.about[1].hostname = "bob"
condition:
$e
}
La regla se aplica a las siguientes copias:
copia del evento | about.ip | about[1].hostname |
---|---|---|
event_copy_1 | "192.0.2.1" | "bob" |
event_copy_2 | "192.0.2.2" | "bob" |
event_copy_3 | "192.0.2.3" | "bob" |
event_copy_4 | "" | "bob" |
Como event_copy_1
cumple todas las expresiones de repeated_message_2
, el evento coincide con la regla.
Esto puede provocar un comportamiento inesperado, ya que la regla repeated_message_1
no tenía indexación de matriz y no produjo ninguna coincidencia, mientras que la regla repeated_message_2
sí tenía indexación de matriz y produjo una coincidencia.
Comentarios
Designa los comentarios con dos caracteres de barra (// comment
) o los comentarios de varias líneas delimitados con caracteres de barra y asterisco (/* comment */
), como harías en C.
Literales
Se admiten números enteros y de coma flotante no negativos, cadenas, valores booleanos y literales de expresiones regulares.
Literales de cadena y de expresión regular
Puedes usar cualquiera de los siguientes caracteres de comillas para incluir cadenas en YARA-L 2.0. Sin embargo, el texto entre comillas se interpreta de forma diferente en función de cuál uses.
Comillas dobles ("): se usan para cadenas normales. Debe incluir caracteres de escape.
Por ejemplo: "hola\tmundo" —\t se interpreta como una tabulaciónComillas inversas (`) — Se usan para interpretar todos los caracteres de forma literal.
Por ejemplo: `hola\tmundo` —\t no se interpreta como una tabulación
En el caso de las expresiones regulares, tienes dos opciones.
Si quieres usar expresiones regulares directamente sin la función re.regex()
, usa /regex/
para los literales de expresiones regulares.
También puedes usar literales de cadena como literales de expresión regular cuando usas la función re.regex()
. Ten en cuenta que, en el caso de los literales de cadena entre comillas dobles, debes escapar los caracteres de barra inversa con caracteres de barra inversa, lo que puede resultar extraño.
Por ejemplo, las siguientes expresiones regulares son equivalentes:
re.regex($e.network.email.from, `.*altostrat\.com`)
re.regex($e.network.email.from, ".*altostrat\\.com")
$e.network.email.from = /.*altostrat\.com/
Google recomienda usar comillas inversas para las cadenas de las expresiones regulares para que sean más fáciles de leer.
Operadores
Puedes usar los siguientes operadores en YARA-L:
Operador | Descripción |
= | igual/declaración |
!= | no es igual |
< | menor que |
<= | menor o igual que |
> | mayor que |
>= | mayor o igual que |
Variables
En YARA-L 2.0, todas las variables se representan como $<variable name>
.
Puede definir los siguientes tipos de variables:
Variables de evento: representan grupos de eventos en formato normalizado (UDM) o eventos de entidad. Especifique las condiciones de las variables de evento en la sección
events
. Las variables de evento se identifican mediante un nombre, una fuente de evento y campos de evento. Las fuentes permitidas sonudm
(para eventos normalizados) ygraph
(para eventos de entidad). Si se omite la fuente, se defineudm
como fuente predeterminada. Los campos de evento se representan como una cadena de .<nombre del campo> (por ejemplo, $e.field1.field2). Las cadenas de campos de eventos siempre empiezan por la fuente de nivel superior (UDM o Entidad).Variables de coincidencia: se declaran en la sección
match
. Las variables de coincidencia se convierten en campos de agrupación de la consulta, ya que se devuelve una fila por cada conjunto único de variables de coincidencia (y por cada ventana temporal). Cuando la regla encuentra una coincidencia, se devuelven los valores de las variables de coincidencia. Especifica qué representa cada variable de coincidencia en la secciónevents
.Variables de marcador de posición: se declaran y definen en la sección
events
. Las variables de marcador de posición son similares a las variables de coincidencia. Sin embargo, puede usar variables de marcador de posición en la seccióncondition
para especificar las condiciones de coincidencia.
Usa variables de coincidencia y variables de marcador de posición para declarar relaciones entre campos de eventos mediante condiciones de unión transitivas (consulta la sintaxis de la sección Eventos para obtener más información).
Palabras clave
Las palabras clave de YARA-L 2.0 no distinguen entre mayúsculas y minúsculas. Por ejemplo, and
y AND
son equivalentes. Los nombres de las variables no deben entrar en conflicto con las palabras clave. Por ejemplo, $AND
o $outcome
no son válidos.
Estas son las palabras clave de las reglas del motor de detección: rule
, meta
, match
, over
, events
, condition
, outcome
, options
, and
, or
, not
, nocase
, in
, regex
, cidr
, before
, after
, all
, any
, if
, max
, min
, sum
, array
, array_distinct
, count
, count_distinct
, is
y null
.
Maps
YARA-L admite el acceso a mapas de structs y etiquetas.
Estructuras y etiquetas
Algunos campos de UDM usan el tipo de datos Struct o Label.
Para buscar un par clave-valor específico en Struct y Label, usa la sintaxis de mapa estándar:
// A Struct field.
$e.udm.additional.fields["pod_name"] = "kube-scheduler"
// A Label field.
$e.metadata.ingestion_labels["MetadataKeyDeletion"] = "startup-script"
El acceso al mapa siempre devuelve una cadena.
Casos admitidos
Sección de eventos y resultados
// Using a Struct field in the events section
events:
$e.udm.additional.fields["pod_name"] = "kube-scheduler"
// Using a Label field in the outcome section
outcome:
$value = array_distinct($e.metadata.ingestion_labels["MetadataKeyDeletion"])
Asignar un valor de mapa a un marcador de posición
$placeholder = $u1.metadata.ingestion_labels["MetadataKeyDeletion"]
Usar un campo de mapa en una condición de unión
// using a Struct field in a join condition between two udm events $u1 and $u2
$u1.metadata.event_type = $u2.udm.additional.fields["pod_name"]
Casos no admitidos
Los mapas no se admiten en los siguientes casos.
Combinar palabras clave de any
o all
con un mapa
Por ejemplo, no se admite lo siguiente:
all $e.udm.additional.fields["pod_name"] = "kube-scheduler"
Otros tipos de valores
La sintaxis de la asignación solo puede devolver un valor de cadena. En el caso de los tipos de datos Struct, la sintaxis de mapa solo puede acceder a las claves cuyos valores sean cadenas. No se puede acceder a las claves cuyos valores sean otros tipos primitivos, como los números enteros.
Gestión de valores duplicados
Los accesos a mapas siempre devuelven un único valor. En el caso poco habitual de que el acceso al mapa pueda hacer referencia a varios valores, el acceso al mapa devolverá de forma determinista el primer valor.
Esto puede ocurrir en cualquiera de los siguientes casos:
Una etiqueta tiene una clave duplicada.
La estructura de la etiqueta representa un mapa, pero no exige que las claves sean únicas. Por convención, un mapa debe tener claves únicas, por lo que Google SecOps no recomienda rellenar una etiqueta con claves duplicadas.
El texto de la regla
$e.metadata.ingestion_labels["dupe-key"]
devolvería el primer valor posible,val1
, si se aplicara al siguiente ejemplo de datos:// Disrecommended usage of label with a duplicate key: event { metadata{ ingestion_labels{ key: "dupe-key" value: "val1" // This is the first possible value for "dupe-key" } ingestion_labels{ key: "dupe-key" value: "val2" } } }
Una etiqueta tiene un campo repetido de ancestro.
Un campo repetido puede contener una etiqueta como campo secundario. Dos entradas diferentes en el campo repetido de nivel superior pueden contener etiquetas que tengan la misma clave. El texto de la regla
$e.security_result.rule_labels["key"]
devolvería el primer valor posible,val3
, si se aplicara al siguiente ejemplo de datos:event { // security_result is a repeated field. security_result { threat_name: "threat1" rule_labels { key: "key" value: "val3" // This is the first possible value for "key" } } security_result { threat_name: "threat2" rule_labels { key: "key" value: "val4" } } }
Acceder a las variables de resultados en los mapas
En esta sección se explica cómo acceder a las variables de resultado de los mapas con sus tipos de datos originales (por ejemplo, números enteros, booleanos o listas de estos tipos) en lugar de solo cadenas. Puedes usar esta función para que la lógica de tus reglas sea más flexible y precisa.
Los datos de resultados están disponibles en los dos campos siguientes:
Los valores de los resultados conservan sus tipos originales en el campo
variables
.El campo
outcomes
almacena versiones destring
para la retrocompatibilidad.
Puedes acceder a estos valores de resultado mediante el mapa variables
para obtener el tipo específico o acceder a los elementos de una secuencia mediante la indexación
de arrays. Puedes acceder a un elemento específico de la secuencia por su índice o seleccionar toda la secuencia para evaluar cada valor individualmente.
Sintaxis:
$d.detection.detection.variables[OUTCOME_NAME].TYPE_SUFFIX
Sintaxis de las secuencias:
$d.detection.detection.variables[OUTCOME_NAME].SEQUENCE_TYPE_SUFFIX.TYPE_VALS_SUFFIX
Ejemplos:
Acceder al resultado de una cadena:
$my_string_outcome = $d.detection.detection.variables["outcome_ip"].string_val
En este ejemplo, se obtiene el valor de cadena directamente (por ejemplo,
"1.1.1.1"
sioutcome_ip
fuera una sola cadena).Acceder a un resultado entero:
$my_int_outcome = $d.detection.detection.variables["outcome_port"].int64_value
En este ejemplo, se recupera el valor entero (por ejemplo,
30
).Acceder a una lista de números enteros (
Int64Sequence
):$my_int_list = $d.detection.detection.variables["outcome_ports"].int64_seq.int64_vals
En este ejemplo se obtiene la lista completa de números enteros y se desanidan como campos repetidos (por ejemplo,
[2, 3, 4]
).Acceder a un elemento concreto de una lista de números enteros:
$first_int = $d.detection.detection.variables["outcome_ports"].int64_seq.int64_vals[0]
En este ejemplo, se obtiene el primer número entero de la lista (por ejemplo,
2
).Acceder a una lista de cadenas (StringSequence):
$my_string_list = $d.detection.detection.variables["outcome_ips"].string_seq.string_vals
En este ejemplo se obtiene la lista completa de cadenas y se desanidan como campos repetidos (por ejemplo,
["1.1.1.1", "2.2.2.2"]
).Acceder a un elemento concreto de una lista de cadenas:
$first_ip = $d.detection.detection.variables["outcome_ips"].string_seq.string_vals[0]
En este ejemplo se obtiene la primera dirección IP de la lista (por ejemplo,
"1.1.1.1"
).
Sufijos de tipo disponibles para variables
Para ver una lista completa de los sufijos admitidos, consulta FindingVariable.
Functions
En esta sección se describen las funciones de YARA-L 2.0 que puedes usar en las reglas y búsquedas del motor de detección.
Estas funciones se pueden usar en las siguientes partes de una regla de YARA-L:
events
sección.BOOL_CLAUSE
de una condición en la sección de resultados.
arrays.concat
arrays.concat(string_array, string_array)
Descripción
Devuelve una nueva matriz de cadenas copiando elementos de matrices de cadenas originales.
Tipos de datos de parámetros
ARRAY_STRINGS
, ARRAY_STRINGS
Tipo de devolución
ARRAY_STRINGS
Códigos de ejemplo
Ejemplo 1
En el siguiente ejemplo se concatenan dos matrices de cadenas diferentes.
arrays.concat(["test1", "test2"], ["test3"]) = ["test1", "test2", "test3"]
Ejemplo 2
En el siguiente ejemplo se concatenan arrays con una cadena vacía.
arrays.concat([""], [""]) = ["", ""]
Ejemplo 3
En el siguiente ejemplo se concatenan arrays vacíos.
arrays.concat([], []) = []
arrays.join_string
arrays.join_string(array_of_strings, optional_delimiter)
Descripción
Convierte una matriz de cadenas en una sola cadena separada por el parámetro opcional. Si no se proporciona ningún delimitador, se usa la cadena vacía.
Tipos de datos de parámetros
ARRAY_STRINGS
, STRING
Tipo de devolución
STRING
Códigos de ejemplo
Aquí tienes algunos ejemplos de cómo usar la función:
Ejemplo 1
En este ejemplo se une una matriz con elementos no nulos y un delimitador.
arrays.join_string(["foo", "bar"], ",") = "foo,bar"
Ejemplo 2
En este ejemplo se une un array con un elemento nulo y un delimitador.
arrays.join_string(["foo", NULL, "bar"], ",") = "foo,bar"
Ejemplo 3
En este ejemplo se une una matriz con elementos no nulos y sin delimitador.
arrays.join_string(["foo", "bar"]) = "foobar"
arrays.length
arrays.length(repeatedField)
Descripción
Devuelve el número de elementos de campo repetidos.
Tipos de datos de parámetros
LIST
Tipo de devolución
NUMBER
Códigos de ejemplo
Ejemplo 1
Devuelve el número de elementos de campo repetidos.
arrays.length($e.principal.ip) = 2
Ejemplo 2
Si hay varios campos repetidos en la ruta, devuelve el número total de elementos de campo repetidos.
arrays.length($e.intermediary.ip) = 3
arrays.max
arrays.max(array_of_ints_or_floats)
Descripción
Devuelve el elemento más grande de una matriz o cero si la matriz está vacía.
Tipos de datos de parámetros
ARRAY_INTS|ARRAY_FLOATS
Tipo de devolución
FLOAT
Códigos de ejemplo
Aquí tienes algunos ejemplos de cómo usar la función:
Ejemplo 1
En este ejemplo se devuelve el elemento mayor de una matriz de números enteros.
arrays.max([10, 20]) = 20.000000
Ejemplo 2
En este ejemplo se devuelve el elemento mayor de una matriz de números de coma flotante.
arrays.max([10.000000, 20.000000]) = 20.000000
arrays.min
arrays.min(array_of_ints_or_floats[, ignore_zeros=false])
Descripción
Devuelve el elemento más pequeño de una matriz o cero si la matriz está vacía. Si el segundo argumento opcional se define como true, se ignoran los elementos iguales a cero.
Tipos de datos de parámetros
ARRAY_INTS|ARRAY_FLOATS
, BOOL
Tipo de devolución
FLOAT
Códigos de ejemplo
Aquí tienes algunos ejemplos de cómo usar la función:
Ejemplo 1
En este ejemplo se devuelve el elemento más pequeño de una matriz de números enteros.
arrays.min([10, 20]) = 10.000000
Ejemplo 2
En este ejemplo se devuelve el elemento más pequeño de una matriz de números de coma flotante.
arrays.min([10.000000, 20.000000]) = 10.000000
Ejemplo 3
En este ejemplo se devuelve el elemento más pequeño de una matriz de números de coma flotante, sin tener en cuenta los ceros.
arrays.min([10.000000, 20.000000, 0.0], true) = 10.000000
arrays.size
arrays.size( array )
Descripción
Devuelve el tamaño de la matriz. Devuelve 0 para una matriz vacía.
Tipos de datos de parámetros
ARRAY_STRINGS|ARRAY_INTS|ARRAY_FLOATS
Tipo de devolución
INT
Códigos de ejemplo
Ejemplo 1
En este ejemplo se usa una matriz de cadenas que contiene dos elementos.
arrays.size(["test1", "test2"]) = 2
Ejemplo 2
En este ejemplo se usa una matriz de números enteros que contiene 3 elementos.
arrays.size([1, 2, 3]) = 3
Ejemplo 3
En este ejemplo se usa una matriz de flotantes que contiene un elemento.
arrays.size([1.200000]) = 1
Ejemplo 4
En este ejemplo se usa un array vacío.
arrays.size([]) = 0
arrays.index_to_float
arrays.index_to_float(array, index)
Descripción
Devuelve el elemento situado en el índice indicado de una matriz. El elemento de ese índice se devuelve como un número de coma flotante.
El índice es un valor entero que representa la posición de un elemento en la matriz. De forma predeterminada, el primer elemento de una matriz tiene el índice 0 y el último elemento tiene el índice n-1, donde n es el tamaño de la matriz. La indexación negativa permite acceder a los elementos de una matriz en relación con el final de la matriz. Por ejemplo, el índice -1 hace referencia al último elemento de la matriz y el índice -2 hace referencia al penúltimo elemento de la matriz.
Tipos de datos de parámetros
ARRAY_STRINGS|ARRAY_INTS|ARRAY_FLOATS
, INT
Tipo de devolución
FLOAT
Códigos de ejemplo
Ejemplo 1
En el siguiente ejemplo se obtiene un elemento en el índice 1 de una matriz de números de coma flotante.
arrays.index_to_float([1.2, 2.1, 3.5, 4.6], 1) // 2.1
Ejemplo 2
En el siguiente ejemplo se obtiene un elemento en el índice -1 de una matriz de números de coma flotante.
arrays.index_to_float([1.2, 2.1, 3.5, 4.6], 0-1) // 4.6
Ejemplo 3
En el siguiente ejemplo se obtiene un elemento con un índice mayor que el tamaño de la matriz.
arrays.index_to_float([1.2, 2.1, 3.5, 4.6], 6) // 0.0
Ejemplo 4
En el siguiente ejemplo se obtiene un elemento de una matriz vacía.
arrays.index_to_float([], 0) // 0.0
Ejemplo 5
En el siguiente ejemplo se obtiene un elemento en el índice 1 de una matriz de cadenas.
arrays.index_to_float(["1.2", "3.3", "2.4"], 1) // 3.3
Ejemplo 6
En el siguiente ejemplo se obtiene un elemento en el índice 2 de una matriz de números enteros.
arrays.index_to_float([1, 3, 2], 2) // 2.0
arrays.index_to_int
arrays.index_to_int(array_of_inputs, index)
Descripción
Devuelve el valor de un índice determinado de una matriz como un número entero.
El índice es un valor entero que representa la posición de un elemento en la matriz. De forma predeterminada, el primer elemento de una matriz tiene el índice 0 y el último elemento tiene el índice n-1, donde n es el tamaño de la matriz. La indexación negativa permite acceder a los elementos de una matriz en relación con el final de la matriz. Por ejemplo, el índice -1 hace referencia al último elemento de la matriz y el índice -2 hace referencia al penúltimo elemento de la matriz.
Tipos de datos de parámetros
ARRAY_STRINGS|ARRAY_INTS|ARRAY_FLOATS
, INT
Tipo de devolución
INT
Códigos de ejemplo
Ejemplo 1
Esta llamada de función devuelve 0 cuando el valor del índice es una cadena no numérica.
arrays.index_to_int(["str0", "str1", "str2"], 1) = 0
Ejemplo 2
Esta función devuelve el elemento del índice -1.
arrays.index_to_int(["44", "11", "22", "33"], 0-1) = 33
Ejemplo 3
Devuelve 0 para el elemento fuera de los límites.
arrays.index_to_int(["44", "11", "22", "33"], 5) = 0
Ejemplo 4
Esta función obtiene el elemento de la matriz de números de coma flotante en el índice 1.
arrays.index_to_int([1.100000, 1.200000, 1.300000], 1) = 1
Ejemplo 5
Esta función obtiene el elemento de la matriz int en el índice 0.
arrays.index_to_int([1, 2, 3], 0) = 1
arrays.index_to_str
arrays.index_to_str(array, index)
Descripción
Devuelve el elemento de la matriz que se encuentra en el índice indicado como una cadena. El índice es un valor entero que representa la posición de un elemento en la matriz. De forma predeterminada, el primer elemento de una matriz tiene el índice 0 y el último elemento tiene el índice n-1, donde n es el tamaño de la matriz. La indexación negativa permite acceder a los elementos de un array desde el final del array. Por ejemplo, el índice -1 hace referencia al último elemento de la matriz y el índice -2 hace referencia al penúltimo elemento de la matriz.
Tipos de datos de parámetros
ARRAY_STRINGS|ARRAY_INTS|ARRAY_FLOATS
, INT
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En el siguiente ejemplo se obtiene un elemento en el índice 1 de una matriz de cadenas.
arrays.index_to_str(["test1", "test2", "test3", "test4"], 1) // "test2"
Ejemplo 2
En el siguiente ejemplo se obtiene un elemento en el índice -1 (el último elemento de la matriz) de una matriz de cadenas.
arrays.index_to_str(["test1", "test2", "test3", "test4"], 0-1) // "test4"
Ejemplo 3
En el siguiente ejemplo se obtiene un elemento con un índice mayor que el tamaño de la matriz, lo que devuelve una cadena vacía.
arrays.index_to_str(["test1", "test2", "test3", "test4"], 6) // ""
Ejemplo 4
En el siguiente ejemplo se obtiene un elemento de una matriz vacía.
arrays.index_to_str([], 0) // ""
Ejemplo 5
En el siguiente ejemplo se obtiene un elemento en el índice 0 de una matriz de números de coma flotante. El resultado se devuelve como una cadena.
arrays.index_to_str([1.200000, 3.300000, 2.400000], 0) // "1.2"
Ejemplo 6
En el siguiente ejemplo se obtiene un elemento en el índice 2 de una matriz de números enteros. El resultado tiene el formato de una cadena.
arrays.index_to_str([1, 3, 2], 2) // "2"
cast.as_bool
cast.as_bool(string_or_int)
Descripción
La función convierte un valor entero o de cadena en un valor booleano. Las llamadas a funciones con valores que no se pueden convertir devolverán FALSE. Devuelve TRUE solo para el número entero 1 y la cadena "true" (sin distinguir entre mayúsculas y minúsculas).
Tipos de datos de parámetros
INT|STRING
Tipo de devolución
BOOL
Códigos de ejemplo
Ejemplo 1
En este ejemplo se muestra cómo convertir una cadena no booleana
cast.as_bool("123") = false
Ejemplo 2
Número entero verdadero (1)
cast.as_bool(1) = true
Ejemplo 3
Cadena verdadera
cast.as_bool("true") = true
Ejemplo 4
Cadena verdadera con mayúscula
cast.as_bool("TRUE") = true
Ejemplo 5
Número entero negativo
cast.as_bool(0-1) = false
Ejemplo 6
Número entero falso (0)
cast.as_bool(0) = false
Ejemplo 7
cadena vacía
cast.as_bool("") = false
cast.as_float
cast.as_float(string_to_cast)
Descripción
Convierte una cadena numérica en un número de coma flotante. Las llamadas a funciones con valores que no se pueden convertir devuelven 0. Los números de coma flotante mantienen la precisión hasta 7 decimales.
Tipos de datos de parámetros
STRING
Tipo de devolución
FLOAT
Códigos de ejemplo
Ejemplo 1
Al convertir una cadena no numérica, se devuelve 0.
cast.as_float("str") = 0.0000000
Ejemplo 2
Si se convierte una cadena vacía, se devuelve 0.
cast.as_float("") = 0.0000000
Ejemplo 3
Al convertir una cadena numérica válida, se devuelve un valor flotante.
cast.as_float("1.012345678") = 1.0123456
cast.as_string
cast.as_string(int_or_bytes_or_bool, optional_default_string)
Descripción
La función cast.as_string
transforma un valor INT
, BYTES
o BOOL
en su representación de cadena. Puedes proporcionar un argumento default_string
opcional para gestionar los casos en los que la conversión falla. Si omite el argumento default_string
o si la entrada es una secuencia de bytes UTF-8
o BASE64
no válida, la función devuelve una cadena vacía.
Tipos de datos de parámetros
INT|BYTES|BOOL
, STRING
Tipo de devolución
STRING
Códigos de ejemplo
Conversión de entero a cadena
La función convierte el entero 123
en la cadena "123"
.
cast.as_string(123) = "123"
Conversión de flotante a cadena
La función convierte el número de coma flotante 2.25
en la cadena "2.25"
.
cast.as_string(2.25) = "2.25"
Conversión de bytes a cadena
La función convierte el valor binario sin formato b'01
en la cadena "\x01"
.
cast.as_string(b'01, "") = "\x01"
Conversión de booleano a cadena
La función convierte el valor booleano true
en la cadena "true"
.
cast.as_string(true, "") = "true"
Error de conversión (se usa la cadena proporcionada opcionalmente)
La función usa de forma predeterminada la cadena "casting error"
cuando el valor proporcionado no es válido.
cast.as_string(9223372036854775808, "casting error") = "casting error"
huella digital
hash.fingerprint2011(byteOrString)
Descripción
Esta función calcula el hash fingerprint2011
de una secuencia de bytes o una cadena de entrada. Esta función devuelve un valor INT
sin signo en el intervalo [2, 0xFFFFFFFFFFFFFFFF]
.
Tipos de datos de parámetros
BTYE
, STRING
Tipo de devolución
INT
Código de ejemplo
id_fingerprint = hash.fingerprint2011("user123")
grupo
group(field1, field2, field3, ...)
Descripción
Agrupa los campos de un tipo similar en una variable de marcador de posición.
En la búsqueda de UDM, los campos agrupados se usan para buscar en varios campos de un tipo similar. La función de grupo es similar a los campos agrupados, pero te permite seleccionar los campos que quieres agrupar para activar una detección. Puedes usar la función de grupo para recoger información sobre una entidad específica (por ejemplo, un nombre de host, una dirección IP o un ID de usuario) en diferentes tipos de sustantivo.
Códigos de ejemplo
Ejemplo 1
Agrupa todas las direcciones IP y proporciona un recuento descendente de la dirección IP más frecuente en el periodo analizado.
$ip = group(principal.ip, about.ip, target.ip)
$ip != ""
match:
$ip
outcome:
$count = count_distinct(metadata.id)
order:
$count desc
hash.sha256
hash.sha256(string)
Descripción
Devuelve un hash SHA-256 de la cadena de entrada.
Tipos de datos de parámetros
STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En este ejemplo se muestra el hash SHA-256 cuando la entrada es una cadena válida.
hash.sha256("str") = "8c25cb3686462e9a86d2883c5688a22fe738b0bbc85f458d2d2b5f3f667c6d5a"
Ejemplo 2
En este ejemplo se muestra el hash SHA-256 cuando la entrada es una cadena vacía.
hash.sha256("") = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
math.abs
math.abs(numericExpression)
Descripción
Devuelve el valor absoluto de una expresión entera o flotante.
Tipos de datos de parámetros
NUMBER
Tipo de devolución
NUMBER
Códigos de ejemplo
Ejemplo 1
Este ejemplo devuelve True si el evento se ha producido más de 5 minutos después de la hora especificada (en segundos desde la época Unix), independientemente de si el evento se ha producido antes o después de la hora especificada. Una llamada a math.abs
no puede depender de
varias variables ni marcadores de posición. Por ejemplo, no puedes sustituir el valor de tiempo codificado 1643687343 del ejemplo siguiente por $e2.metadata.event_timestamp.seconds
.
300 < math.abs($e1.metadata.event_timestamp.seconds - 1643687343)
math.ceil
math.ceil(number)
Descripción
Devuelve el número entero más pequeño que no sea inferior al número dado (redondeo hacia arriba). Devuelve 0 si la entrada es nula o demasiado grande para caber en un int64.
Tipos de datos de parámetros
FLOAT
Tipo de devolución
INT
Códigos de ejemplo
En esta sección se incluyen ejemplos de uso de math.ceil
.
Ejemplo 1
En este ejemplo se devuelve el valor superior de un número entero.
math.ceil(2.000000) = 2
Ejemplo 2
En este ejemplo se devuelve el redondeo hacia arriba de un número negativo.
math.ceil(0-1.200000) = -1
Ejemplo 3
En este ejemplo se devuelve 0 como el valor de techo de un número demasiado grande para un entero de 64 bits.
math.ceil(184467440737095516160.0) = 0
math.floor
math.floor(float_val)
Descripción
Devuelve el valor entero más grande que no sea mayor que el valor proporcionado (redondeo hacia abajo). Devuelve 0 si la entrada es nula o demasiado grande para caber en un int64.
Tipos de datos de parámetros
FLOAT
Tipo de devolución
INT
Códigos de ejemplo
Ejemplo 1
En este ejemplo se muestra un caso con un número positivo.
math.floor(1.234568) = 1
Ejemplo 2
En este ejemplo se muestra un caso con un número negativo.
math.floor(0-1.234568) = -2
Ejemplo 3
En este ejemplo se muestra un caso cero.
math.floor(0.000000) = 0
math.geo_distance
math.geo_distance(longitude1, latitude1, longitude2, latitude2))
Descripción
Devuelve la distancia entre dos ubicaciones geográficas (coordenadas) en metros. Devuelve -1 si las coordenadas no son válidas.
Tipos de datos de parámetros
FLOAT
, FLOAT
, FLOAT
, FLOAT
Tipo de devolución
FLOAT
Códigos de ejemplo
Ejemplo 1
En el siguiente ejemplo se devuelve la distancia cuando todos los parámetros son coordenadas válidas:
math.geo_distance(-122.020287, 37.407574, -122.021810, 37.407574) = 134.564318
Ejemplo 2
En el siguiente ejemplo se devuelve la distancia cuando uno de los parámetros es una coordenada truncada:
math.geo_distance(-122.000000, 37.407574, -122.021810, 37.407574) = 1926.421905
Ejemplo 3
En el siguiente ejemplo, se devuelve -1
cuando uno de los parámetros es una coordenada no válida:
math.geo_distance(0-122.897680, 37.407574, 0-122.021810, 97.407574) = -1.000000
Ejemplo 4
En el siguiente ejemplo se devuelve 0
cuando las coordenadas son las mismas:
math.geo_distance(-122.897680, 37.407574, -122.897680, 37.407574) = 0.000000
math.is_increasing
math.is_increasing(num1, num2, num3)
Descripción
Toma una lista de valores numéricos (enteros o dobles) y devuelve True
si los valores están en orden ascendente y False
en caso contrario.
Tipos de datos de parámetros
INT|FLOAT
, INT|FLOAT
, INT|FLOAT
Tipo de devolución
BOOL
Códigos de ejemplo
Ejemplo 1
En este ejemplo se incluyen valores similares a marcas de tiempo en segundos.
math.is_increasing(1716769112, 1716769113, 1716769114) = true
Ejemplo 2
Este ejemplo incluye un valor double negativo, un valor INT64 cero y un valor INT64 positivo.
math.is_increasing(-1.200000, 0, 3) = true
Ejemplo 3
Este ejemplo incluye un valor doble negativo, un valor INT64 cero y un valor INT64 negativo.
math.is_increasing(0-1.200000, 0, 0-3) = false
Ejemplo 4
En este ejemplo se incluyen dos números negativos con decimales y un valor INT64 cero.
math.is_increasing(0-1.200000, 0-1.50000, 0) = false
Ejemplo 5
En este ejemplo se incluye un número de coma flotante negativo y dos valores iguales.
math.is_increasing(0-1.200000, 0, 0) = false
math.log
math.log(numericExpression)
Descripción
Devuelve el valor del logaritmo natural de una expresión entera o flotante.
Tipos de datos de parámetros
NUMBER
Tipo de devolución
NUMBER
Códigos de ejemplo
Ejemplo 1
math.log($e1.network.sent_bytes) > 20
math.pow
math.pow(base, exponent)
Descripción
Devuelve el valor del primer argumento elevado a la potencia del segundo argumento. Devuelve 0 en caso de desbordamiento.
Tipos de datos de parámetros
base: INT|FLOAT
exponente: INT|FLOAT
Tipo de devolución
FLOAT
Códigos de ejemplo
Ejemplo 1
En este ejemplo se muestra un caso de número entero.
math.pow(2, 2) // 4.00
Ejemplo 2
En este ejemplo se muestra un caso base de fracción.
math.pow(2.200000, 3) // 10.648
Ejemplo 3
En este ejemplo se muestra una base de fracción y un caso de potencia.
math.pow(2.200000, 1.200000) // 2.575771
Ejemplo 4
En este ejemplo se muestra un caso de potencia negativa.
math.pow(3, 0-3) // 0.037037
Ejemplo 5
En este ejemplo se muestra un caso de potencia fraccionaria.
math.pow(3, 0-1.200000) // 0.267581
Ejemplo 6
En este ejemplo se muestra un caso base negativo.
math.pow(0-3, 0-3) // -0.037037
Ejemplo 7
En este ejemplo se muestra un caso base cero.
math.pow(0, 3) // 0
Ejemplo 8
En este ejemplo se muestra un caso de potencia cero.
math.pow(9223372036854775807, 0) // 1
Ejemplo 9
En este ejemplo se muestra un caso base grande.
math.pow(9223372036854775807, 1.200000) // 57262152889751593549824
math.random
math.random()
Descripción
Genera un valor pseudoaleatorio de tipo DOUBLE en el intervalo de [0, 1)
, incluido el 0 y excluido el 1.
Tipo de devolución
FLOAT
Códigos de ejemplo
En el siguiente ejemplo se comprueba si el valor aleatorio está en el intervalo [0, 1)
.
none
if(math.random() >= 0 and math.random() < 1) = true
math.round
math.round(numericExpression, decimalPlaces)
Descripción
Devuelve un valor redondeado al número entero más próximo o al número de decimales especificado.
Tipos de datos de parámetros
NUMBER
Tipo de devolución
NUMBER
Códigos de ejemplo
math.round(10.7) // returns 11
math.round(1.2567, 2) // returns 1.25
math.round(0-10.7) // returns -11
math.round(0-1.2) // returns -1
math.round(4) // returns 4, math.round(integer) returns the integer
math.sqrt
math.sqrt(number)
Descripción
Devuelve la raíz cuadrada del número especificado. Devuelve 0 en caso de números negativos.
Tipos de datos de parámetros
INT|FLOAT
Tipo de devolución
FLOAT
Códigos de ejemplo
Ejemplo 1
En este ejemplo se devuelve la raíz cuadrada de un argumento int.
math.sqrt(3) = 1.732051
Ejemplo 2
En este ejemplo se devuelve la raíz cuadrada de un argumento int negativo.
math.sqrt(-3) = 0.000000
Ejemplo 3
Este ejemplo devuelve la raíz cuadrada de un argumento cero.
math.sqrt(0) = 0.000000
Ejemplo 4
En este ejemplo se devuelve la raíz cuadrada de un argumento de tipo float.
math.sqrt(9.223372) = 3.037000
Ejemplo 5
En este ejemplo se devuelve la raíz cuadrada de un argumento flotante negativo.
math.sqrt(0-1.200000) = 0.000000
métricas
Las funciones de métricas pueden agregar grandes cantidades de datos históricos. Puedes usarlo en tu regla con metrics.functionName()
en la sección de resultados.
Para obtener más información, consulta Métricas de YARA-L.
net.ip_in_range_cidr
net.ip_in_range_cidr(ipAddress, subnetworkRange)
Descripción
Devuelve true
cuando la dirección IP proporcionada está dentro de la subred especificada.
Puede usar YARA-L para buscar eventos de UDM en todas las direcciones IP de una subred mediante la instrucción net.ip_in_range_cidr()
.
Se admiten tanto IPv4 como IPv6.
Para buscar en un intervalo de direcciones IP, especifica un campo de UDM de IP y un intervalo CIDR. YARA-L puede gestionar campos de direcciones IP singulares y repetidos.
Para buscar en un intervalo de direcciones IP, especifica un ip
campo de UDM y un intervalo de enrutamiento de interdominios sin clases (CIDR). YARA-L puede gestionar campos de direcciones IP singulares y repetidos.
Tipos de datos de parámetros
STRING
, STRING
Tipo de devolución
BOOL
Códigos de ejemplo
Ejemplo 1
Ejemplo de IPv4:
net.ip_in_range_cidr($e.principal.ip, "192.0.2.0/24")
Ejemplo 2
Ejemplo de IPv6:
net.ip_in_range_cidr($e.network.dhcp.yiaddr, "2001:db8::/32")
Para ver un ejemplo de regla que use la instrucción net.ip_in_range_cidr()
, consulta la regla de ejemplo en Evento único dentro de un intervalo de direcciones IP.
re.regex
Puedes definir la concordancia de expresiones regulares en YARA-L 2.0 con cualquiera de las siguientes sintaxis:
Usar la sintaxis de YARA-L: relacionado con eventos. A continuación se muestra una representación genérica de esta sintaxis:
$e.field = /regex/
Usar la sintaxis de YARA-L: como una función que toma los siguientes parámetros:
- Campo al que se aplica la expresión regular.
- Expresión regular especificada como una cadena.
A continuación se muestra una representación genérica de esta sintaxis:
re.regex($e.field, `regex`)
Descripción
Esta función devuelve true
si la cadena contiene una subcadena que coincide con la expresión regular proporcionada. No es necesario añadir .*
al principio ni al final de la expresión regular.
Notas
- Para que coincida exactamente con la cadena o solo con un prefijo o un sufijo, incluye los caracteres de anclaje
^
(inicial) y$
(final) en la expresión regular. Por ejemplo,/^full$/
coincide exactamente con"full"
, mientras que/full/
podría coincidir con"fullest"
,"lawfull"
y"joyfully"
. - Si el campo de UDM incluye caracteres de salto de línea,
regexp
solo coincide con la primera línea del campo de UDM. Para aplicar la coincidencia completa de los campos de UDM, añada un(?s)
a la expresión regular. Por ejemplo, sustituya/.*allUDM.*/
por/(?s).*allUDM.*/
. - Puedes usar el modificador
nocase
después de las cadenas para indicar que la búsqueda debe ignorar las mayúsculas y minúsculas.
Tipos de datos de parámetros
STRING
, STRING
Tipos de expresiones de parámetros
ANY
, ANY
Tipo de devolución
BOOL
Códigos de ejemplo
Ejemplo 1
// Equivalent to $e.principal.hostname = /google/
re.regex($e.principal.hostname, "google")
re.capture
re.capture(stringText, regex)
Descripción
Captura (extrae) datos de una cadena mediante el patrón de expresión regular proporcionado en el argumento.
Esta función toma dos argumentos:
stringText
: la cadena original en la que se va a buscar.regex
: la expresión regular que indica el patrón que se va a buscar.
La expresión regular puede contener 0 o 1 grupo de captura entre paréntesis. Si la expresión regular contiene 0 grupos de captura, la función devuelve la primera subcadena coincidente completa. Si la expresión regular contiene un grupo de captura, devuelve la primera subcadena coincidente del grupo de captura. Si se definen dos o más grupos de captura, se devuelve un error del compilador.
Tipos de datos de parámetros
STRING
, STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En este ejemplo, si $e.principal.hostname
contiene "aaa1bbaa2", se cumpliría la condición, ya que la función devuelve la primera instancia. Este ejemplo no tiene grupos de captura.
"aaa1" = re.capture($e.principal.hostname, "a+[1-9]")
Ejemplo 2
En este ejemplo se captura todo lo que hay después del símbolo @ en un correo. Si el campo $e.network.email.from
es test@google.com
, el ejemplo devuelve google.com
. El siguiente ejemplo contiene un grupo de captura.
"google.com" = re.capture($e.network.email.from , "@(.*)")
Ejemplo 3
Si la expresión regular no coincide con ninguna subcadena del texto, la función devuelve una cadena vacía. Puede omitir los eventos en los que no se produce ninguna coincidencia excluyendo la cadena vacía, lo que es especialmente importante cuando usa re.capture()
con una desigualdad:
// Exclude the empty string to omit events where no match occurs.
"" != re.capture($e.network.email.from , "@(.*)")
// Exclude a specific string with an inequality.
"google.com" != re.capture($e.network.email.from , "@(.*)")
re.replace
re.replace(stringText, replaceRegex, replacementText)
Descripción
Realiza una sustitución de expresiones regulares.
Esta función toma tres argumentos:
stringText
: la cadena original.replaceRegex
: la expresión regular que indica el patrón que se va a buscar.replacementText
: el texto que se insertará en cada coincidencia.
Devuelve una cadena nueva derivada de la cadena stringText
original, donde todas las subcadenas que coinciden con el patrón de replaceRegex
se sustituyen por el valor de replacementText
. Puedes usar dígitos de escape con barras inversas (\1
a \9
) dentro de replacementText
para insertar texto que coincida con el grupo entre paréntesis correspondiente en el patrón replaceRegex
. Usa \0
para referirte a todo el texto que coincida.
La función sustituye las coincidencias que no se superponen y prioriza la sustitución de la primera coincidencia encontrada. Por ejemplo, re.replace("banana", "ana", "111")
devuelve la cadena "b111na".
Tipos de datos de parámetros
STRING
, STRING
, STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En este ejemplo, se captura todo lo que hay después del símbolo @
en un correo, se sustituye com
por org
y, a continuación, se devuelve el resultado. Fíjate en el uso de funciones anidadas.
"email@google.org" = re.replace($e.network.email.from, "com", "org")
Ejemplo 2
En este ejemplo se usan dígitos de escape con barras inversas en el argumento replacementText
para hacer referencia a las coincidencias del patrón replaceRegex
.
"test1.com.google" = re.replace(
$e.principal.hostname, // holds "test1.test2.google.com"
"test2\.([a-z]*)\.([a-z]*)",
"\\2.\\1" // \\1 holds "google", \\2 holds "com"
)
Ejemplo 3
Ten en cuenta los siguientes casos cuando trabajes con cadenas vacías y re.replace()
:
Uso de una cadena vacía como replaceRegex
:
// In the function call below, if $e.principal.hostname contains "name",
// the result is: 1n1a1m1e1, because an empty string is found next to
// every character in `stringText`.
re.replace($e.principal.hostname, "", "1")
Para sustituir una cadena vacía, puedes usar "^$"
como replaceRegex
:
// In the function call below, if $e.principal.hostname contains the empty
// string, "", the result is: "none".
re.replace($e.principal.hostname, "^$", "none")
sample_rate
optimization.sample_rate(byteOrString, rateNumerator, rateDenominator)
Descripción
Esta función determina si se debe incluir un evento en función de una estrategia de muestreo determinista. Esta función devuelve lo siguiente:
true
para una fracción de los valores de entrada, equivalente a (rateNumerator
/rateDenominator
), que indica que el evento debe incluirse en la muestra.false
indica que el evento no debe incluirse en la muestra.
Esta función es útil en escenarios de optimización en los que solo quiere procesar un subconjunto de eventos. Equivalente a:
hash.fingerprint2011(byteOrString) % rateDenominator < rateNumerator
Tipos de datos de parámetros
- byteOrString: expresión que da como resultado un
BYTE
o unSTRING
. - rateNumerator: 'INT'
- rateDenominator: 'INT'
Tipo de devolución
BOOL
Código de ejemplo
events:
$e.metadata.event_type = "NETWORK_CONNECTION"
$asset_id = $e.principal.asset.asset_id
optimization.sample_rate($e.metadata.id, 1, 5) // Only 1 out of every 5 events
match:
$asset_id over 1h
outcome:
$event_count = count_distinct($e.metadata.id)
// estimate the usage by multiplying by the inverse of the sample rate
$usage_past_hour = sum(5.0 * $e.network.sent_bytes)
condition:
// Requiring a certain number of events after sampling avoids bias (e.g. a
// device with just 1 connection will still show up 20% of the time and
// if we multiply that traffic by 5, we'll get an incorrect estimate)
$e and ($usage_past_hour > 1000000000) and $event_count >= 100
strings.base64_decode
strings.base64_decode(encodedString)
Descripción
Devuelve una cadena que contiene la versión decodificada en Base64 de la cadena codificada.
Esta función toma una cadena codificada en base64 como argumento. Si encodedString
no es una cadena codificada en Base64 válida, la función devuelve encodedString
sin cambios.
Tipos de datos de parámetros
STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
"test" = strings.base64_decode($e.principal.domain.name)
strings.coalesce
strings.coalesce(a, b, c, ...)
Descripción
Esta función toma un número ilimitado de argumentos y devuelve el valor de la primera expresión que no se evalúa como una cadena vacía (por ejemplo, "valor distinto de cero"). Si todos los argumentos dan como resultado una cadena vacía, la llamada a la función devuelve una cadena vacía.
Los argumentos pueden ser literales, campos de eventos o llamadas a funciones. Todos los argumentos deben ser del tipo STRING
. Si algún argumento es un campo de evento, los atributos deben ser del mismo evento.
Tipos de datos de parámetros
STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En el siguiente ejemplo se incluyen variables de cadena como argumentos. La condición se evalúa como verdadera cuando (1) $e.network.email.from
es suspicious@gmail.com
o (2) $e.network.email.from
está vacío y $e.network.email.to
es suspicious@gmail.com
.
"suspicious@gmail.com" = strings.coalesce($e.network.email.from, $e.network.email.to)
Ejemplo 2
En el siguiente ejemplo se llama a la función coalesce
con más de dos argumentos. Esta condición compara la primera dirección IP no nula del evento $e
con los valores de la lista de referencia ip_watchlist
. El orden en el que se combinan los argumentos en esta llamada es el mismo que el orden en el que se enumeran en la condición de la regla:
$e.principal.ip
se evalúa primero.$e.src.ip
se evalúa a continuación.$e.target.ip
se evalúa a continuación.- Por último, la cadena "No IP" se devuelve como valor predeterminado si los campos
ip
anteriores no se han definido.
strings.coalesce($e.principal.ip, $e.src.ip, $e.target.ip, "No IP") in %ip_watchlist
Ejemplo 3
En el siguiente ejemplo se intenta combinar principal.hostname
de los eventos $e1
y $e2
. Devolverá un error del compilador porque los argumentos son variables de evento diferentes.
// returns a compiler error
"test" = strings.coalesce($e1.principal.hostname, $e2.principal.hostname)
strings.concat
strings.concat(a, b, c, ...)
Descripción
Devuelve la concatenación de un número ilimitado de elementos, cada uno de los cuales puede ser una cadena, un número entero o un número de coma flotante.
Si algún argumento es un campo de evento, los atributos deben ser del mismo evento.
Tipos de datos de parámetros
STRING
, FLOAT
, INT
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En el siguiente ejemplo se incluyen una variable de cadena y una variable de número entero como argumentos. Tanto principal.hostname
como principal.port
proceden del mismo evento, $e
, y se concatenan para devolver una cadena.
"google:80" = strings.concat($e.principal.hostname, ":", $e.principal.port)
Ejemplo 2
En el siguiente ejemplo se incluyen una variable de cadena y un literal de cadena como argumentos.
"google-test" = strings.concat($e.principal.hostname, "-test") // Matches the event when $e.principal.hostname = "google"
Ejemplo 3
En el siguiente ejemplo se incluyen una variable de cadena y un literal de coma flotante como argumentos. Cuando se representan como cadenas, los números flotantes que son números enteros se formatean sin la coma decimal (por ejemplo, 1,0 se representa como "1"). Además, los números de coma flotante que superen los dieciséis decimales se truncarán en el decimosexto decimal.
"google2.5" = strings.concat($e.principal.hostname, 2.5)
Ejemplo 4
En el siguiente ejemplo se incluyen una variable de cadena, un literal de cadena, una variable de número entero y un literal de número de coma flotante como argumentos. Todas las variables proceden del mismo evento, $e
, y se concatenan con los literales para devolver una cadena.
"google-test802.5" = strings.concat($e.principal.hostname, "-test", $e.principal.port, 2.5)
Ejemplo 5
En el siguiente ejemplo se intenta concatenar principal.port del evento $e1
con principal.hostname
del evento $e2
. Devolverá un error del compilador porque los argumentos son variables de evento diferentes.
// Will not compile
"test" = strings.concat($e1.principal.port, $e2.principal.hostname)
strings.contains
strings.contains( str, substr )
Descripción
Devuelve el valor "true" si una cadena determinada contiene la subcadena especificada. De lo contrario, devuelve el valor "falso".
Tipos de datos de parámetros
STRING
, STRING
Tipo de devolución
BOOL
Códigos de ejemplo
Ejemplo 1
Este ejemplo devuelve true porque la cadena tiene la subcadena "is".
strings.contains("thisisastring", "is") = true
Ejemplo 2
Este ejemplo devuelve el valor false porque la cadena no tiene la subcadena "that".
strings.contains("thisisastring", "that") = false
strings.count_substrings
strings.count_substrings(string_to_search_in, substring_to_count)
Descripción
Cuando se le proporciona una cadena y una subcadena, devuelve un int64 con el número de veces que aparece la subcadena en la cadena sin solaparse.
Tipos de datos de parámetros
STRING
, STRING
Tipo de devolución
INT
Códigos de ejemplo
En esta sección se incluyen ejemplos que calculan el número de veces que aparece una subcadena en una cadena determinada.
Ejemplo 1
En este ejemplo se usa una cadena no nula y un carácter de subcadena único no nulo.
strings.count_substrings("this`string`has`four`backticks", "`") = 4
Ejemplo 2
En este ejemplo se usa una cadena no nula y una subcadena no nula de más de un carácter.
strings.count_substrings("str", "str") = 1
Ejemplo 3
En este ejemplo se usa una cadena no nula y una subcadena vacía.
strings.count_substrings("str", "") = 0
Ejemplo 4
En este ejemplo se usa una cadena vacía y una subcadena no nula de más de un carácter.
strings.count_substrings("", "str") = 0
Ejemplo 5
En este ejemplo se usa una cadena vacía y una subcadena vacía.
strings.count_substrings("", "") = 0
Ejemplo 6
En este ejemplo se usa una cadena no nula y una subcadena no nula que tiene más de un carácter y más de una aparición.
strings.count_substrings("fooABAbarABAbazABA", "AB") = 3
Ejemplo 7
En este ejemplo se usa una cadena no nula y una subcadena no nula que tiene más de un carácter y más de una aparición. Destaca la limitación con las coincidencias de subcadenas superpuestas.
strings.count_substrings("ABABABA", "ABA") = 2
strings.extract_domain
strings.extract_domain(url_string)
Descripción
Extrae el dominio de una cadena.
Tipos de datos de parámetros
STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En este ejemplo se muestra una cadena vacía
strings.extract_domain("") = ""
Ejemplo 2
cadena aleatoria, no una URL
strings.extract_domain("1234") = ""
Ejemplo 3
Varias barras invertidas
strings.extract_domain("\\\\") = ""
Ejemplo 4
Se gestionan correctamente los caracteres no alfabéticos
strings.extract_domain("http://例子.卷筒纸.中国") = "卷筒纸.中国"
Ejemplo 5
Gestión de URIs
strings.extract_domain("mailto:?to=&subject=&body=") = ""
Ejemplo 6
Hay varios caracteres antes de la URL real
strings.extract_domain(" \t !$5*^)&dahgsdfs;http://www.google.com") = "google.com"
Ejemplo 7
caracteres especiales en URIs #
strings.extract_domain("test#@google.com") = ""
Ejemplo 8
Caracteres especiales en la URL #
strings.extract_domain("https://test#@google.com") = ""
Ejemplo 9
caso de prueba positivo
strings.extract_domain("https://google.co.in") = "google.co.in"
strings.extract_hostname
strings.extract_hostname(string)
Descripción
Extrae el nombre de host de una cadena. Esta función distingue entre mayúsculas y minúsculas.
Tipos de datos de parámetros
STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En este ejemplo, se devuelve una cadena vacía.
strings.extract_hostname("") = ""
Ejemplo 2
cadena aleatoria, no una URL
strings.extract_hostname("1234") = "1234"
Ejemplo 3
varias barras inversas
strings.extract_hostname("\\\\") = ""
Ejemplo 4
Se gestionan correctamente los caracteres que no son ingleses
strings.extract_hostname("http://例子.卷筒纸.中国") = "例子.卷筒纸.中国"
Ejemplo 5
Gestión de URIs
strings.extract_hostname("mailto:?to=&subject=&body=") = "mailto"
Ejemplo 6
Hay varios caracteres antes de la URL real
strings.extract_hostname(" \t !$5*^)&dahgsdfs;http://www.google.com") = "www.google.com"
Ejemplo 7
caracteres especiales en URIs #
strings.extract_hostname("test#@google.com") = "test"
Ejemplo 8
Caracteres especiales en la URL #
strings.extract_hostname("https://test#@google.com") = "test"
strings.from_base64
strings.from_base64(base64_encoded_string)
Descripción
La función convierte un valor STRING
codificado en base64 en un valor BYTES
binario sin formato. Las llamadas de función con valores que no se pueden convertir devuelven un BYTES
vacío de forma predeterminada.
Tipos de datos de parámetros
STRING
Tipo de devolución
BYTES
Códigos de ejemplo
Conversión de una cadena codificada en Base64 a bytes
La función convierte una cadena codificada en base64 en su representación de bytes binarios sin formato.
strings.from_base64("AAAAAG+OxVhtAm+d2sVuny/hW4oAAAAAAQAAAM0AAAA=") = b'000000006f8ec5586d026f9ddac56e9f2fe15b8a0000000001000000cd000000
Error al convertir (se asignan bytes vacíos de forma predeterminada)
La función tiene como valor predeterminado bytes vacíos si el valor proporcionado no es válido.
strings.from_base64("invalid-value") = b'
strings.from_hex
strings.from_hex(hex_string)
Descripción
Devuelve los bytes asociados a la cadena hexadecimal proporcionada.
Tipos de datos de parámetros
STRING
Tipo de devolución
BYTES
Códigos de ejemplo
Obtiene los bytes asociados a una cadena hexadecimal determinada.
Ejemplo 1
En este ejemplo se muestran conversiones de caracteres no hexadecimales.
strings.from_hex("str") // returns empty bytes
Ejemplo 2
En este ejemplo se muestra una entrada con una cadena vacía.
strings.from_hex("") // returns empty bytes
Ejemplo 3
En este ejemplo se muestra la conversión de una cadena hexadecimal.
strings.from_hex("1234") // returns 1234 bytes
Ejemplo 4
En este ejemplo se muestra la conversión de caracteres que no son ASCII.
strings.from_hex("筒纸.中国") // returns empty bytes
strings.ltrim
strings.ltrim(string_to_trim, cutset)
Descripción
Quita los espacios en blanco iniciales de una cadena determinada. Esta función elimina los caracteres iniciales presentes en ese conjunto de caracteres.
Tipos de datos de parámetros
STRING
, STRING
Tipo de devolución
STRING
Códigos de ejemplo
A continuación, se muestran algunos ejemplos de casos prácticos.
Ejemplo 1
En este ejemplo se usan los mismos argumentos primero y segundo.
strings.ltrim("str", "str") = ""
Ejemplo 2
En este ejemplo se usa una cadena vacía como segundo argumento.
strings.ltrim("str", "") = "str"
Ejemplo 3
En este ejemplo se usa una cadena vacía como primer argumento y una cadena como segundo argumento.
strings.ltrim("", "str") = ""
Ejemplo 4
En este ejemplo se usan cadenas que contienen espacios en blanco y una cadena como segundo argumento.
strings.ltrim("a aastraa aa ", " a") = "straa aa "
strings.reverse
strings.reverse(STRING)
Descripción
Devuelve una cadena que es la inversa de la cadena de entrada.
Tipos de datos de parámetros
STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En el siguiente ejemplo se envía una cadena corta.
strings.reverse("str") = "rts" // The function returns 'rts'.
Ejemplo 2
En el siguiente ejemplo se pasa una cadena vacía.
strings.reverse("") = ""
Ejemplo 3
En el siguiente ejemplo se pasa un palíndromo.
strings.reverse("tacocat") = "tacocat"
strings.rtrim
strings.rtrim(string_to_trim, cutset)
Descripción
Recorta los espacios en blanco finales de una cadena determinada. Quita los caracteres finales que estén presentes en ese conjunto de caracteres.
Tipos de datos de parámetros
STRING
, STRING
Tipo de devolución
STRING
Códigos de ejemplo
A continuación, se muestran algunos ejemplos de casos prácticos.
Ejemplo 1
En el siguiente ejemplo, se pasa la misma cadena como primer y segundo argumento.
strings.rtrim("str", "str") = ""
Ejemplo 2
En el siguiente ejemplo se pasa una cadena vacía como segundo argumento.
strings.rtrim("str", "") = "str"
Ejemplo 3
En el siguiente ejemplo, se pasa una cadena vacía como primer argumento y una cadena no vacía como segundo argumento.
strings.rtrim("", "str") = ""
Ejemplo 4
En el siguiente ejemplo, se pasa una cadena que contiene espacios en blanco como primer argumento y una cadena no vacía como segundo argumento.
strings.rtrim("a aastraa aa ", " a") = "a aasstr"
strings.to_lower
strings.to_lower(stringText)
Descripción
Esta función toma una cadena de entrada y devuelve una cadena después de cambiar todos los caracteres a minúsculas.
Tipos de datos de parámetros
STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En el siguiente ejemplo se devuelve true
.
"test@google.com" = strings.to_lower($e.network.email.to)
strings.to_upper
strings.to_upper(string_val)
Descripción
Devuelve la cadena original con todos los caracteres alfabéticos en mayúsculas.
Tipos de datos de parámetros
STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En el siguiente ejemplo se devuelve el argumento proporcionado en mayúsculas.
strings.to_upper("example") = "EXAMPLE"
strings.trim
strings.trim(string_to_trim, cutset)
Descripción
Elimina los espacios en blanco iniciales y finales de una cadena determinada. También elimina los caracteres no deseados (especificados por el argumento cutset) de la cadena de entrada.
Tipos de datos de parámetros
STRING
, STRING
Tipo de devolución
STRING
Códigos de ejemplo
A continuación, se muestran algunos ejemplos de casos prácticos.
Ejemplo 1
En el siguiente ejemplo, se pasa la misma cadena como cadena de entrada y como cutset, lo que da como resultado una cadena vacía.
strings.trim("str", "str") // ""
Ejemplo 2
En el siguiente ejemplo, se pasa una cadena vacía como cutset, lo que da como resultado la cadena original str porque no se ha especificado ningún carácter en cutset para eliminar.
strings.trim("str", "") = "str"
Ejemplo 3
En el siguiente ejemplo, la función devuelve una cadena vacía porque la cadena de entrada ya está vacía y no hay caracteres que quitar.
strings.trim("", "str") = ""
Ejemplo 4
En el siguiente ejemplo, la función devuelve str porque la función trim elimina lo siguiente:
- Espacio en blanco final en "a aastraa aa "
- los caracteres especificados en cutset (espacio, a)
strings.trim("a aastraa aa ", " a") = "str"
strings.url_decode
strings.url_decode(url_string)
Descripción
Dada una cadena de URL, decodifica los caracteres de escape y gestiona los caracteres UTF-8 que se hayan codificado. Devuelve una cadena vacía si no se puede decodificar.
Tipos de datos de parámetros
STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En este ejemplo se muestra un caso de prueba positivo.
strings.url_decode("three%20nine%20four") = "three nine four"
Ejemplo 2
En este ejemplo se muestra un caso de cadena vacía.
strings.url_decode("") // ""
Ejemplo 3
En este ejemplo se muestra cómo se gestionan los caracteres no alfabéticos.
strings.url_decode("%E4%B8%8A%E6%B5%B7%2B%E4%B8%AD%E5%9C%8B") // "上海+中國"
Ejemplo 4
En este ejemplo se muestra una decodificación de URL de muestra.
strings.url_decode("http://www.google.com%3Fparam1%3D%22+1+%3E+2+%22%26param2%3D2%3B") // 'http://www.google.com?param1="+1+>+2+"¶m2=2;'
timestamp.as_unix_seconds
timestamp.as_unix_seconds(timestamp [, time_zone])
Descripción
Esta función devuelve un número entero que representa el número de segundos transcurridos desde el inicio del registro de tiempo Unix para la cadena de marca de tiempo especificada.
timestamp
es una cadena que representa una marca de tiempo de época válida. El formato debe ser%F %T
.time_zone
es opcional y es una cadena que representa una zona horaria. Si se omite, el valor predeterminado esGMT
. Puedes especificar zonas horarias mediante literales de cadena. Las opciones son las siguientes:- El nombre de la base de datos TZ, por ejemplo,
America/Los_Angeles
. Para obtener más información, consulta la lista de zonas horarias de la base de datos tz en Wikipedia. - El desfase de la zona horaria con respecto a UTC, en formato
(+|-)H[H][:M[M]]
. Por ejemplo: "-08:00".
- El nombre de la base de datos TZ, por ejemplo,
A continuación, se muestran ejemplos de especificadores time_zone
válidos que puedes usar como segundo argumento de las funciones de extracción de tiempo:
"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"
Tipos de datos de parámetros
STRING
, STRING
Tipo de devolución
INT
Códigos de ejemplo
Ejemplo 1
Marca de tiempo de época válida
timestamp.as_unix_seconds("2024-02-22 10:43:00") = 1708598580
Ejemplo 2
Marca de tiempo de época válida con la zona horaria America/New_York
timestamp.as_unix_seconds("2024-02-22 10:43:00", "America/New_York") = 1708616580
timestamp.current_seconds
timestamp.current_seconds()
Descripción
Devuelve un número entero que representa la hora actual en segundos Unix. Es aproximadamente igual a la marca de tiempo de la detección y se basa en el momento en que se ejecuta la regla. Esta función es sinónimo de la función timestamp.now()
.
Tipos de datos de parámetros
NONE
Tipo de devolución
INT
Códigos de ejemplo
Ejemplo 1
En el siguiente ejemplo se devuelve true
si el certificado ha caducado hace más de 24 horas. Calcula la diferencia de tiempo restando los segundos Unix actuales y, a continuación, compara el resultado con el operador "mayor que".
86400 < timestamp.current_seconds() - $e.network.tls.certificate.not_after
timestamp.get_date
timestamp.get_date(unix_seconds [, time_zone])
Descripción
Esta función devuelve una cadena con el formato YYYY-MM-DD
, que representa el día en el que se encuentra una marca de tiempo.
unix_seconds
es un número entero que representa el número de segundos transcurridos desde el inicio del registro de tiempo Unix, como$e.metadata.event_timestamp.seconds
, o un marcador de posición que contiene ese valor.time_zone
es opcional y es una cadena que representa una zona horaria. Si se omite, el valor predeterminado es "GMT". Puedes especificar zonas horarias mediante literales de cadena. Las opciones son las siguientes:- El nombre de la base de datos de zonas horarias, por ejemplo, "America/Los_Angeles". Para obtener más información, consulta la columna"Nombre de la base de datos de zonas horarias" de esta página.
- El desfase de la zona horaria con respecto a UTC, en formato
(+|-)H[H][:M[M]]
. Por ejemplo: "-08:00".
A continuación, se muestran ejemplos de especificadores de time_zone válidos que puede usar como segundo argumento de las funciones de extracción de tiempo:
"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"
Tipos de datos de parámetros
INT
, STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En este ejemplo, se omite el argumento time_zone
, por lo que se utiliza el valor predeterminado "GMT".
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_date($ts) = "2024-02-19"
Ejemplo 2
En este ejemplo se usa un literal de cadena para definir el time_zone
.
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_date($ts, "America/Los_Angeles") = "2024-02-20"
timestamp.get_minute
timestamp.get_minute(unix_seconds [, time_zone])
Descripción
Esta función devuelve un número entero del intervalo [0, 59]
que representa el minuto.
unix_seconds
es un número entero que representa el número de segundos transcurridos desde el inicio del registro de tiempo Unix, como$e.metadata.event_timestamp.seconds
, o un marcador de posición que contiene ese valor.time_zone
es opcional y es una cadena que representa una zona horaria. Si se omite, el valor predeterminado es "GMT". Puedes especificar zonas horarias mediante literales de cadena. Las opciones son las siguientes:- El nombre de la base de datos de zonas horarias, por ejemplo, "America/Los_Angeles". Para obtener más información, consulta la columna"Nombre de la base de datos de zonas horarias" de esta página.
- El desfase de la zona horaria con respecto a UTC, en formato
(+|-)H[H][:M[M]]
. Por ejemplo: "-08:00".
A continuación, se muestran ejemplos de especificadores time_zone
válidos que puedes usar como segundo argumento de las funciones de extracción de tiempo:
"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"
Tipos de datos de parámetros
INT
, STRING
Tipo de devolución
INT
Códigos de ejemplo
Ejemplo 1
En este ejemplo, se omite el argumento time_zone
, por lo que se utiliza el valor predeterminado "GMT".
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_hour($ts) = 15
Ejemplo 2
En este ejemplo se usa un literal de cadena para definir el time_zone
.
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_hour($ts, "America/Los_Angeles") = 15
timestamp.get_hour
timestamp.get_hour(unix_seconds [, time_zone])
Descripción
Esta función devuelve un número entero del intervalo [0, 23]
que representa la hora.
unix_seconds
es un número entero que representa el número de segundos transcurridos desde el inicio del registro de tiempo Unix, como$e.metadata.event_timestamp.seconds
, o un marcador de posición que contiene ese valor.time_zone
es opcional y es una cadena que representa una zona horaria. Si se omite, el valor predeterminado es "GMT". Puedes especificar zonas horarias mediante literales de cadena. Las opciones son las siguientes:- El nombre de la base de datos de zonas horarias, por ejemplo, "America/Los_Angeles". Para obtener más información, consulta la columna"Nombre de la base de datos de zonas horarias" de esta página.
- El desfase de la zona horaria con respecto a UTC, en formato
(+|-)H[H][:M[M]]
. Por ejemplo: "-08:00".
A continuación, se muestran ejemplos de especificadores time_zone
válidos que puedes usar como segundo argumento de las funciones de extracción de tiempo:
"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"
Tipos de datos de parámetros
INT
, STRING
Tipo de devolución
INT
Códigos de ejemplo
Ejemplo 1
En este ejemplo, se omite el argumento time_zone
, por lo que se utiliza el valor predeterminado "GMT".
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_hour($ts) = 15
Ejemplo 2
En este ejemplo se usa un literal de cadena para definir el time_zone
.
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_hour($ts, "America/Los_Angeles") = 15
timestamp.get_day_of_week
timestamp.get_day_of_week(unix_seconds [, time_zone])
Descripción
Esta función devuelve un número entero del intervalo [1, 7]
que representa el día de la semana, empezando por el domingo. Por ejemplo, 1 = domingo y 2 = lunes.
unix_seconds
es un número entero que representa el número de segundos transcurridos desde el inicio del registro de tiempo Unix, como$e.metadata.event_timestamp.seconds
, o un marcador de posición que contiene ese valor.time_zone
es opcional y es una cadena que representa una zona horaria. Si se omite, el valor predeterminado es "GMT". Puedes especificar zonas horarias mediante literales de cadena. Las opciones son las siguientes:- El nombre de la base de datos de zonas horarias, por ejemplo, "America/Los_Angeles". Para obtener más información, consulta la columna"Nombre de la base de datos de zonas horarias" de esta página.
- El desfase de la zona horaria con respecto a UTC, en formato
(+|-)H[H][:M[M]]
. Por ejemplo: "-08:00".
A continuación, se muestran ejemplos de especificadores de time_zone válidos que puede usar como segundo argumento de las funciones de extracción de tiempo:
"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"
Tipos de datos de parámetros
INT
, STRING
Tipo de devolución
INT
Códigos de ejemplo
Ejemplo 1
En este ejemplo, se omite el argumento time_zone
, por lo que se utiliza el valor predeterminado "GMT".
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_day_of_week($ts) = 6
Ejemplo 2
En este ejemplo se usa un literal de cadena para definir el time_zone
.
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_day_of_week($ts, "America/Los_Angeles") = 6
timestamp.get_timestamp
timestamp.get_timestamp(unix_seconds, optional timestamp_format/time_granularity, optional timezone)
Descripción
Esta función devuelve una cadena con el formato YYYY-MM-DD
, que representa el día en el que se encuentra una marca de tiempo.
unix_seconds
es un número entero que representa el número de segundos transcurridos desde el inicio del registro de tiempo Unix, como$e.metadata.event_timestamp.seconds
, o un marcador de posición que contiene ese valor.timestamp_format
es opcional y es una cadena que representa el formato de la marca de tiempo. Si se omite, el valor predeterminado es%F %T
. Puede especificar el formato mediante una cadena de formato de fecha y hora o una de las siguientes granularidades de tiempo:SECOND
,MINUTE
,HOUR
,DATE
,WEEK
,MONTH
oYEAR
. Para ver más opciones de formato, consulta Formatear elementos de partes de fecha y hora.time_zone
es opcional y es una cadena que representa una zona horaria. Si se omite, el valor predeterminado esGMT
. Puedes especificar zonas horarias mediante literales de cadena. Las opciones son las siguientes:- Nombre de la base de datos de zonas horarias (TZ) de IANA. Por ejemplo,
America/Los_Angeles
. Para obtener más información, consulta la lista de zonas horarias de la base de datos tz en Wikipedia. - El desfase de la zona horaria con respecto a UTC, en formato
(+|-)H[H][:M[M]]
, por ejemplo: "-08:00".
- Nombre de la base de datos de zonas horarias (TZ) de IANA. Por ejemplo,
A continuación, se muestran ejemplos de especificadores time_zone
válidos que puedes usar como segundo argumento de las funciones de extracción de tiempo:
"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"
Tipos de datos de parámetros
INT
, STRING
, STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
En este ejemplo, se omite el argumento time_zone
, por lo que se utiliza el valor predeterminado GMT
.
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_timestamp($ts) = "2024-02-22 10:43:51"
Ejemplo 2
En este ejemplo se usa un literal de cadena para definir el time_zone
.
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_timestamp($ts, "%F %T", "America/Los_Angeles") = "2024-02-22 10:43:51"
Ejemplo 3
En este ejemplo se usa un literal de cadena para definir el timestamp_format
.
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_timestamp($ts, "%Y-%m", "GMT") = "2024-02"
Ejemplo 4
En este ejemplo se da formato a una marca de tiempo de Unix como una cadena con una granularidad de segundos.
timestamp.get_timestamp(1708598631, "SECOND", "GMT") = "2024-02-22 10:43:51"
Ejemplo 5
En este ejemplo, se da formato a una marca de tiempo de Unix como una cadena con una granularidad de minutos.
timestamp.get_timestamp(1708598631, "MINUTE", "GMT") = "2024-02-22 10:43"
Ejemplo 6
En este ejemplo se da formato a una marca de tiempo de Unix como una cadena con una granularidad de horas.
timestamp.get_timestamp(1708598631, "HOUR", "GMT") = "2024-02-22 10"
Ejemplo 7
En este ejemplo se da formato a una marca de tiempo de Unix como una cadena con una granularidad de un día.
timestamp.get_timestamp(1708598631, "DATE", "GMT") = "2024-02-22"
Ejemplo 8
En este ejemplo, se da formato a una marca de tiempo de Unix como una cadena con una granularidad de una semana.
timestamp.get_timestamp(1708598631, "WEEK", "GMT") = "2024-02-18"
Ejemplo 9
En este ejemplo se da formato a una marca de tiempo de Unix como una cadena con una granularidad mensual.
timestamp.get_timestamp(1708598631, "MONTH", "GMT") = "2024-02"
Ejemplo 10
En este ejemplo, se da formato a una marca de tiempo de Unix como una cadena con una granularidad anual.
timestamp.get_timestamp(1708598631, "YEAR", "GMT") = "2024"
timestamp.get_week
timestamp.get_week(unix_seconds [, time_zone])
Descripción
Esta función devuelve un número entero del intervalo [0, 53]
que representa la semana del año. Las semanas empiezan el domingo. Las fechas anteriores al primer domingo del año corresponden a la semana 0.
unix_seconds
es un número entero que representa el número de segundos transcurridos desde el inicio del registro de tiempo Unix, como$e.metadata.event_timestamp.seconds
, o un marcador de posición que contiene ese valor.time_zone
es opcional y es una cadena que representa una zona horaria. Si se omite, el valor predeterminado es "GMT". Puedes especificar zonas horarias mediante literales de cadena. Las opciones son las siguientes:- El nombre de la base de datos de zonas horarias, por ejemplo, "America/Los_Angeles". Para obtener más información, consulta la columna"Nombre de la base de datos de zonas horarias" de esta página.
- El desfase de la zona horaria con respecto a UTC, en formato
(+|-)H[H][:M[M]]
. Por ejemplo: "-08:00".
A continuación, se muestran ejemplos de especificadores time_zone
válidos que puedes usar como segundo argumento de las funciones de extracción de tiempo:
"America/Los_Angeles", or "-08:00". ("PST" is not supported)
"America/New_York", or "-05:00". ("EST" is not supported)
"Europe/London"
"UTC"
"GMT"
Tipos de datos de parámetros
INT
, STRING
Tipo de devolución
INT
Códigos de ejemplo
Ejemplo 1
En este ejemplo, se omite el argumento time_zone
, por lo que se utiliza el valor predeterminado "GMT".
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_week($ts) = 0
Ejemplo 2
En este ejemplo se usa un literal de cadena para definir el time_zone
.
$ts = $e.metadata.collected_timestamp.seconds
timestamp.get_week($ts, "America/Los_Angeles") = 0
timestamp.now
timestamp.now()
Descripción
Devuelve el número de segundos transcurridos desde el 1 de enero de 1970 a las 00:00:00 UTC. También se conoce como tiempo de época Unix.
Tipo de devolución
INT
Códigos de ejemplo
Ejemplo 1
En el siguiente ejemplo se devuelve una marca de tiempo del código ejecutado el 22 de mayo del 2024 a las 18:16:59.
timestamp.now() = 1716401819 // Unix epoch time in seconds for May 22, 2024 at 18:16:59
window.avg
window.avg(numeric_values [, should_ignore_zero_values])
Descripción
Devuelve la media de los valores de entrada (que pueden ser números enteros o de coma flotante). Si asignas el valor "true" al segundo argumento opcional, se ignorarán los valores cero.
Tipos de datos de parámetros
INT|FLOAT
Tipo de devolución
FLOAT
Códigos de ejemplo
Ejemplo 1
En este ejemplo se muestra la media de números enteros.
// This rule sets the outcome $size_mode to the average
// file size in the 5 minute match window.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$size_mode = window.avg($e.file.size) // yields 2.5 if the event file size values in the match window are 1, 2, 3 and 4
Ejemplo 2
En este ejemplo se muestra la media de los valores flotantes.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$size_mode = window.avg($e.file.size) // yields 1.75 if the event file size values in the match window are 1.1 and 2.4
Ejemplo 3
Media de entradas negativas
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$size_mode = window.avg($e.file.size) // yields 0.6 if the event file size values in the match window are -1.1, 1.1, 0.0 and 2.4
Ejemplo 4
0 devoluciones 0
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$size_mode = window.avg($e.file.size) // yields 0 if the event file size values in the match window is 0
Ejemplo 5
Ignorando 0 valores
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$size_mode = window.avg($e.file.size, true) // yields 394 if the event file size values in the match window are 0, 0, 0 and 394
window.first
window.first(values_to_sort_by, values_to_return)
Descripción
Esta función de agregación devuelve un valor de cadena derivado de un evento con el valor int correlacionado más bajo en la ventana de coincidencia. Un ejemplo de caso práctico es obtener el ID de usuario del evento con la marca de tiempo más baja en la ventana de coincidencia (el evento más antiguo).
Tipos de datos de parámetros
INT
, STRING
Tipo de devolución
STRING
Códigos de ejemplo
Obtiene un valor de cadena derivado de un evento con el valor entero correlacionado más bajo en la ventana de coincidencia.
// This rule sets the outcome $first_event to the lowest correlated int value
// in the 5 minute match window.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$first_event = window.first($e.metadata.timestamp.seconds, $e.metadata.event_type) // yields v1 if the events in the match window are 1, 2 and 3 and corresponding values v1, v2, and v3.
window.last
window.last(values_to_sort_by, values_to_return)
Descripción
Esta función de agregación devuelve un valor de cadena derivado de un evento con el valor entero correlacionado más alto en la ventana de coincidencia. Un ejemplo de caso práctico es obtener el ID de usuario del evento con la marca de tiempo más baja de la ventana de coincidencia (la marca de tiempo más alta).
Tipos de datos de parámetros
INT
, STRING
Tipo de devolución
STRING
Códigos de ejemplo
Obtiene un valor de cadena derivado de un evento con el valor entero correlacionado más alto en la ventana de coincidencia.
// This rule sets the outcome $last_event to the highest correlated int value
// in the 5 minute match window.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$last_event = window.first($e.metadata.timestamp.seconds, $e.metadata.event_type) // yields v3 if the events in the match window are 1, 2 and 3 and corresponding values v1, v2, and v3.
window.median
window.median(numeric_values, should_ignore_zero_values)
Descripción
Devuelve la mediana de los valores de entrada. Si hay dos valores medianos, solo se elegirá uno de forma no determinista como valor devuelto.
Tipos de datos de parámetros
INT|FLOAT
, BOOL
Tipo de devolución
FLOAT
Códigos de ejemplo
Ejemplo 1
En este ejemplo se devuelve la mediana cuando los valores de entrada no son cero.
rule median_file_size {
meta:
events:
$e.metadata.event_type = "FILE_COPY"
$userid = $e.principal.user.userid
match:
$userid over 1h
outcome:
$median_file_size = window.median($e.principal.file.size) // returns 2 if the file sizes in the match window are [1, 2, 3]
condition:
$e
}
Ejemplo 2
En este ejemplo se devuelve la mediana cuando la entrada incluye algunos valores cero que no se deben ignorar.
rule median_file_size {
meta:
events:
$e.metadata.event_type = "FILE_COPY"
$userid = $e.principal.user.userid
match:
$userid over 1h
outcome:
$median_file_size = window.median($e.principal.file.size) // returns 1 if the file sizes in the match window are [0,0, 1, 2, 3]
condition:
$e
}
Ejemplo 3
En este ejemplo se devuelve la mediana cuando la entrada incluye algunos valores cero que deben ignorarse.
rule median_file_size {
meta:
events:
$e.metadata.event_type = "FILE_COPY"
$userid = $e.principal.user.userid
match:
$userid over 1h
outcome:
$median_file_size = window.median($e.principal.file.size, true) // returns 2 if the file sizes in the match window are [0,0, 1, 2, 3]
condition:
$e
}
Ejemplo 4
En este ejemplo se devuelve la mediana cuando la entrada incluye todos los valores cero, que se deben ignorar.
rule median_file_size {
meta:
events:
$e.metadata.event_type = "FILE_COPY"
$userid = $e.principal.user.userid
match:
$userid over 1h
outcome:
$median_file_size = window.median($e.principal.file.size) // returns 0 if the file sizes in the match window are [0,0]
condition:
$e
}
Ejemplo 5
En este ejemplo se muestra que, cuando hay varias medianas, solo se devuelve una.
rule median_file_size {
meta:
events:
$e.metadata.event_type = "FILE_COPY"
$userid = $e.principal.user.userid
match:
$userid over 1h
outcome:
$median_file_size = window.median($e.principal.file.size) // returns 1 if the file sizes in the match window are [1, 2, 3, 4]
condition:
$e
}
window.mode
window.mode(values)
Descripción
Devuelve la moda de los valores de entrada. Si hay varios valores de modo posibles, solo se elegirá uno de ellos de forma no determinista como valor devuelto.
Tipos de datos de parámetros
INT|FLOAT|STRING
Tipo de devolución
STRING
Códigos de ejemplo
Ejemplo 1
Obtiene la moda de los valores de la ventana de coincidencia.
// This rule sets the outcome $size_mode to the most frequently occurring
// file size in the 5 minute match window.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$size_mode = window.mode($e.file.size) // yields 1.6 if the event file size values in the match window are 1.6, 2, and 1.6
window.stddev
window.stddev(numeric_values)
Descripción
Devuelve la desviación estándar de los valores de entrada en una ventana de coincidencia.
Tipos de datos de parámetros
INT|FLOAT
Tipo de devolución
FLOAT
Códigos de ejemplo
Ejemplo 1
En este ejemplo, se devuelve la desviación estándar de los números enteros de una ventana de coincidencia.
// This rule creates a detection when the file size stddev in 5 minutes for a user is over a threshold.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$p1 = window.stddev($e.file.size) // yields 4.0 if the event file size values in the match window are [10, 14, 18].
condition:
$e and #p1 > 2
Ejemplo 2
En este ejemplo, se devuelve la desviación estándar de los flotantes de una ventana de coincidencia.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$p1 = window.stddev($e.file.size) // yields 4.488686 if the event file size values in the match window are [10.00, 14.80, 18.97].
condition:
$e and #p1 > 2
Ejemplo 3
En este ejemplo se devuelve la desviación estándar en una ventana de coincidencia que contiene números negativos.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$p1 = window.stddev($e.file.size) // yields 48.644972 if the event file size values in the match window are [-1, -56, -98].
condition:
$e and #p1 > 2
Ejemplo 4
En este ejemplo, se devuelve una desviación estándar de cero cuando todos los valores de la ventana de coincidencia son iguales.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$p1 = window.stddev($e.file.size) // yields 0.000000 if the event file size values in the match window are [1, 1, 1].
condition:
$e and #p1 > 2
Ejemplo 5
En este ejemplo se devuelve la desviación estándar de una ventana de coincidencia que contiene números positivos y negativos.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$p1 = window.stddev($e.file.size) // yields 1.000000 if the event file size values in the match window are [1, 0, -1].
condition:
$e and #p1 > 10
window.variance
window.variance(values)
Descripción
Esta función devuelve la varianza especificada de los valores de entrada.
Tipos de datos de parámetros
INT|FLOAT
Tipo de devolución
FLOAT
Códigos de ejemplo
Ejemplo 1
Este ejemplo devuelve la varianza de todos los números enteros.
// This rule creates a detection when the file size variance in 5 minutes for a user is over a threshold.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$p1 = window.variance($e.file.size) // yields 16 if the event file size values in the match window are [10, 14, 18].
condition:
$e and #p1 > 10
Ejemplo 2
Este ejemplo devuelve la varianza de todos los elementos flotantes.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$p1 = window.variance($e.file.size) // yields 20.148300 if the event file size values in the match window are [10.00, 14.80, 18.97].
condition:
$e and #p1 > 10
Ejemplo 3
Este ejemplo devuelve la varianza de números negativos.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$p1 = window.variance($e.file.size) // yields 2366.333333 if the event file size values in the match window are [-1, -56, -98].
condition:
$e and #p1 > 10
Ejemplo 4
En este ejemplo se devuelve un valor de varianza pequeño.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$p1 = window.variance($e.file.size) // yields 0.000000 if the event file size values in the match window are [0.000000, 0.000000, 0.000100].
condition:
$e and #p1 > 10
Ejemplo 5
En este ejemplo se devuelve una varianza cero.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$p1 = window.variance($e.file.size) // yields 0.000000 if the event file size values in the match window are [1, 1, 1].
condition:
$e and #p1 > 10
Ejemplo 6
En este ejemplo se devuelve la varianza de números positivos y negativos.
events:
$e.user.userid = $userid
match:
$userid over 5m
outcome:
$p1 = window.variance($e.file.size) // yields 1.000000 if the event file size values in the match window are [1, 0, -1].
condition:
$e and #p1 > 10
bytes.to_base64
bytes.to_base64(bytes, optional_default_string)
Descripción
La función convierte un valor bytes
en un valor base64 encoded string
. Las llamadas de función con valores que no se pueden convertir devuelven una cadena vacía de forma predeterminada.
Tipos de datos de parámetros
BYTES
, STRING
Tipo de devolución
STRING
Códigos de ejemplo
Bytes binarios sin formato a cadena codificada en Base64
La función convierte los bytes binarios sin formato en una cadena codificada en base64.
bytes.to_base64(b'000000006f8ec5586d026f9ddac56e9f2fe15b8a0000000001000000cd000000) = "AAAAAG+OxVhtAm+d2sVuny/hW4oAAAAAAQAAAM0AAAA="
Error de conversión (se usa la cadena proporcionada opcionalmente)
La función usa el valor predeterminado "invalid bytes"
cuando el valor de bytes proporcionado no es válido.
bytes.to_base64(b'000000006f8ec5586d", "invalid bytes") = "invalid bytes"
Asignación de función a marcador de posición
Puedes asignar el resultado de una llamada de función a un marcador de posición en la sección events
. Por ejemplo:
$placeholder = strings.concat($e.principal.hostname, "my-string").
Después, puede usar las variables de marcador de posición en las secciones match
, condition
y outcome
.
Sin embargo, hay dos limitaciones en la asignación de funciones a marcadores de posición:
Cada marcador de posición de la asignación de función a marcador de posición debe asignarse a una expresión que contenga un campo de evento. Por ejemplo, los siguientes ejemplos son válidos:
$ph1 = $e.principal.hostname $ph2 = $e.src.hostname // Both $ph1 and $ph2 have been assigned to an expression containing an event field. $ph1 = strings.concat($ph2, ".com")
$ph1 = $e.network.email.from $ph2 = strings.concat($e.principal.hostname, "@gmail.com") // Both $ph1 and $ph2 have been assigned to an expression containing an event field. $ph1 = strings.to_lower($ph2)
Sin embargo, el siguiente ejemplo no es válido:
$ph1 = strings.concat($e.principal.hostname, "foo") $ph2 = strings.concat($ph1, "bar") // $ph2 has NOT been assigned to an expression containing an event field.
La llamada a la función debe depender de un evento, y solo uno. Sin embargo, se pueden usar varios campos del mismo evento en los argumentos de las llamadas a funciones. Por ejemplo, lo siguiente es válido:
$ph = strings.concat($event.principal.hostname, "string2")
$ph = strings.concat($event.principal.hostname, $event.src.hostname)
Sin embargo, lo siguiente no es válido:
$ph = strings.concat("string1", "string2")
$ph = strings.concat($event.principal.hostname, $anotherEvent.src.hostname)
Sintaxis de las listas de referencias
Consulta nuestra página sobre listas de referencia para obtener más información sobre el comportamiento y la sintaxis de las listas de referencia.
Puedes usar listas de referencia en las secciones events
o outcome
. Esta es la sintaxis para usar varios tipos de listas de referencia en una regla:
// STRING reference list
$e.principal.hostname in %string_reference_list
// regular expression reference list
$e.principal.hostname in regex %regex_reference_list
// CIDR reference list
$e.principal.ip in cidr %cidr_reference_list
También puedes usar los operadores not
y nocase
con listas de referencia, como se muestra en el siguiente ejemplo:
// Exclude events whose hostnames match substrings in my_regex_list.
not $e.principal.hostname in regex %my_regex_list
// Event hostnames must match at least 1 string in my_string_list (case insensitive).
$e.principal.hostname in %my_string_list nocase
El operador nocase
es compatible con las listas STRING
y REGEX
.
Por motivos de rendimiento, Detection Engine restringe el uso de listas de referencia.
- Número máximo de instrucciones
in
en una regla, con o sin operadores especiales: 7 - Número máximo de instrucciones
in
con el operadorregex
: 4 - Número máximo de instrucciones
in
con el operadorcidr
: 2
Comprobación de tipos
Google SecOps comprueba los tipos de tu sintaxis YARA-L mientras creas reglas en la interfaz. Los errores de comprobación de tipos que se muestran te ayudan a revisar la regla para confirmar que funciona correctamente.
A continuación, se muestran ejemplos de predicados no válidos:
// $e.target.port is of type integer which cannot be compared to a string.
$e.target.port = "80"
// "LOGIN" is not a valid event_type enum value.
$e.metadata.event_type = "LOGIN"
Muestreo de eventos de detección
Las detecciones de reglas de varios eventos contienen muestras de eventos para proporcionar contexto sobre los eventos que han provocado la detección. Hay un límite de hasta 10 ejemplos de eventos por cada variable de evento definida en la regla. Por ejemplo, si una regla define dos variables de evento, cada detección puede tener hasta 20 muestras de evento. El límite se aplica a cada variable de evento por separado. Si una variable de evento tiene dos eventos aplicables en esta detección y la otra variable de evento tiene 15 eventos aplicables, la detección resultante contiene 12 muestras de eventos (2 + 10).
Las muestras de eventos que superen el límite se omitirán en la detección.
Si quiere obtener más información sobre los eventos que han provocado la detección, puede usar agregaciones en la sección de resultados para mostrar información adicional en la detección.
Si estás viendo las detecciones en la interfaz de usuario, puedes descargar todas las muestras de eventos de una detección. Para obtener más información, consulta Descargar eventos.
¿Necesitas más ayuda? Recibe respuestas de los miembros de la comunidad y de los profesionales de Google SecOps.