Condições na pesquisa e nos painéis de controlo do UDM com o YARA-L 2.0
A secção condition
define critérios para incluir dados nos resultados da pesquisa.
Estas condições são avaliadas em função das variáveis de evento e de marcadores de posição definidas na secção events
. Pode combinar estas condições
usando a palavra-chave and
.
Limitações
As condições na pesquisa têm as seguintes limitações:
Obrigatório: a secção
match
é obrigatória. Em alternativa, pode definir filtros não agrupados diretamente na secçãoevents
.Obrigatório: as variáveis de evento e de marcador de posição têm de ser agregadas na secção
condition
.Apenas são suportadas expressões de comparação de números inteiros e de ponto flutuante. Estas expressões têm de ter uma variável à esquerda e um número inteiro ou um número de vírgula flutuante à direita (por exemplo,
#c > 1
,$port = 80
). Os operadores suportados são<
,>
e=
.A ordem das variáveis e das cláusulas na secção
condition
não afeta os resultados.Para usar variáveis de resultados na secção
condition
, defina-as e agregue-as. Pode filtrar variáveis de resultados não agregadas na secçãoevents
.As operações matemáticas diretas com variáveis não são suportadas (por exemplo,
#e1 + 5 > 6
,$o1.sum($pl) > 0
).Não existem restrições adicionais se as condições
OR
se aplicarem aos mesmos eventos base. Aplicam-se as seguintes restrições quando o parâmetroOR
é usado em diferentes eventos:As comparações de não existência não são suportadas com
OR
. Por exemplo, o formatomath.log($outcome1_sent_bytes) > 5 OR (#placeholder2) < 10
não é suportado.As variáveis não UDM não são suportadas em cláusulas
OR
que abrangem diferentes eventos. No entanto,OR
é suportado num contexto de evento único ou quando agrupado comAND
. Por exemplo,$entity and ($udm_event_1 or $placeholder_derived_from_udm_event_1)
. Segue-se outro exemplo:$entity and ($udm_event_1 or $outcome_udm_event_1_bytes > 1000)
.
Contagem de carateres (#
)
O caráter #
, quando precede um evento ou um nome de variável de marcador de posição (por exemplo, #c
), representa o número de ocorrências distintas desse evento ou o número de valores distintos que satisfazem todas as condições na secção events
associada a essa variável. Por exemplo, #c > 1
implica que o evento ou o marcador de posição c
tem de ocorrer mais do que uma vez.
Consulta de exemplo:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
$e2.principal.hostname = $hostname
$e2.target.hostname = "homedepot.com"
$e2.target.port = 3042 // tcp/udp
match:
$hostname over 1h
condition:
#e1 > 0 or #e2 > 1
Caráter de valor ($
)
A função do caráter $
depende do contexto.
Variável de resultado: quando colocada antes de um nome de variável de resultado (por exemplo,
$risk_score
), representa o valor da variável.Variável de evento ou marcador de posição: quando colocada antes de um nome de variável de evento ou marcador de posição (por exemplo,
$event
), é equivalente a#event > 0
e implica que tem de existir, pelo menos, uma ocorrência desse evento.
Condições de eventos e marcadores de posição
Pode combinar vários predicados de condições para eventos e variáveis de marcadores de posição usando a palavra-chave and
.
Exemplo de utilização de or
(evento único):
condition:
$ph2 and $ph3
Importante: quando escrever lógica nas secções events
ou condition
, use !
para negação. Use a palavra-chave not
apenas na secção outcome
.
Condições delimitadas e não delimitadas
As condições de variáveis de eventos podem ser limitadas ou ilimitadas.
As condições delimitadas requerem a existência da variável de evento associada. Isto significa que, em qualquer deteção, tem de aparecer, pelo menos, uma ocorrência do evento.
Exemplos:
$var
(equivalente a#var > 0
)#var > n
(onden >= 0
)#var >= m
(ondem > 0
)
Consulta de exemplo:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
match:
$hostname over 1h
condition:
#e1 > 0
As condições não delimitadas permitem que a variável de evento associada não exista. Isto significa que é possível que nenhuma ocorrência do evento apareça numa deteção. Qualquer referência a campos na variável de evento produz um valor zero. Use estes para pesquisas de não existência.
Exemplos:
!$var
(equivalente a#var = 0
)#var >= 0
#var < n
(onden > 0
)#var <= m
(ondem >= 0
)
Consulta de exemplo:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
match:
$hostname over 1h
outcome:
$bytes_sent = sum($e1.network.sent_bytes)
condition:
$bytes_sent >= 0
Nota: para consultas de pesquisa de não existência (com condições ilimitadas), o motor de deteção adiciona um atraso de 1 hora à latência esperada.
As consultas de pesquisa com condições ilimitadas têm de cumprir os seguintes critérios:
Pelo menos, um evento de UDM tem de ter uma condição delimitada, ou seja, tem de existir, pelo menos, um evento de UDM.
Os marcadores de posição com condições ilimitadas têm de estar associados a, pelo menos, um evento de UDM limitado.
As entidades com condições ilimitadas têm de ser associadas, pelo menos, a um evento UDM limitado.
Condições de resultados
Pode definir condições de resultados usando variáveis de resultados e combiná-las com
operadores lógicos (and
, or
, not
). A sintaxe de comparação depende do
tipo de dados da variável de resultado.
- integer e float: use
=
,>
,>=
,<
,<=
,!=
(por exemplo,$risk_score > 10
,$risk_score <= 5.5
). - string: use
=
ou!=
(por exemplo,$severity = "HIGH"
). - lista de números inteiros ou matrizes: use
arrays.contains()
(por exemplo,arrays.contains($event_ids, "id_1234")
).
Exemplo de consulta:
$e1.principal.hostname = $hostname
$e1.target.hostname = "fedex.com"
$e1.target.port = 3042 // tcp/udp
match:
$hostname over 1h
outcome:
$bytes_sent = sum($e1.network.sent_bytes)
condition:
$e1
N de X condições na pesquisa de UDM
As condições de pesquisa da UDM suportam a sintaxe "N de X", que oferece uma avaliação flexível de vários critérios. Esta sintaxe permite especificar que uma condição é cumprida se N
(um número específico) de X
(uma lista de expressões booleanas) for avaliado como verdadeiro.
Exemplo: considere um cenário em que quer identificar processos que apresentem vários comportamentos suspeitos, mas não necessariamente todos, a partir de uma lista predefinida de etiquetas fornecidas pelo enriquecimento do VirusTotal (VT). A sintaxe "N de X" resolve este problema, permitindo-lhe especificar um número mínimo de condições que têm de ser cumpridas.
A seguinte consulta de pesquisa da UDM procura processos em que, pelo menos, três das condições são verdadeiras:
$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process
match:
$process
outcome:
$first_seen = earliest($e.metadata.event_timestamp)
$last_seen = latest($e.metadata.event_timestamp)
$total_events = count($e.metadata.id)
// Collect all unique tags associated with this process from all its launch events
$tags = array_distinct($e.target.process.file.tags)
condition:
// Trigger if at least 3 of the following conditions (tag checks) are true
3 of [
arrays.contains($tags, "malware"),
arrays.contains($tags, "detect-debug-environment"),
arrays.contains($tags, "checks-disk-space"),
arrays.contains($tags, "checks-cpu-name"),
arrays.contains($tags, "invalid-signature"),
arrays.contains($tags, "self-delete")
]
order:
$total_events desc
Operadores ANY of e ALL of
ANY of [expressions]
avalia true
se, pelo menos, uma das expressões booleanas indicadas for true
. ALL of [expressions]
requer que todas as expressões listadas sejam true
. Combine estes operadores com outras condições usando palavras-chave como AND
.
Exemplo:
$e.metadata.event_type = "PROCESS_LAUNCH"
$e.target.process.file.full_path = $process
match:
$process
outcome:
$first_seen = timestamp.get_timestamp(min($e.metadata.event_timestamp.seconds))
$last_seen = timestamp.get_timestamp(max($e.metadata.event_timestamp.seconds))
$total = count($e.metadata.id)
$tags = array_distinct($e.target.process.file.tags)
$vt_first_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.first_seen_time.seconds) < 86400, 1 , 0))
$vt_last_analysis_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_analysis_time.seconds) < 86400, 1 , 0))
$vt_last_modification_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_modification_time.seconds) < 86400, 1 , 0))
$vt_last_seen_time = max(if((timestamp.current_seconds() - $e.target.process.file.last_seen_time.seconds) < 86400, 1 , 0))
condition:
3 of [
arrays.contains($tags, "malware"),
arrays.contains($tags, "detect-debug-environment"),
arrays.contains($tags, "checks-disk-space"),
arrays.contains($tags, "checks-cpu-name"),
arrays.contains($tags, "invalid-signature"),
arrays.contains($tags, "self-delete")
]
and ANY of [
$vt_first_seen_time = 1,
$vt_last_analysis_time = 1,
$vt_last_modification_time = 1,
$vt_last_seen_time = 1
]
order:
$total desc
unselect:
$vt_first_seen_time,
$vt_last_analysis_time,
$vt_last_modification_time,
$vt_last_seen_time
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.