Sintaxe da secção de resultados
A secção outcome de uma consulta YARA-L define variáveis de resultados que especificam o resultado de uma consulta de pesquisa e painel de controlo, bem como contexto e informações adicionais para uma deteção quando uma regra é acionada. Estas variáveis podem ser usadas para vários fins, como apresentar dados relevantes em painéis de controlo e criar classificações de risco.
Defina a secção de resultados
Use o caráter $, seguido de um nome de variável, para definir uma variável de resultado na secção outcome de uma única consulta. Pode definir até 20 variáveis de resultados. Os nomes das variáveis em si são arbitrários. Para as regras, os valores dos resultados são calculados e agregados com base em cada deteção.
A cada variável de resultado é atribuído um valor através de uma expressão.
Esta regra procura inícios de sessão falhados a partir de uma nova localização:
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
}
A secção outcome executa agregações nas variáveis de eventos e marcadores de posição: conta os inícios de sessão falhados, conta os IPs distintos e obtém a hora em que a falha ocorreu.
outcome:
$failed_login_count = count($e.metadata.id)
$first_fail_time = min($e.metadata.event_timestamp.seconds)
Se incluir e preencher a variável de resultado especial $risk_score, o respetivo valor (número inteiro ou de vírgula flutuante) é apresentado na página Alertas e IoCs para alertas gerados pela consulta.
Se não incluir uma variável $risk_score na secção outcome de uma consulta, é definido um dos seguintes valores predefinidos:
Se a consulta estiver configurada para gerar um alerta, o valor de
$risk_scoreé 40.Se a consulta não estiver configurada para gerar um alerta,
$risk_scoreé definido como 15.
O valor de $risk_score é armazenado no campo UDM security_result.risk_score.
Variável de resultado da pontuação de risco
O Google SecOps Risk Analytics associa automaticamente as deteções e os alertas a entidades relacionadas com essa deteção ou alerta. A variável de resultado risk_score é usada para atribuir um valor de risco. Se este valor não estiver definido, é usado o valor de deteção ou alerta predefinido. Pode configurar valores predefinidos
em Definições.
Para garantir a consistência na plataforma, recomendamos que use os seguintes intervalos de pontuação ao atribuir um risk_score às suas deteções personalizadas. Este alinhamento ajuda a padronizar a priorização de alertas e os fluxos de trabalho de resposta.
| Gravidade | Intervalo de pontuação | Descrição | Exemplo |
|---|---|---|---|
| Alertas – Crítico | 90 - 100 | Compromisso ativo com o potencial de ter impacto além de uma única conta de utilizador ou ponto final. Requer revisão imediata. | Mimikatz executado no controlador de domínio. |
| Alertas – Elevado | 80 - 89 | Compromisso ativo de um único ponto final ou entidade. Deve receber uma revisão imediata. | O servidor de produção está a chamar um C2 recente e conhecido. |
| Alertas – Médio | 50 - 79 | Potencial problema de segurança que requer investigação. Não existe nenhuma situação de comprometimento confirmada, mas é possível uma escalada. | Uma credencial exposta sem sinais de utilização indevida. |
| Não alerta – Baixo | 20 - 49 | Evento de segurança de baixo impacto que, quando combinado com outros indicadores ou observações, pode levar a um incidente mais significativo. Geralmente, não é necessária revisão. Pode ser combinado com outras deteções através de regras compostas para criar um alerta. | Análise de portas internas. |
| Observações sem alertas | 1 - 19 | Geralmente, deteções baseadas em informações destinadas a criar consciência situacional de uma ameaça. Geralmente, não requer revisão; pode ser combinado com outras deteções através de regras compostas para gerar alertas. | Um evento de início de sessão, sem sinais de utilização indevida. |
Uma vez que risk_score é uma variável de resultado, as suas regras podem expressar nuances consoante fatores como informações sobre ameaças ou outras condições simultâneas.
As pontuações de risco das entidades podem ser usadas para gerar alertas baseados em risco quase em tempo real. Para mais informações, consulte o artigo Vista geral da análise de riscos.
Tipos de dados de variáveis de resultados
Cada variável de resultado pode ter um tipo de dados diferente, que é determinado pela expressão usada para a calcular. Os seguintes tipos de dados de resultados são suportados no Google SecOps:
- número inteiro
- flutuadores
- de string
- listas de números inteiros
- listas de flutuantes
- listas de strings
Lógica condicional
Pode usar a lógica condicional para calcular o valor de um resultado. As condições são especificadas através do seguinte padrão de sintaxe:
if(BOOL_CLAUSE, THEN_CLAUSE)
if(BOOL_CLAUSE, THEN_CLAUSE, ELSE_CLAUSE)
Pode ler uma expressão condicional como "se BOOL_CLAUSE for verdadeiro, devolve THEN_CLAUSE, caso contrário, devolve ELSE_CLAUSE".
BOOL_CLAUSE tem de ser avaliado como um valor booleano. Uma expressão BOOL_CLAUSE tem uma forma semelhante às expressões na secção events. Por exemplo, pode
conter:
Nomes de campos UDM com operador de comparação:
if($context.graph.entity.user.title = "Vendor", 100, 0)Variável do marcador de posição definida na secção
events:if($severity = "HIGH", 100, 0)Outra variável de resultado definida na secção
outcome:if($risk_score > 20, "HIGH", "LOW")Funções que devolvem um valor booleano:
if(re.regex($e.network.email.from, `.*altostrat.com`), 100, 0)Pesquise numa lista de referência:
if($u.principal.hostname in %my_reference_list_name, 100, 0)Comparação de agregação:
if(count($login.metadata.event_timestamp.seconds) > 5, 100, 0)
THEN_CLAUSE e ELSE_CLAUSE têm de ser do mesmo tipo de dados. Suportamos números inteiros, números de vírgula flutuante e strings.
Pode omitir a ELSE_CLAUSE se o tipo de dados for um número inteiro ou um número de vírgula flutuante. Se for omitido, a CLÁUSULA_SENÃO é avaliada como 0. Por exemplo:
`if($e.field = "a", 5)` is equivalent to `if($e.field = "a", 5, 0)`
Tem de fornecer a ELSE_CLAUSE se o tipo de dados for string ou se a THEN_CLAUSE for uma variável de marcador de posição ou uma variável de resultado.
Operações matemáticas
Pode usar operações matemáticas para calcular o tipo de dados inteiro ou flutuante nas secções outcomee events de uma consulta. As operações de segurança da Google suportam adição, subtração, multiplicação, divisão e módulo como operadores de nível superior num cálculo.
O fragmento seguinte é um exemplo de cálculo na secção outcome:
outcome:
$risk_score = max(100 + if($severity = "HIGH", 10, 5) - if($severity = "LOW", 20, 0))
As operações matemáticas são permitidas nos seguintes tipos de operandos, desde que cada operando e a expressão aritmética completa estejam devidamente agregados (consulte Agregações):
- Campos de eventos numéricos
- Variáveis de marcadores de posição numéricos definidas na secção
events - Variáveis de resultados numéricos definidas na secção
outcome - Funções que devolvem números inteiros ou de vírgula flutuante
- Agregações que devolvem números inteiros ou de vírgula flutuante
O módulo não é permitido em números de vírgula flutuante.
Variáveis de marcadores de posição nos resultados
Ao calcular variáveis de resultados, pode usar variáveis de marcadores de posição que foram definidas na secção de eventos da sua consulta. Neste exemplo, vamos assumir que $email_sent_bytes foi definido na secção de eventos da regra:
Exemplo: evento único sem secção de correspondência
// No match section, so this is a single-event query. 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
Exemplo: vários eventos com secção de correspondência
match:
// This is a multi event query 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_eventVariáveis de resultados em expressões de atribuição de resultados
As variáveis de resultado podem ser usadas para derivar outras variáveis de resultado, semelhantes às variáveis de marcadores de posição definidas na secção events. Pode fazer referência a uma variável de resultado na atribuição de outra variável de resultado com um token $ seguido do nome da variável. As variáveis de resultado têm de ser definidas antes de poderem ser referenciadas no texto da consulta. Quando usadas numa expressão de atribuição, as variáveis de resultado não podem ser agregadas (consulte Agregações).
No exemplo seguinte, a variável de resultado $risk_score deriva o respetivo valor da variável de resultado $event_count:
Exemplo: variável de resultado derivada de outra variável de resultado
match: // This is a multi event query 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 2 outcomes combined. $risk_score2 = if(count($login.metadata.event_timestamp.seconds) > 5, "SEVERE", "MODERATE") condition: $e
As variáveis de resultado podem ser usadas em qualquer tipo de expressão no lado direito de uma atribuição de resultado, exceto nas seguintes expressões:
- Agregações
Arrays.length()chamadas de funções- Com modificadores
anyouall
Agregações
Os campos de eventos repetidos são valores não escalares. Ou seja, uma única variável aponta para vários valores. Por exemplo, a variável de campo de evento $e.target.ip é um campo repetido e pode ter zero, um ou vários valores de IP. É um valor não escalar. Por outro lado, a variável do campo de evento $e.principal.hostname não é um campo repetido e só tem 1 valor (ou seja, um valor escalar).
Da mesma forma, os campos de eventos não repetidos e os campos de eventos repetidos usados na secção outcome de uma consulta com um período de correspondência são valores não escalares.
Exemplo: agrupar eventos com secção de correspondência e campo não repetido
A seguinte consulta agrupa eventos através de uma secção `match` e refere-se a um campo de evento não repetido na secção `outcome`:
rule OutcomeAndMatchWindow{
...
match:
$userid over 5m
outcome:
$hostnames = array($e.principal.hostname)
...
}Qualquer janela de 5 minutos durante a qual a consulta é executada pode conter zero, um ou vários eventos. A secção de resultados
funciona em todos os eventos num período de correspondência. Qualquer variável de campo de evento referida na secção de resultados pode apontar para zero, um ou vários valores do campo em cada evento no período de correspondência.
Por exemplo, se um período de 5 minutos contiver 5 eventos $e, $e.principal.hostname
na secção de resultados aponta para cinco nomes de anfitrião diferentes. A variável do campo de evento
$e.principal.hostname é tratada como um valor não escalar na secção outcome desta consulta.
Uma vez que as variáveis de resultado têm sempre de gerar um único valor escalar, qualquer valor não escalar do qual uma atribuição de resultado dependa tem de ser agregado para gerar um único valor escalar. Numa secção de resultados, os seguintes são valores não escalares e têm de ser agregados:
- Campos de eventos (repetidos ou não repetidos) quando a consulta usa uma secção
match - Marcadores de posição de eventos (repetidos ou não repetidos) quando a consulta usa uma secção
match - Campos de eventos repetidos quando a consulta não usa uma secção
match - Marcadores de posição de eventos repetidos quando a consulta não usa uma secção
match
Os campos de eventos escalares, os marcadores de posição de eventos escalares e as constantes podem ser incluídos em funções de agregação em consultas que não incluem uma secção match. No entanto, na maioria dos casos, estas agregações devolvem o valor envolvido, o que as torna desnecessárias.
Uma exceção é a agregação array(), que pode usar para converter explicitamente um valor escalar num conjunto.
As variáveis de resultados são tratadas como agregações: não podem ser reagregadas quando são referidas noutra atribuição de resultados.
Pode usar as seguintes funções de agregação:
| Função de agregação | Descrição |
|---|---|
max() |
Produz o máximo de todos os valores possíveis. Funciona apenas com números inteiros e de vírgula flutuante. |
min() |
Produz o mínimo de todos os valores possíveis. Funciona apenas com números inteiros e de vírgula flutuante. |
sum() |
Produz a soma de todos os valores possíveis. Funciona apenas com números inteiros e de vírgula flutuante. |
count_distinct() |
Recolhe todos os valores possíveis e, em seguida, produz a contagem distinta de valores possíveis. |
count() |
Comporta-se como `count_distinct()`, mas devolve uma contagem não distinta de valores possíveis. |
array_distinct() |
Recolhe todos os valores distintos possíveis e, em seguida, produz uma lista destes valores. Trunca a lista de valores distintos para 1000 elementos aleatórios. A anulação da duplicagem para obter uma lista distinta é aplicada primeiro e, em seguida, é aplicada a truncagem. |
array() |
Comporta-se como array_distinct(), mas devolve uma lista de valores não distintos. Também trunca a lista de valores para 1000 elementos aleatórios. |
A função de agregação é importante quando uma regra inclui uma secção condition que especifica que têm de existir vários eventos, porque a função de agregação opera em todos os eventos que geraram a deteção.
Exemplo: condição para vários eventos
Segue-se um exemplo de uma condição para vários eventos. Se a secção de resultados e condições contiver:
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
Uma vez que a secção `condition` requer que exista mais do que um `event` para cada deteção, as funções de agregação operam em vários eventos. Suponhamos que os seguintes eventos geraram uma deteção:
event: // UDM event 1 asset_id="asset-a" event: // UDM event 2 asset_id="asset-b" event: // UDM event 3 asset_id="asset-b"
Em seguida, os valores dos seus resultados serão:
- $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"]
Limitações
A secção
outcomenão pode fazer referência a uma nova variável de marcador de posição que ainda não tenha sido definida na secçãoeventsou na secçãooutcome.A secção
outcomenão pode usar variáveis de eventos que não tenham sido definidas na secçãoevents.A secção
outcomepode usar um campo de evento que não foi usado na secçãoevents, desde que a variável de evento à qual o campo de evento pertence já tenha sido definida na secçãoevents.A secção
outcomesó pode correlacionar variáveis de eventos que já tenham sido correlacionadas na secçãoevents. As correlações ocorrem quando dois campos de eventos de variáveis de eventos diferentes são equiparados.
Consulte o artigo Vista geral do YARA-L 2.0 para ver exemplos da secção outcome.
Consulte o artigo Crie estatísticas sensíveis ao contexto para ver detalhes sobre a eliminação de duplicações de deteção na secção outcome.
O que se segue?
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.