Sintaxe da seção de condição
Este documento descreve como usar a seção condition de uma consulta
YARA-L 2.0.
O impacto da seção condition depende de você estar executando uma consulta ad hoc ou implantando uma regra permanente, da seguinte maneira:
- Para pesquisa e painéis: funciona como um pós-filtro, retornando e renderizando apenas os registros que atendem às expressões especificadas.
- Regras de detecção (obrigatório): servem como lógica de acionamento. Um alerta só é acionado se as condições forem resolvidas como
trueem uma determinada janela dematch.
Use a seção condition para definir expressões que filtram eventos e variáveis de marcador de posição. 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. É possível especificar condições match para variáveis da seção events e, opcionalmente, usar a palavra-chave and para incluir lógica com base na seção outcome. Para mais detalhes, consulte a 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á limitado.
$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
eventsprecisam aparecer na seçãoconditionou ter um marcador de posição atribuído a eles que aparece 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 ilimitadas 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 YARA-L 2.0
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.