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

02 - Heatmaps de Evolução Temporal

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

Heatmaps de Evolução Temporal

Nota do capítulo 20, dedicado às atualizações do MITRE ATT&CK e às ferramentas
de visualização do framework. Trata o heatmap do ATT&CK Navigator como registro
histórico do programa: cobertura por trimestre, comparação de períodos e
gradiente de cor por score, gerados automaticamente a partir de resultados de
Caldera e de plataformas BAS. Dialoga com a nota anterior de Criação de Camadas
de Cobertura, com Medição de Cobertura e Gaps em Tempo Real do capítulo 19 e
com os KPIs de cobertura do capítulo 11.

1. Contexto e Posicionamento na Biblioteca

Um heatmap pontual responde como estamos; um heatmap evolutivo responde para onde estamos indo, e é essa segunda pergunta que sustenta orçamento, prioriza engenharia e demonstra valor ao comitê. Esta nota ensina a usar o Navigator como instrumento de série temporal: cada trimestre fecha uma layer congelada, a comparação entre layers vira evidência de progresso ou regressão, e a geração deixa de ser manual para nascer dos resultados de testes automatizados de detecção.

A nota é a continuação direta de Criação de Camadas de Cobertura, que define o formato de layer e os três tipos de camada. Aqui o foco muda da construção manual para o pipeline: como extrair resultados de Caldera e de ferramentas de BAS, como converter esses resultados em scores, como publicar o heatmap trimestral e como evitar que a automação codifique erros com eficiência crescente.

2. Heatmap como Registro de Evolução

O heatmap do Navigator colore cada técnica segundo o score e o gradiente configurados, e é essa coloração, repetida ao longo do tempo, que forma a série temporal. A disciplina central é o congelamento: ao fim de cada trimestre, a layer corrente é copiada para um arquivo imutável com nome de período, por exemplo deteccao-enterprise-2026-T2.json, e o repositório Git garante que nenhum score histórico seja reescrito silenciosamente. A comparação só é honesta se os dois períodos forem reconstrutíveis do mesmo jeito.

O gradiente deve ser estável entre períodos, com minValue e maxValue fixos, porque mudar a escala muda as cores sem mudar os fatos e fabrica progresso visual falso. A recomendação da biblioteca é manter a escala 0 a 5 dos níveis de detecção e reservar cores fortes para os extremos, vermelho no zero e verde no cinco, com âmbar no meio. Comentários por técnica devem carregar a data da última evidência, o que permite a um revisor distinguir um score antigo confiável de um score que já deveria ter sido revalidado.

A escolha do gradiente merece decisão consciente, porque é ela que o comitê lê primeiro. A tabela abaixo compara três configurações usuais e quando cada uma serve melhor, lembrando que qualquer configuração vale para a série inteira uma vez adotada.

Configuração de gradiente Como funciona Melhor uso
Linear 0 a 5 em três cores Interpola vermelho, âmbar e verde pela média dos scores Relatório executivo trimestral padrão
Linear com faixas discretas Cada nível inteiro recebe cor fixa, sem interpolação Revisão técnica, onde 3 e 4 precisam se distinguir
Duas cores, ausência e cobertura Vermelho para score 0 e azul para score maior que 0 Mapa de gaps para recorte de adversários

3. Comparação de Períodos e Métricas de Evolução

O Navigator compara camadas pela operação de combinar duas layers com expressão de score configurada, mas a comparação interpretável costuma exigir cálculo externo. O padrão prático é carregar as duas layers em script, computar a diferença por técnica e produzir três camadas derivadas: a do período novo, a delta colorida por ganho e perda, e a média móvel de dois trimestres para amortecer ruído de tuning. A tabela a seguir lista as métricas de evolução que o grupo MET da biblioteca espera ver no relatório trimestral.

Métrica Cálculo sobre as layers Interpretação
Cobertura média Média dos scores do período Nível geral de maturidade
Delta líquida Soma das diferenças por técnica Progresso do trimestre
Regressões Técnicas com score menor que no período anterior Alerta de erosão ou tuning perdido
Gaps novos Técnicas de adversários prioritários que caíram para 0 Risco imediato para MAP.4
Área viva Técnicas pontuadas com evidência menor que 12 meses Qualidade real da medição

Regressão é a métrica mais valiosa e a mais ignorada. Cobertura cai por causas banais: regra desativada por ruído, plataforma migrada sem recriar analytics, técnica movida em nova versão do ATT&CK sem reatribuição. O heatmap evolutivo existe justamente para expor essas perdas na janela de um trimestre, antes que virem surpresa em teste de intrusão ou incidente.

O resumo de delta que acompanha o heatmap segue o formato abaixo, gerado pelo job de comparação e anexado à ata do comitê. Ele vale tanto quanto a imagem do mapa, porque é o resumo que sobrevive quando a reunião termina.

Delta 2026-T3 contra 2026-T2, dominio enterprise
Ganhos: 12 tecnicas subiram, media de 2,9 para 3,3
Regressoes: 4 tecnicas, causa comum desativacao de canal de logs
Gaps novos: 1 tecnica de adversario prioritario sem telemetria
Area fria: 87 tecnicas com evidencia maior que 2 trimestres
Acao proposta: reativar canal e converter 6 invisiveis em backlog DET

O congelamento do período vai além do arquivo de layer, e registrar o pacote completo é o que permite reabrir qualquer comparação meses depois.

  • A layer do período com o hash do commit, que identifica o arquivo exato usado nas comparações daquele ciclo.
  • O runs.jsonl dos testes que gerou os scores, com a versão do simulador registrada, porque a mesma técnica pode se comportar diferente entre versões do emulador.
  • O resumo de delta e a ata da revisão humana, com os ajustes manuais justificados, para que a diferença entre automação e decisão fique explícita.
  • A versão do ATT&CK vigente, porque a nota de migração deste capítulo precisa saber sobre qual base a série foi calculada.

4. Geração Automática a partir de Resultados de Testes

A fonte de dados ideal para o score de detecção é a execução controlada de técnicas contra a produção ou contra ambiente espelhado, registrada por ferramentas de duas famílias. A primeira família é a emulação com Caldera e Atomic Red Team, em que cada execução tem identificador de técnica ATT&CK e telemetria esperada conhecida. A segunda família é a plataforma de BAS comercial, que produz relatórios estruturados de sucesso e falha de detecção por técnica. Em ambos os casos, o contrato é o mesmo: uma tabela com techniqueID, tática, data da execução, resultado de alerta e identificador da regra que deveria ter alertado.

A conversão em score segue regra determinística para evitar subjetividade. Execução detectada automaticamente com regra conhecida gera no mínimo 4; detectada apenas em telemetria de caça manual gera 2; executada e invisível gera 0; técnica não executada no período mantém o score anterior, com o comentário marcando a idade da evidência. O script central do pipeline não conhece ATT&CK em profundidade: ele só liga resultados de teste a entradas de layer, e a inteligência fica nos dados de entrada.

import json, pathlib

FAIXA = {"detectado": 4, "telemetria": 2, "invisivel": 0}

def carregar_resultados(caminho):
    # Linhas: techniqueID, tactic, data, resultado, regra
    return [json.loads(l) for l in pathlib.Path(caminho).read_text().splitlines()]

def layer_base():
    base = json.loads(pathlib.Path("layer-2026-T2.json").read_text())
    for t in base["techniques"]:
        t["comment"] = t["comment"] + " | evidencia: " + str(t.get("idade", "n/a"))
    return base

def aplicar_resultados(layer, resultados):
    indice = {t["techniqueID"]: t for t in layer["techniques"]}
    for r in resultados:
        tec = indice.setdefault(r["techniqueID"], {
            "techniqueID": r["techniqueID"], "score": 0, "comment": ""
        })
        tec["score"] = FAIXA[r["resultado"]]
        tec["comment"] = "Teste {0} em {1}; regra {2}".format(
            r["resultado"], r["data"], r.get("regra", "sem regra"))
    layer["techniques"] = list(indice.values())
    layer["name"] = layer["name"].replace("2026-T2", "2026-T3")
    return layer

if __name__ == "__main__":
    atual = aplicar_resultados(layer_base(), carregar_resultados("caldera_runs.jsonl"))
    pathlib.Path("layer-2026-T3.json").write_text(json.dumps(atual, indent=2))

Duas precauções mantêm essa automação honesta. A primeira é exigir par de execução e verificação: um teste que não pode provar que a telemetria chegou ao SIEM não pode baixar score, porque o falso negativo pode estar no coletor e não na regra. A segunda é manter o manual disponível: técnica que o simulador não suporta continua sendo pontuada por revisão humana, e a layer registra no metadata que aquela evidência é manual e não automatizada.

5. Fluxo de Geração Automática do Heatmap Trimestral

O fluxo completo, aplicado na cadência trimestral, tem seis passos que viram jobs encadeados. A sequência abaixo é o contrato do pipeline e vale tanto para Caldera quanto para BAS, trocando-se apenas o conector de entrada.

1. No dia 1 do trimestre, o job extrai do Caldera (API) e do BAS os resultados
   do trimestre fechado e grava runs.jsonl versionado.
2. O conector normaliza identificadores para o ATT&CK vigente, resolvendo
   técnicas movidas ou renomeadas conforme a nota de Migração de Mapeamentos.
3. O construtor de layer aplica a regra de score determinística sobre a layer
   base do trimestre anterior e grava layer-YYYY-TN.json proposta.
4. O job de comparação gera a delta contra o trimestre anterior e monta um
   resumo: ganhos, regressões e gaps de adversários prioritários.
5. Um humano revisa a proposta no Navigator, ajusta casos de borda e aprova
   o commit, com comentários citando tickets de evidência.
6. A layer aprovada é publicada no diretório de períodos e o dashboard do
   comitê aponta sempre para a layer do trimestre corrente.

A cadência pode ser mais fina sem custo grande: mensal para o recorte de adversários prioritários, que muda rápido conforme a CTI, e trimestral para a cobertura completa, que muda devagar. O erro a evitar é rodar o pipeline de ponta a ponta sem revisão humana: a delta trimestral é exatamente onde anomalias de automação aparecem, como dezena de técnicas rebaixadas por um simulador que parou de alcançar os agentes.

6. Portões de Qualidade do Pipeline

Automatizar a geração sem portões de qualidade apenas industrializa erro. Cada job do pipeline deve parar e alertar quando uma das condições abaixo ocorre, e o alerta deve exigir decisão humana antes de publicar a layer. O conjunto é pequeno e cobre as falhas observadas na prática.

  • Divergência de escala: o construtor detecta gradientes com minValue ou maxValue diferentes entre a layer base e a proposta, e bloqueia a publicação até alguém confirmar a mudança consciente de escala.
  • Volume anômalo de mudanças: mais de 15 por cento das técnicas mudando de score num único ciclo dispara revisão, porque o esperado é evolução gradual e não reescrita do mapa.
  • Regressões sem explicação: toda técnica com queda de score precisa carregar resultado de teste correspondente no runs.jsonl, e queda sem teste é tratada como defeito do conector.
  • Evidência vencida: técnicas cuja última evidência tem mais de dois trimestres são marcadas na legenda como área fria, impedindo que cobertura antiga seja exibida como atual.
  • Falha de par de execução: teste que não encontrou a telemetria esperada no SIEM dentro da janela acordada é marcado como inválido, e não como invisível, até verificação do coletor.

Esses portões transformam o pipeline em sistema auditável. Quando o comitê questiona um número, a resposta é o portão que aprovou o dado, e a discussão muda de confiança genérica para verificação pontual.

7. Caso Prático: Do Teste Atomic Red Team ao Delta

Considere o trimestre que fecha em 30 de setembro de 2026. O time executou o perfil de Atomic Red Team contra dez endpoints canário, cobrindo 45 técnicas, e o Caldera rodou duas sequências de emulação de APT29. O resultado bruto mostra 28 execuções detectadas automaticamente, 9 visíveis apenas em telemetria de caça, 6 invisíveis e 2 invalidadas por falha de coletor. O conector converte tudo em scores, o construtor gera a layer proposta, e a comparação contra o T2 revela: média subiu de 2,9 para 3,3, quatro regressões, todas rastreadas a uma desativação acidental de canal de logs no SIEM durante migração de índices, e um gap novo em T1078.004 porque o adversário prioritário entrou na lista no trimestre.

Esse caso ilustra o valor real da série temporal: o número que moveu o comitê não foi a média que subiu, foi a descoberta de que uma mudança de infraestrutura de logs tinha apagado detecções três semanas antes, invisível a qualquer relatório pontual. A delta também virou requisito de trabalho para o time de detecção, com as 6 execuções invisíveis convertidas em backlog priorizado pela relevância para adversários.

8. Erros Comuns e Pontos de Atenção

O erro estrutural é deixar a escala de cores mudar entre períodos, o que compara cores em vez de comparar scores. O segundo é pontuar por volume de testes executados em vez de por resultado de detecção, transformando o heatmap em mapa de atividade do simulador. Um terceiro erro é ignorar técnicas não testadas: elas devem carregar o score anterior com idade de evidência registrada, porque tratá-las como zero destrói a série e tratá-las como cinco fabrica cobertura.

Também é comum automatizar a geração e esquecer a revisão, deixando regressões de coletor serem publicadas como fato no comitê. Outro deslize frequente é misturar em uma única série recortes com plataformas diferentes, por exemplo comparar um trimestre filtrado só de Windows com o trimestre anterior de domínio completo, e anunciar queda que é diferença de recorte. Por fim, cuidado com a tentação de publicar heatmaps diários: sem janelas acordadas, a série vira ruído, e o comitê para de olhar.

9. Integração com o Restante da Biblioteca

O pipeline desta nota alimenta diretamente os KPIs de CTI do capítulo 11, em particular a métrica de cobertura, e fornece a evidência de evolução que o controle MAP.5 do Framework CTH exige a cada ciclo. A conexão com o capítulo 19 é operacional: BAS contínuo e medição de gaps em tempo real são as fontes de dado que tornam o heatmap trimestral barato. Com o capítulo 18, a interface é o repositório de regras, cujos identificadores aparecem nos metadados das layers e permitem rastrear qualquer mudança de score até o commit que a causou.

No plano mais amplo da biblioteca, esta nota fecha o ciclo iniciado em Criação de Camadas de Cobertura: camadas definem a medição, heatmaps evolutivos provam que a medição anda, e a nota de Histórico de Versões e Impactos Operacionais deste mesmo capítulo garante que a base do mapa, o próprio ATT&CK, mude sem quebrar a série.