Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

03 - TH.8 - Técnica de Stack Counting

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione video: https://youtu.be/... no frontmatter da nota.

TH.8 - Técnica de Stack Counting

Controle TH.8 do grupo HNT (Threat Hunting) da seção "15 - Framework CTH - Controles".
Deriva do Capítulo 12 do PDF de referência, seção 12.3. Formaliza a técnica de stack counting, que
conta ocorrências por pilha de atributos e concentra a investigação nos eventos raros, sobretudo
onde as baselines do INS.5 mostram comportamento estatisticamente previsível.

1. Contexto e Posicionamento no Framework CTH

O stack counting explora uma propriedade estatística dos ambientes corporativos: a maioria dos eventos segue distribuições previsíveis, com poucos valores dominando e uma longa cauda de valores raros. Poucos processos respondem por quase toda a execução, poucos destinos recebem quase todo o tráfego, e as mesmas tarefas agendadas aparecem em todas as máquinas da imagem padrão. Nesse cenário, eventos estatisticamente raros são candidatos naturais a investigação, porque representam desvios do padrão que podem indicar atividade adversária.

No Framework CTH, o TH.8 é uma técnica de execução que materializa o princípio do outlier: contar ocorrências de valores em campos de eventos, ordenar por frequência e examinar sistematicamente as caudas da distribuição. O TH.8.2 orienta começar por campos como image_loaded, process_name, dest_ip e dns_query, sinalizando valores com contagens muito baixas; o TH.8.3 acrescenta limiares estatísticos por desvio padrão ou percentis, com atenção aos extremos abaixo do percentil 5 e acima do percentil 95.

A técnica se apoia diretamente nas baselines do INS.5, que definem o que é normal em cada população de ativos, e complementa o TH.7 e o TH.9 no conjunto de agregação do grupo HNT. Enquanto o grouping pergunta "onde mais esse artefato apareceu", o stack counting pergunta "o que aparece pouco demais ou demais para ser normal", e os dois métodos frequentemente se alternam dentro do mesmo hunt.

2. Definição e Origem Prática da Técnica

Stack counting é a contagem de ocorrências por pilha de atributos, seguida do exame dos valores raros no topo e na base da distribuição ordenada. A pilha é o par campo e valor agregado, como "todos os processos executados nas estações, contados por nome e caminho do executável". O produto da técnica é uma tabela ordenada por frequência, em que os valores mais raros sobem para o topo da análise, independentemente de parecerem suspeitos à primeira vista.

A técnica tem origem na prática da comunidade de threat hunting, consolidada por caçadores que operavam ambientes corporativos de dezenas de milhares de endpoints no meio da década de 2010. A percepção de base é modesta e poderosa: adversários precisam executar algo, e o que executam não está na cauda dominante da distribuição, porque software legítimo de massa domina essa cauda. Publicações comunitárias sobre caça a partir de pilhas de processos, drivers e tarefas agendadas transformaram o método em prática padrão de mercado, sem exigir ferramentas especiais além de agregações que qualquer SIEM oferece.

O método aplica a regra de Pareto em versão defensiva, como registra o próprio TH.8: focar nos valores cuja frequência difere significativamente do esperado. A raridade não é veredito, é prioridade. Um processo raro pode ser software de nicho instalado por um desenvolvedor; a função do stack counting é garantir que nada raro passe sem uma decisão documentada de benignidade ou malícia.

3. Pilhas Úteis na Prática

Pilha Campos agregados O que revela Fonte de ruído típica
Processos por host FileName, FolderPath Binários raros, malware dropado, ferramentas ofensivas Software de nicho instalado manualmente
Tarefas agendadas Nome da tarefa, ação, criador Persistência fora do padrão da imagem corporativa Agendamentos legítimos próprios de servidores
Drivers carregados image_loaded, assinatura Rootkits, drivers de ferramentas de ataque Drivers de VM e de ferramentas de desenvolvimento
Comandos PowerShell command_line, processo pai Execução codificada, download, enumeração em massa Automação legítima de TI com vocabulário similar
Destinos DNS dns_query Domínios novos, DGA, túneis DNS Domínios legítimos de novos serviços de SaaS
Combinação user e host usuário, host Contas logando em hosts fora do padrão Gestão de mudanças lenta gerando desvios benignos

A escolha da pilha deriva da hipótese do TH.6 e da população a analisar. A mesma pilha de processos que funciona em estações padronizadas vira ruído em servidores de aplicação, e por isso a segmentação da população é parte da definição da pilha, e não um ajuste posterior. O TH.8.1 exige ao menos uma pilha relevante por hipótese, com análise sistemática dos outliers, tanto os muito raros quanto os muito frequentes.

4. Passos Práticos de Aplicação

  • Escolher a pilha e a população: definir o campo ou a combinação de campos a contar e delimitar o escopo, por tipo de ativo, unidade organizacional ou janela de tempo. A delimitação é o que garante comparabilidade entre os valores contados.
  • Contar e ordenar: executar a agregação por frequência e ordenar do mais raro ao mais comum. O objetivo é um quadro compacto, com contagem total, número de hosts e de usuários por valor.
  • Investigar as caudas raras: para cada valor raro, abrir a trajetória completa, com hosts, usuários, primeira e última ocorrência e processo associado. Valores que aparecem uma única vez em uma única máquina merecem prioridade máxima.
  • Validar benignidade ou malícia: confrontar cada valor raro com o catálogo de software, as datas de rollout, as assinaturas digitais e, quando necessário, com o time de TI. A validação gera uma decisão documentada, e não uma impressão.
  • Documentar e converter: registrar o resultado do hunt, alimentar as whitelists com data de revisão, converter padrões maliciosos confirmados em detecções pelo DET.x e IOC para o TH.10.

A cadência recomendada é periódica e recorrente: pilhas de processos e tarefas agendadas aceitam execução mensal sem fadiga, enquanto pilhas de DNS e de comandos PowerShell rendem mais em janelas curtas e dirigidas por hipótese. O TH.8.4 formaliza a leitura temporal da pilha, comparando a distribuição de períodos consecutivos, e é essa leitura que revela propagação de malware em curso, visível como um valor raro cuja contagem cresce semana a semana.

5. Exemplo Completo: Processos Raros em Estações

Cenário derivado do TH.6: a hipótese é que um implant de persistência executa binário dropado em caminho de usuário nas estações. A pilha escolhida é a de processos executados em estações padronizadas, contados por nome e caminho, com janela de 30 dias e corte de raridade em cinco ocorrências.

// Pilha de processos raros em estações de trabalho, janela de 30 dias
DeviceProcessEvents
| where Timestamp > ago(30d)
| where DeviceName startswith "wks-"
| summarize Ocorrencias = count(),
            Hosts = dcount(DeviceName),
            Usuarios = dcount(InitiatingProcessAccountName)
    by FileName, FolderPath
| where Ocorrencias <= 5
| order by Ocorrencias asc

Em SPL, a mesma pilha é escrita com agregação de termos sobre o evento de criação de processo do Sysmon, mantendo o escopo nas estações pelo padrão de nome do host.

index=endpoint sourcetype=sysmon EventCode=1 host=wks-*
| stats count as ocorrencias dc(host) as hosts dc(user) as usuarios
        by process_name, process_path
| where ocorrencias <= 5
| sort + ocorrencias

A leitura segue a disciplina da técnica: o topo da tabela traz os valores mais raros, e cada um recebe uma decisão. Um binário de cliente VPN legado instalado uma vez é benigno documentado; um executável sem assinatura em %APPDATA% presente em três estações com o mesmo processo pai é suspeito e recebe pivoting pelo TH.7, com agregação por hash e por processo pai. O valor da técnica está na garantia de cobertura: nada raro fica sem decisão, mesmo sem alerta ou inteligência prévia associada.

A segunda pilha do mesmo hunt pode cobrir a fase de rede do implant. Destinos DNS raros expõem infraestrutura recém-registrada e canais de C2 pouco usados. O corte de raridade baixo, de três consultas, privilegia domínios tocados por poucas máquinas.

// Pilha de destinos DNS raros, janela de 7 dias
DeviceNetworkEvents
| where Timestamp > ago(7d)
| where isnotempty(RemoteUrl)
| summarize Consultas = count(), Hosts = dcount(DeviceName)
    by RemoteUrl
| where Consultas <= 3
| order by Consultas asc

6. Quando Funciona Bem e Quando Falha

O stack counting rende o máximo em ambientes padronizados, com imagens corporativas, catálogo de software controlado e rollout disciplinado. Nessas condições, a cauda dominante é de fato dominante, e qualquer valor raro salta aos olhos. A técnica é especialmente forte em pilhas de processos, tarefas agendadas, serviços e drivers, porque esses artefatos refletem diretamente a imagem base e raramente mudam sem gestão de mudança.

A técnica falha quando a população é heterogênea. Servidores são atípicos por natureza, cada um com seu conjunto próprio de serviços, e neles o conceito de "raro" perde sentido comparativo. Estações de desenvolvedores, filiais com ferramentas locais e ambientes pós-fusão sem padronização produzem caudas raras tão longas que a investigação de todas é inviável. A mitigação é segmentar: pilhas por tipo de ativo, por unidade organizacional ou por aplicação, cada uma com sua referência de normalidade, em vez de uma pilha global que mistura populações incomparáveis.

Há ainda a limitação conceitual de que raridade é frágil diante de adversário preparado. Ferramentas de Living off the Land executam a partir de binários legítimos já presentes na cauda dominante, e um ataque bem ensaiado pode parecer comum na pilha. Por isso o stack counting nunca é o único método do hunt: ele coexiste com o TH.7, que rastreia artefatos específicos, e com o TH.9, que compara comportamento entre entidades.

Situação Eficácia esperada da pilha Ajuste recomendado
Estações com imagem corporativa Alta Manter a pilha recorrente em cadência mensal
Servidores de aplicação Baixa Segmentar por função, com pilha própria por tier
Estações de desenvolvedores Baixa Excluir da pilha global ou criar pilha dedicada com revisão
Pós-fusão sem padronização Muito baixa Priorizar TH.7 e TH.9 até concluir a padronização
Detecção de propagação em curso Alta com pilha temporal Comparar janelas consecutivas, como orienta o TH.8.4

7. Variações da Técnica

A pilha dupla cruza dois atributos e reduz drasticamente o ruído da cauda rara. Contar processos por nome isola milhares de valores raros; contar pela combinação de processo pai e processo filho isola relações raras, que são muito mais informativas, pois um binário legítimo filho de um pai incomum é o padrão clássico de execução maliciosa.

DeviceProcessEvents
| where Timestamp > ago(30d) and DeviceName startswith "wks-"
| summarize Ocorrencias = count(), Hosts = dcount(DeviceName)
    by InitiatingProcessFileName, FileName
| where Ocorrencias <= 3
| order by Ocorrencias asc

A variação temporal compara a mesma pilha entre períodos, destacando valores novos no ambiente e valores cuja frequência cresceu abruptamente, como orienta o TH.8.4. A variação estatística, do TH.8.3, troca o corte fixo por limiares de percentil ou desvio padrão, e o nível avançado do TH.8.5 automatiza o monitoramento de outliers com modelos estatísticos, como z-score, IQR e isolation forest, transformando a técnica pontual em detecção contínua.

8. Conversão de Achados em Detecção

Todo valor raro validado gera um artefato do programa. O benigno documentado entra na whitelist com data de revisão e responsável, evitando que a mesma validação se repita a cada execução da pilha. O suspeito confirmado vira regra de detecção permanente pelo DET.x, IOC pelo TH.10 e, quando há comprometimento real, abertura no IR.x.

title: Execução de binário em caminho de usuário em estação
status: experimental
logsource:
    product: windows
    service: sysmon
detection:
    selection_path:
        Image|startswith: 'C:\Users\'
    filter_conhecidos:
        Image|endswith:
            - '\chrome.exe'
            - '\Teams.exe'
    condition: selection_path and not filter_conhecidos

A regra acima generaliza o padrão confirmado sem se prender ao hash único, cobrindo variantes que o stack counting não veria na próxima janela. O loop de melhoria fecha com o MET.x medindo quantas detecções permanentes nasceram de pilhas e com o AUT.x absorvendo as pilhas recorrentes em rotinas agendadas, liberando o hunter para as caudas realmente novas.

9. Salvaguardas por Nível de Maturidade

Nível Salvaguarda Prática operacional esperada
Básico TH.8.1 Contagem de frequência de ao menos um campo relevante por hipótese, com análise sistemática dos outliers
Básico TH.8.2 Agregações de termos para process_name, image_loaded, dest_ip e dns_query, sinalizando contagens baixas
Intermediário TH.8.3 Limiares estatísticos por percentil ou desvio padrão, sinalizando extremos da distribuição
Intermediário TH.8.4 Leitura temporal da pilha, comparando períodos e destacando valores novos e em crescimento
Avançado TH.8.5 Detecção contínua de outliers com modelos estatísticos sobre múltiplos campos, sem hipótese prévia

10. Erros Comuns e Integração com Outros Controles

  • Aplicar a pilha sobre população heterogênea sem segmentar, produzindo caudas raras longas demais para investigar e desestimulando a técnica.
  • Tratar raridade como veredito: evento raro é prioridade de investigação, e a malícia exige validação por evidência em cada caso.
  • Ignorar a cauda alta da distribuição, onde contagens anormalmente elevadas sinalizam propagação interna e picos de atividade automatizada.
  • Manter whitelist sem data de revisão, que cresce indefinidamente e transforma a pilha em tabela cega de exceções antigas.
  • Executar a mesma pilha única em todos os hunts, sem combinar pilhas complementares, como processos, tarefas agendadas e DNS, que revelam fases distintas do ataque.

A integração é direta com o INS.5, que fornece as baselines que dão significado estatístico à contagem, e com o TH.6, cuja hipótese define a pilha e o critério de raridade aceitável. O TH.7 recebe os valores raros suspeitos como âncoras de pivoting; o DAT.x garante a cobertura de telemetria que sustenta a contagem; o DET.x, o TH.10 e o IR.x recebem os achados convertidos; o AUT.x automatiza as pilhas recorrentes. Operado com essa disciplina, o stack counting é a técnica de melhor custo e benefício do grupo HNT para ambientes padronizados, pois exige apenas agregações básicas de SIEM e entrega cobertura ampla contra o desconhecido.