Sintaxe da seção de condição
Este documento descreve como usar a seção condition de uma consulta YARA-L. A seção condition é usada na pesquisa e nos painéis. Ela é obrigatória para regras e contém lógica para filtrar ainda mais os resultados. Quando usado em uma pesquisa ou consulta de painel, ele mostra apenas a saída que atende às condições. Quando usadas em uma regra de detecção, as condições precisam ser atendidas para acionar um alerta.
Na seção condition, é possível usar operadores booleanos e de comparação, além de resultados de variáveis outcome, para determinar se a consulta deve ser acionada.
Definir a seção condition
Defina as expressões de condição para eventos e variáveis de marcador de posição na seção condition. Também é possível especificar uma condição de correspondência para eventos e marcadores de posição definidos na seção events e, opcionalmente, usar a palavra-chave and para especificar uma condição de correspondência usando variáveis de resultado definidas na seção outcome. Consulte Sintaxe da seção de resultado.
É possível unir as expressões usando as palavras-chave and ou or:
Use
andentre as condições.Use
orsomente quando a consulta tiver uma única variável de evento.
Use o caractere # na seçã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 atendem a todas as condições na seção events. Exemplo:
#c > 1 significa que a variável c precisa ocorrer mais de uma vez.
Use o caractere $ na seção condition antes de qualquer nome de variável de resultado para representar o valor desse resultado. Se usado antes de qualquer evento ou nome de variável de marcador (por exemplo, $event), ele representa #event > 0.
Este exemplo de regra retorna uma detecção quando há mais de cinco (conforme definido na seção condition) falhas de login para cada usuário em um período de 10 minutos (conforme definido na seçã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
É possível usar condições limitadas ou ilimitadas em uma 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 precisa aparecer na detecção. Estas são as condições delimitadas:
$var // equivalent to #var > 0#var > n // where n >= 0#var >= m // where m > 0As condições sem limites podem ser usadas para detectar a ausência de um evento por um período. Por exemplo, um evento de ameaça sem um evento de mitigação em um período de 10 minutos. As condições sem restrições permitem que a variável de evento associada não exista (consultas de não existência), o que significa que é possível que nenhuma ocorrência do evento apareça em uma detecção e que qualquer referência a campos na variável de evento gere um valor zero.
As seguintes são condições sem restrições:
!$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, ela precisa atender aos seguintes requisitos:
- Pelo menos um evento da UDM precisa ter uma condição limitada (ou seja, pelo menos um evento da UDM precisa existir).
- Se um marcador de posição tiver uma condição sem restrições, ele precisará estar associado a pelo menos um evento UDM com restrições.
- Se uma entidade tiver uma condição sem restrições, ela precisará ser associada a pelo menos um evento UDM com restrições.
Exemplo: consulta de não existência
Considere a seguinte consulta com a seção de condição 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
}Seção de condição válida
Confira a seguir exemplos válidos para a seção de condição:
$u1 and !$u2 and $e1 and $e2- Todos os eventos e entidades da UDM estão presentes na seção de condição.
- Pelo menos um evento da UDM está vinculado.
$u1 and !$u2 and $e1 and !$e2$e2é ilimitado e permitido porque está associado a$u1, que é limitado. Se$e2não estivesse associado a$u1, isso seria inválido.#port > 50 and #ip = 0- Nenhum evento e entidade da UDM está presente na seção de condição. No entanto, os marcadores de posição presentes abrangem todos os eventos e entidades da UDM.
$ipé atribuído a$u1e$u2, e#ip = 0é uma condição sem restrições. No entanto, as condições limitadas são mais fortes do que as ilimitadas. Como$porté atribuído a$u1e#port > 50é uma condição limitada,$u1ainda é limitado.
Seção de condição inválida
Confira a seguir exemplos inválidos para a seção de condição:
$u1 and $e1- Todos os eventos e entidades da UDM que aparecem na seção
eventstambém precisam aparecer na seçãoconditionou ter um marcador de posição atribuído a eles que apareça na seçãocondition. $u1, $u2, $e1, $u2, #port > 50- Não é permitido usar vírgulas como separadores de condição.
!$u1 and !$u2 and $e1 and $e2- Viola o primeiro requisito de que pelo menos um evento da UDM seja limitado.
($u1 or #port < 50) and $u2 and $e1 and $e2- A palavra-chave
ornão é compatível com condições sem restrições. ($u1 or $u2) and $e1 and $e2- A palavra-chave
ornão é compatível entre diferentes variáveis de evento. not $u1 and $u2 and $e1 and $e2- A palavra-chave
notnão é permitida para condições de evento e marcador de posição. #port < 50 and #ip = 0- Embora os marcadores de posição façam referência a todos os eventos e entidades da UDM, todas as condições associadas são ilimitadas. Isso significa que nenhum dos eventos de UDM está limitado, fazendo com que a regra não seja compilada.
Condições de resultado
É possível incluir condições para variáveis de resultado na seção condition, unidas com a palavra-chave and ou or, ou precedidas pela palavra-chave not.
As condições de resultado são especificadas de maneira diferente, dependendo do tipo de variável de resultado:
integer: compara com um literal inteiro usando operadores
=, >, >=, <, <=, !=Por exemplo:$risk_score > 10float: compare com um literal de ponto flutuante usando os operadores
=, >, >=, <, <=, !=Por exemplo:$risk_score <= 5.5string: compare com um literal de string usando
=ou!=Por exemplo:$severity = "HIGH"lista de números inteiros ou matrizes: especifique a condição usando a função
arrays.contains. Por exemplo:arrays.contains($event_ids, "id_1234")
Se você especificar uma condição de resultado em uma consulta que tenha uma seção match, ela será classificada como uma consulta de vários eventos para a cota 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 seçãocondition. É um erro semântico porque os eventos são agrupados pelo valor da variávelmatch.Evite especificar apenas condições sem restrições em todas as variáveis
eventa que uma variávelmatché atribuída. É um erro semântico. Para que um valor de variávelmatchseja retornado, é preciso que haja pelo menos um evento com esse valor.Se você usar uma janela deslizante, a variável de evento de pivô precisará estar envolvida em pelo menos uma condição limitada.
A seguir
- Sintaxe da seção "Opções"
- Usar "ou" na seção de condição
- Usar a sintaxe N OF com variáveis de evento
Informações adicionais
- Expressões, operadores e construções usados na YARA-L 2.0
- Funções na YARA-L 2.0
- Criar regras de detecção compostas
- Exemplos: consultas da YARA-L 2.0
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.