Sintaxe da secção de resultados

Suportado em:

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_event

Variá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 any ou all

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 outcome não pode fazer referência a uma nova variável de marcador de posição que ainda não tenha sido definida na secção events ou na secção outcome.

  • A secção outcome não pode usar variáveis de eventos que não tenham sido definidas na secção events.

  • A secção outcome pode usar um campo de evento que não foi usado na secção events, desde que a variável de evento à qual o campo de evento pertence já tenha sido definida na secção events.

  • A secção outcome só pode correlacionar variáveis de eventos que já tenham sido correlacionadas na secção events. 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

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais da Google SecOps.