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, é necessário 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 de 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 tipos enumerados precisam ser escritos como strings de texto em maiúsculas que correspondam exatamente às definições válidas do dicionário do 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 true ou false (não diferenciam maiúsculas de minúsculas, sem aspas), como no exemplo a seguir:

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

Números inteiros e valores numéricos

Os 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 flutuantes e decimais

Para campos UDM do tipo flutuante ou duplo, 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 no 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 uma string literal tiver barras invertidas ou aspas duplas, use uma barra invertida (\\) antes desses caracteres para que eles sejam ignorados, como no exemplo a seguir:

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

  • Pesquise caminhos de arquivo 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 de regex entre barras (/ /) em vez de aspas duplas. O Google SecOps usa o mecanismo de expressão regular RE2 padrão:

  • Corresponda qualquer IP principal no intervalo 10.x.x.x, como este:

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

    target.process.command_line = /\bpsexec(\.exe)?\b/ nocase
    
  • Corresponda nomes de host de DNS dinâmico que seguem 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. É possível usar parênteses () para agrupar explicitamente expressões e controlar a precedência de 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 as condições OR das 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 do UDM. Cada entrada armazena um par de chave-valor:

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

  • labels campos: podem 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"

Regex avançada e correspondência de valores que não são strings 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 de campo protobuf totalmente qualificado:

  • Corresponder 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
    
  • Pesquise em várias chaves dinâmicas que correspondem a um prefixo de regex:

    additional.fields.key = /^myKeyNumber_.*/
    
  • Verifique se uma chave existe, independentemente 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 de UDM ao mesmo tempo sem digitar cada campo individualmente.

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

ip = "1.2.3.4"

É possível fazer a correspondência de um campo agrupado usando uma expressão regular e o operador nocase. Também é possível usar listas de referência. Os campos agrupados também podem ser usados em combinação com campos de UDM regulares, como mostrado no exemplo a seguir:

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

Tipos de campos de UDM agrupados

É possível pesquisar em todos os seguintes campos de UDM agrupados:

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

É possível adicionar comentários no editor de pesquisa para documentar uma lógica de busca complexa ou desativar temporariamente as condições durante os testes:

  • Comentários de linha única: use duas barras (//) como prefixo do texto do comentário. Tudo o que estiver depois das barras nessa linha será ignorado.
  • Comentários de 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.