Sintaxe da secção de condições
Este documento descreve como pode usar a secção condition de uma consulta YARA-L. A secção condition é usada na pesquisa, nos painéis de controlo e é necessária para as regras, além de conter lógica para filtrar ainda mais os resultados. Quando usado numa pesquisa ou numa consulta de painel de controlo, só mostra resultados que cumprem as condições. Quando usadas numa regra de deteção, as condições têm de ser cumpridas para acionar um alerta.
Na secção condition, pode usar operadores booleanos, operadores de comparação e resultados de variáveis outcome para determinar se a consulta deve ser acionada.
Defina a secção condition
Defina as expressões de condições para eventos e variáveis de marcadores de posição na secção condition. Também pode especificar uma condição de correspondência para eventos e marcadores de posição definidos na secção events e, opcionalmente, usar a palavra-chave and para especificar uma condição de correspondência usando variáveis de resultado definidas na secção outcome. Consulte a sintaxe da secção de resultados.
Pode juntar as expressões usando as palavras-chave and ou or:
Use
andentre quaisquer condições.Use
orapenas quando a consulta contiver uma única variável de evento.
Use o caráter # na secção condition antes de qualquer evento ou nome de variável de marcador de posição para representar o número de eventos ou valores distintos que satisfazem todas as condições na secção events. Por exemplo:
#c > 1 significa que a variável c tem de ocorrer mais de 1 vez.
Use o caráter $ na secção condition antes de qualquer nome de variável de resultado para representar o valor desse resultado. Se for usado antes de qualquer evento ou nome de variável de marcador de posição (por exemplo, $event), representa #event > 0.
Este exemplo de regra devolve uma deteção quando existem mais de cinco (conforme definido na secção condition) inícios de sessão com falhas para cada utilizador num período de 10 minutos (conforme definido na secção match):
rule failed_logins
{
meta:
author = "Security Team"
description = "Detects multiple failed user logins within 10-minute windows."
severity = "HIGH"
events:
$e.metadata.event_type = "USER_LOGIN"
$e.security_result.action = "FAIL"
$user = $e.target.user.userid
match:
$user over 10m
outcome:
$failed_login_count = count($e.metadata.id)
$first_fail_time = min($e.metadata.event_timestamp.seconds)
condition:
#e >= 5
}
Condições limitadas e ilimitadas
Pode usar condições delimitadas ou não delimitadas numa consulta:
As condições delimitadas forçam a existência da variável de evento associada, o que significa que, pelo menos, uma ocorrência do evento tem de aparecer na deteção. Seguem-se as condições delimitadas:
$var // equivalent to #var > 0#var > n // where n >= 0#var >= m // where m > 0As condições ilimitadas podem ser usadas para detetar a ausência de um evento durante um período; por exemplo, um evento de ameaça sem um evento de mitigação num período de 10 minutos. As condições ilimitadas permitem que a variável de evento associada não exista (consultas de não existência), o que significa que é possível que não apareça nenhuma ocorrência do evento numa deteção e que qualquer referência a campos na variável de evento produza um valor zero.
Seguem-se as condições ilimitadas:
!$var // equivalent to #var = 0#var >= 0#var < n // where n > 0#var <= m // where m >= 0
Requisitos para consultas de não existência
Para que uma consulta de não existência seja compilada, tem de cumprir os seguintes requisitos:
- Pelo menos, um evento UDM tem de ter uma condição limitada (ou seja, tem de existir, pelo menos, um evento UDM).
- Se um marcador de posição tiver uma condição ilimitada, tem de estar associado, pelo menos, a um evento de UDM limitado.
- Se uma entidade tiver uma condição ilimitada, tem de estar associada, pelo menos, a um evento de DUA limitado.
Exemplo: consulta de não existência
Considere a seguinte consulta com a secção de condições omitida:
rule NonexistenceExample {
meta:
author = "Google Security"
description = "Example: non-existence query."
events:
$u1.metadata.event_type = "NETWORK_CONNECTION" // $u1 is a UDM event.
$u2.metadata.event_type = "NETWORK_CONNECTION" // $u2 is a UDM event.
$e1.graph.metadata.entity_type = "FILE" // $e1 is an entity.
$e2.graph.metadata.entity_type = "FILE" // $e2 is an entity.
$user = $u1.principal.user.userid // Match variable is required for multi-event query.
// Placeholder Associations:
// u1 u2
// | \ /
// port ip
// | \
// e1 e2
$u1.target.port = $port
$e1.graph.entity.port = $port
$u1.principal.ip = $ip
$u2.target.ip = $ip
$e2.graph.entity.ip = $ip
// UDM-Entity Associations:
// u1 - u2
// | \ |
// e1 e2
$u1.metadata.event_type = $u2.metadata.event_type
$e1.graph.entity.hostname = $u1.principal.hostname
$e2.graph.entity.hostname = $u1.target.hostname
$e2.graph.entity.hostname = $u2.principal.hostname
match:
$user over 5m
condition:
//Add valid condition
}Secção de condição válida
Seguem-se exemplos válidos para a secção de condições:
$u1 and !$u2 and $e1 and $e2- Todos os eventos e entidades da UDM estão presentes na secção de condições.
- Pelo menos, um evento da UDM está limitado.
$u1 and !$u2 and $e1 and !$e2$e2não tem limites e é permitido porque está associado a$u1, que tem limites. Se$e2não estivesse associado a$u1, este campo seria inválido.#port > 50 and #ip = 0- Não estão presentes eventos nem entidades do UDM na secção de condições. No entanto, os marcadores de posição presentes abrangem todos os eventos e entidades do UDM.
$ipestá atribuído a$u1e$u2, e#ip = 0é uma condição ilimitada. No entanto, as condições delimitadas são mais fortes do que as condições não delimitadas. Uma vez que$portestá atribuído a$u1e#port > 50é uma condição limitada,$u1continua limitado.
Secção de condição inválida
Seguem-se exemplos inválidos para a secção de condições:
$u1 and $e1- Todos os eventos e entidades UDM apresentados na secção
eventstêm de ser apresentados na secçãocondition(ou ter um marcador de posição atribuído que seja apresentado na secçãocondition). $u1, $u2, $e1, $u2, #port > 50- Não são permitidas vírgulas como separadores de condições.
!$u1 and !$u2 and $e1 and $e2- Viola o primeiro requisito de que, pelo menos, um evento de UDM está limitado.
($u1 or #port < 50) and $u2 and $e1 and $e2- A palavra-chave
ornão é suportada com condições ilimitadas. ($u1 or $u2) and $e1 and $e2- A palavra-chave
ornão é suportada entre diferentes variáveis de eventos. not $u1 and $u2 and $e1 and $e2- A palavra-chave
notnão é permitida para condições de eventos e marcadores de posição. #port < 50 and #ip = 0- Embora os marcadores de posição façam referência a todos os eventos e entidades do UDM, todas as condições associadas não têm limites. Isto significa que nenhum dos eventos de UDM está delimitado, o que faz com que a regra não seja compilada.
Condições de resultados
Pode incluir condições para variáveis de resultados na secção condition, unidas pela palavra-chave and ou or, ou precedidas pela palavra-chave not.
As condições de resultados são especificadas de forma diferente consoante o tipo de variável de resultado:
integer: compare com um literal inteiro com operadores
=, >, >=, <, <=, !=Por exemplo:$risk_score > 10float: compare com um literal float com operadores
=, >, >=, <, <=, !=Por exemplo:$risk_score <= 5.5string: compare com um literal de string com
=ou!=Por exemplo:$severity = "HIGH"lista de números inteiros ou matrizes: especifique a condição através da função
arrays.containsPor exemplo:arrays.contains($event_ids, "id_1234")
Se especificar uma condição de resultado numa consulta que tenha uma secção match, a consulta é classificada como uma consulta de vários eventos para a quota de consultas. Consulte a sintaxe de correspondência para mais informações sobre classificações de eventos únicos e múltiplos.
Restrições
Evite usar uma variável
matchna secçãocondition. É um erro semântico porque os eventos são agrupados pelo valor da variávelmatch.Evite especificar apenas condições ilimitadas em todas as variáveis
eventàs quais uma variávelmatchestá atribuída. É um erro semântico. Para ser devolvido um valor de variávelmatch, tem de existir, pelo menos, um evento que contenha o valor.Se usar uma janela deslizante, a variável do evento principal tem de estar envolvida em, pelo menos, uma condição delimitada.
O que se segue?
- Sintaxe da secção de opções
- Use ou na secção de condições
- Use a sintaxe N DE com variáveis de eventos
Informações adicionais
- Expressões, operadores e construções usados no YARA-L 2.0
- Funções no YARA-L 2.0
- Crie regras de deteção compostas
- Exemplos: consultas YARA-L 2.0
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.