Entender a sintaxe de pesquisa

Compatível com:

Este guia é destinado a analistas de segurança que querem configurar expressões de pesquisa (valores de dados, escapes, operadores etc.) no editor de consultas da página de pesquisa do SIEM.

Ao escrever expressões de pesquisa YARA-L 2.0 ou SQL no editor de consultas do Google Security Operations, você precisa formatar os valores de dados, operadores e sequências de escape de string de acordo com o tipo de dados exato do campo UDM de destino. Uma condição de pesquisa consiste em um nome de campo da UDM, um operador de comparação (=, !=, >, <, <=, >=) e um valor de dados formatado.

Formatar valores de dados por tipo de dados

Esta seção descreve:

Valores enumerados (enums)

Os enums precisam ser escritos como strings de texto em maiúsculas que correspondem exatamente às definições válidas do dicionário da UDM, entre aspas duplas ("), como no exemplo a seguir:

metadata.event_type = "NETWORK_CONNECTION" security_result.action = "BLOCK" network.ip_protocol = "TCP"

Valores booleanos

Os campos booleanos aceitam verdadeiro ou falso (não diferenciam maiúsculas de minúsculas, não exigem aspas), como no exemplo a seguir:

network.dns.response = true target.user.is_admin = false

Números inteiros e valores numéricos

Números inteiros e de porta são escritos como dígitos literais sem aspas duplas, como no exemplo a seguir:

target.port = 443 network.sent_bytes > 10485760

Valores de ponto flutuante e decimais

Para campos UDM do tipo float ou double, insira um número decimal ou inteiro sem aspas duplas, como no exemplo a seguir:

security_result.about.asset.vulnerabilities.cvss_base_score = 9.8

Strings de texto

Os valores de texto padrão precisam estar entre aspas duplas ("), como no exemplo a seguir:

metadata.product_name = "Google Cloud VPC Flow Logs" target.asset.asset_id = "srv-prod-us-central1-a"

Correspondência que não diferencia maiúsculas de minúsculas (nocase)

Por padrão, as comparações de strings em YARA-L 2.0 diferenciam maiúsculas de minúsculas. Para corresponder a qualquer combinação de caracteres maiúsculos e minúsculos, adicione o operador nocase diretamente ao final da condição, como no exemplo a seguir:

principal.hostname != "http-server" nocase principal.user.userid = "jdoe" nocase

Escape de string (\ e ")

Se um literal de string contiver barras invertidas ou aspas duplas, faça escape desses caracteres usando uma barra invertida inicial (\\), como no exemplo a seguir:

  • Use \\ para corresponder a uma barra invertida literal (\\).
  • Use \" para corresponder a uma aspa dupla literal (").

  • Pesquise caminhos de arquivos do Windows com barras invertidas de escape:

    principal.process.file.full_path = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
    
  • Pesquise linhas de comando que contenham aspas duplas incorporadas:

    target.process.command_line = "cmd.exe /c \"c:\\program files\\malicious.exe\""
    

Expressões regulares (sintaxe RE2)

Para pesquisar usando expressões regulares, coloque o padrão entre barras (/ /) em vez de aspas duplas. O Google SecOps usa o mecanismo de expressão regular RE2 padrão:

  • Corresponda a qualquer IP principal no intervalo 10.x.x.x, assim:

    principal.ip = /10\..*/
    
  • Pesquise a execução do PsExec com a extensão .exe opcional, sem diferenciar maiúsculas de minúsculas, como no exemplo a seguir:

    target.process.command_line = /\bpsexec(\.exe)?\b/ nocase
    
  • Corresponda a nomes de host DNS dinâmicos seguindo um padrão numerado, como no exemplo a seguir:

    principal.hostname = /dns-server-[0-9]+/ nocase
    

Lógica booleana e precedência de operadores

Combine várias condições de pesquisa usando os operadores AND, OR e NOT. Você pode usar parênteses () para agrupar expressões explicitamente e controlar a precedência da avaliação, conforme mostrado nos exemplos a seguir:

  • Pesquise eventos de login de usuários específicos em um host sensível, como no exemplo a seguir:

    metadata.event_type = "USER_LOGIN" AND target.hostname = "finance-db-prod"
    
    
  • Use parênteses para isolar condições OR de cadeias AND, como no exemplo a seguir:

    metadata.event_type = "PROCESS_LAUNCH" AND principal.process.file.full_path = /winword.exe/ nocase AND (target.process.file.full_path = /cmd.exe/ OR target.process.file.full_path = /powershell.exe/)
    

Pesquisar pares de chave-valor nos campos additional e labels

Os campos additional e labels servem como contêineres flexíveis para dados de eventos personalizados e atributos de fornecedores terceirizados que não são mapeados para campos padrão da UDM. Cada entrada armazena um par de chave-valor:

  • additional fields: pode conter vários pares de chave-valor por evento (additional.fields["key"] = "value").

  • labels fields: pode conter apenas um par de chave-valor por evento (labels["key"] = "value").

Correspondência exata de chave-valor (field["key"] = "value")

Use a sintaxe de colchetes para consultar diretamente uma chave específica e o valor de string correspondente, como no exemplo a seguir:

additional.fields["pod_name"] = "kube-scheduler-prod" metadata.ingestion_labels["MetadataKeyDeletion"] = "startup-script"

Correspondência avançada de expressões regulares e valores não string em campos additional

Se você precisar consultar valores numéricos/booleanos em campos additional ou corresponder chaves e valores usando expressões regulares, use o caminho totalmente qualificado do campo protobuf:

  • Corresponda a qualquer string de valor dentro do contêiner adicional por regex:

    additional.fields.value.string_value = /suspicious_payload_.*/ nocase
    
  • Corresponder valores booleanos ou numéricos em campos personalizados:

    additional.fields.value.bool_value = true additional.fields.value.number_value > 500
    
  • Pesquisar várias chaves dinâmicas que correspondem a um prefixo de regex:

    additional.fields.key = /^myKeyNumber_.*/
    
  • Verifique se uma chave existe, independente do valor:

    additional.fields["pod_name"] != ""
    
  • Use expressões regulares e nocase diretamente com a sintaxe de colchetes:

    additional.fields["pod_name"] = /br/
    additional.fields["pod_name"] = bar nocase
    
  • Combine vários pares de chave-valor additional.fields usando AND:

    additional.fields["pod_name"] = "kube-scheduler" AND additional.fields["namespace"] = "kube-system"
    

Pesquisar campos agrupados

Os campos agrupados são aliases para grupos de campos de UDM relacionados. É possível usá-los para consultar vários campos da UDM ao mesmo tempo sem digitar cada um deles individualmente.

O exemplo a seguir mostra como inserir uma consulta para corresponder aos campos comuns da UDM que podem conter o endereço IP especificado:

ip = "1.2.3.4"

É possível corresponder um campo agrupado usando uma expressão regular e o operador nocase. As listas de referência também são aceitas. Os campos agrupados também podem ser usados em combinação com campos normais da UDM, conforme mostrado no exemplo a seguir:

ip = "5.6.7.8" AND metadata.event_type = "NETWORK_CONNECTION"

Tipos de campos agrupados do UDM

Você pode pesquisar em todos os seguintes campos agrupados da UDM:

Nome do campo agrupado Campos de UDM associados
domain about.administrative_domain
about.asset.network_domain
network.dns.questions.name
network.dns_domain
principal.administrative_domain
principal.asset.network_domain
target.administrative_domain
target.asset.hostname
target.asset.network_domain
target.hostname
email intermediary.user.email_addresses
network.email.from
network.email.to
principal.user.email_addresses
security_result.about.user.email_addresses
target.user.email_addresses
file_path principal.file.full_path
principal.process.file.full_path
principal.process.parent_process.file.full_path
target.file.full_path
target.process.file.full_path
target.process.parent_process.file.full_path
hash about.file.md5
about.file.sha1
about.file.sha256
principal.process.file.md5
principal.process.file.sha1
principal.process.file.sha256
security_result.about.file.sha256
target.file.md5
target.file.sha1
target.file.sha256
target.process.file.md5
target.process.file.sha1
target.process.file.sha256
hostname intermediary.hostname
observer.hostname
principal.asset.hostname
principal.hostname
src.asset.hostname
src.hostname
target.asset.hostname
target.hostname
ip intermediary.ip
observer.ip
principal.artifact.ip
principal.asset.ip
principal.ip
src.artifact.ip
src.asset.ip
src.ip
target.artifact.ip
target.asset.ip
target.ip
namespace principal.namespace
src.namespace
target.namespace
process_id principal.process.parent_process.pid
principal.process.parent_process.product_specific_process_id
principal.process.pid
principal.process.product_specific_process_id
target.process.parent_process.pid
target.process.parent_process.product_specific_process_id
target.process.pid
target.process.product_specific_process_id
user about.user.userid
observer.user.userid
principal.user.user_display_name
principal.user.userid
principal.user.windows_sid
src.user.userid
target.user.user_display_name
target.user.userid
target.user.windows_sid

Adicionar comentários em uma consulta

Você pode adicionar comentários no editor de pesquisa para documentar uma lógica de busca complexa ou desativar temporariamente as condições durante o teste:

  • Comentários de linha única: adicione o prefixo de duas barras (//) ao texto do comentário. Tudo o que vier depois das barras nessa linha será ignorado.
  • Comentários em bloco de várias linhas: coloque o texto do comentário entre /* e */. Os comentários em bloco podem abranger várias linhas.

Exemplo:

metadata.event_type = "NETWORK_CONNECTION" AND
// Exclude approved corporate proxy traffic
target.ip != "192.0.2.100" AND
/* Uncomment the lines below when investigating specific lateral
   movement across subnet 10.240.0.0/16 */
// principal.ip = /10.240\..*/ AND
// network.sent_bytes > 5000000

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