◇ OpenCyber Academy
Graduação · Capítulo 27 · Português

Capítulo 27 — Verificação

Ensino gratuito e aberto para quem deseja proteger pessoas e tecnologias. Não é preciso criar uma conta para estudar ou consultar as respostas.

Capítulo 27 — Verificação

Mapa da aula

Aula 27 publicada. Mapa, exemplo, EX079.

flowchart TD
  N0["27.1 Reteste"]
  N1["27.2 Laboratório de cobertura"]
  N2["27.3 Encerramento"]
  N3["27.4 Parcial"]
  N4["27.5 Congelamento do escopo"]
  N5["27.6 Comunicar"]
  N6["27.7 Histórias de GAP para o SOC"]
  N7["27.8 Agenda de retestes"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
  N7 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX079"]

Desenho lógico

flowchart LR
  N0["27.1 Reteste"]
  N1["27.2 Laboratório de cobertura"]
  N2["27.3 Encerramento"]
  N3["27.4 Parcial"]
  N4["27.5 Congelamento do escopo"]
  N5["27.6 Comunicar"]
  N6["27.7 Histórias de GAP para o SOC"]
  N7["27.8 Agenda de retestes"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX079"]
[27.1 Reteste]
    |
    v
[27.2 Laboratório de cobertura]
    |
    v
[27.3 Encerramento]
    |
    v
[27.4 Parcial]
    |
    v
[27.5 Congelamento do escopo]
    |
    v
[27.6 Comunicar]
    |
    v
[27.7 Histórias de GAP para o SOC]
    |
    v
[27.8 Agenda de retestes]
    |
    v
[Exemplo resolvido] --> [Exercício EX079]

Objetivos de aprendizagem

Você vai (1) planejar retestes; (2) ler os laboratórios de cobertura; (3) encerrar somente com evidência.

27.1 Reteste

Mesmos métodos, janela acordada. Um reteste repete os passos originais da prova dentro de uma janela que o responsável e o testador aceitaram quando o achado foi registrado. Mudar o método no meio do reteste torna desonesta uma alegação de FIXED, porque o responsável pode ter corrigido apenas o caminho que foi demonstrado. Sam reserva a janela quando o achado chega, normalmente para cerca de duas semanas depois, para que a agenda não espere o pânico. Se o build testado tiver mudado, o reteste registra essa mudança em vez de inventar uma aprovação. O objetivo do exercício é a verdade sobre o encerramento, não uma caixa de seleção verde.

27.2 Laboratório de cobertura

O lab_coverage marca a T1190 como GAP.

"""Lab 27: summarise synthetic purple-team results per ATT&CK technique."""
runs = [("T1078",True),("T1078",True),("T1078",False),("T1566",True),("T1566",False),("T1190",False),("T1190",False)]
from collections import defaultdict
d = defaultdict(lambda:[0,0])
for t, hit in runs: d[t][1]+=1; d[t][0]+=hit
for t in sorted(d): k,n=d[t]; print(f"{t} detected {k}/{n} {'GAP' if k/n<0.5 else 'ok'}")

Execute com python3 lab_coverage.py. Saída verificada:

T1078 detected 2/3 ok
T1190 detected 0/2 GAP
T1566 detected 1/2 ok

O laboratório percorre uma lista curta de execuções sintéticas de purple team e imprime com que frequência cada técnica foi detectada. Os estudantes leem as proporções impressas antes de discutir ferramentas. Uma técnica que nunca é detectada é uma história de lacuna, e não um motivo para declarar que o SOC está quebrado. A orientação de Sam se concentra no enquadramento: amostras pequenas ainda podem justificar instrumentação quando a fonte de log já existe. Os estudantes que só celebram taxas altas de detecção perdem o valor de engenharia de uma falha honesta.

27.3 Encerramento

FIXED com evidência ou risco aceito assinado. O encerramento é um status FIXED sustentado pela transcrição de um reteste ou uma assinatura de risco aceito de alguém com autoridade para assumir o risco residual. Qualquer outra coisa deixa o ticket aberto. Sam se recusa a marcar FIXED a partir de um "corrigimos" verbal sem a mesma requisição que provou o problema. Risco aceito não é uma reprovação branda; é uma decisão documentada, com prazo de validade e um responsável. O FindingsDesk não deixa um ticket desaparecer num vago estado de "monitoramento" sem um desses dois finais.

27.4 Parcial

STILL OPEN mantém o ticket vivo. Quando um reteste mostra que o caminho foi estreitado, mas não fechado, o status continua STILL OPEN e o ticket permanece na fila do responsável. O progresso parcial é registrado nas notas, para que ninguém finja que o trabalho não aconteceu, mas progresso não é encerramento. Sam certa vez viu uma equipe comemorar uma regra de WAF que bloqueava o payload antigo dele enquanto uma variante com um caractere diferente ainda funcionava; o ticket continuou aberto e a comemoração passou para a correção seguinte. A honestidade sobre estados parciais impede que a liderança declare vitória num painel que mente.

27.5 Congelamento do escopo

Nenhuma nova caçada no dia do reteste. O dia do reteste serve para verificar achados conhecidos, e não para abrir uma nova caçada. Novas pistas vão para uma nota de estacionamento destinada à próxima janela de engajamento. O congelamento protege a janela de mudanças do responsável e mantém coerente o arquivo de evidências. Sam já viu retestes virarem dias de descoberta espalhados que não produziram nem um FIXED limpo nem um STILL OPEN limpo. A regra é publicada no convite de agenda do reteste, para que ninguém alegue surpresa. Se mesmo assim surgir uma pista nova crítica, ela vira um ticket de emergência separado, com as próprias aprovações, em vez de pegar carona no reteste.

27.6 Comunicar

Nota ao responsável no mesmo dia. Depois de um reteste, o responsável recebe no mesmo dia uma nota que declara FIXED, STILL OPEN ou risco aceito pendente, com um link para a transcrição. Esperar o relatório semanal cria boatos e trabalho duplicado. Sam escreve a nota antes de fechar o notebook, mesmo quando a notícia é decepcionante. A nota nomeia o hash do cartão de método, para que o responsável confirme que o mesmo build foi testado. Rapidez, aqui, é cortesia, não pressão. Uma nota atrasada obriga o responsável a perguntar aos colegas o que aconteceu, e é assim que começam as histórias erradas sobre status.

27.7 Histórias de GAP para o SOC

As histórias de GAP oferecidas ao SOC incluem fonte de log, técnica e uma ideia de detecção de exemplo — e não uma exigência de "comprar uma ferramenta". A nota de Sam sobre a T1190 apontava para os logs do WAF e da origem, já licenciados. Uma história de lacuna útil diz ao SOC o que observar com o que ele já possui. O texto de Sam sobre a T1190 nomeava os logs de bypass do WAF e os logs de acesso da origem, ambos já licenciados, e esboçava uma ideia de detecção que usava esses campos. Exigir um novo produto numa nota de lacuna costuma travar a conversa. Os engenheiros de detecção respondem mais rápido quando o pedido é concreto e barato. O item de backlog que veio em seguida citou a nota de Sam literalmente.

27.8 Agenda de retestes

As janelas de reteste são reservadas quando os achados são registrados, e não depois que os responsáveis entram em pânico. O modelo de Sam sugere uma data 14 dias depois. Reservar cedo transforma o reteste de uma crise numa rotina. O modelo propõe um intervalo de catorze dias, que dá aos responsáveis tempo para corrigir sem inventar um teatro de urgência. Se o responsável precisar de mais tempo, ele diz isso no ticket e a agenda muda com um motivo anexado. O administrador de Sam certa vez tentou empilhar cinco retestes numa só sexta-feira; a visão da agenda deixou a sobrecarga evidente antes que alguém se esgotasse. Janelas previsíveis são a forma de a verificação continuar gentil.

27.9 Do GAP ao backlog

As linhas GAP criam itens no backlog de detecção com ids de técnica. O PulseMap aponta para esses itens. Toda linha GAP no PulseMap precisa apontar para um item do backlog de detecção que carregue o mesmo identificador de técnica. O link é bidirecional, para que o refinamento encontre órfãos em qualquer direção. Sam registra um defeito de plataforma quando um GAP passa uma sprint sem id de backlog. O defeito é sobre o processo, e não sobre culpar o analista que registrou a lacuna. Os links impedem que o resultado do purple team vire um cemitério de capturas de tela.

27.10 A lacuna da T1190 vira um spike

O GAP da T1190 com n=2 vira uma história de spike de detecção: "instrumentar os logs de bypass do WAF". Duas semanas depois, o SOC tem uma regra em homologação. Um n pequeno ainda pode impulsionar a engenharia se for enquadrado como lacuna, e não como profecia de desastre. Duas falhas pareceriam fracas num slide sobre porcentagens de cobertura. Enquadradas como uma lacuna com uma fonte de log nomeada, elas viraram um spike de instrumentação de duas semanas que levou uma regra para homologação. O texto de Sam evitou palavras como "cego" e "falha crítica" e se ateve ao que estava faltando. O líder do SOC disse depois que o tom foi o motivo de a história ter andado. O tamanho da evidência e a utilidade da evidência são perguntas diferentes.

27.11 Hash do método nos convites

Os convites de agenda de reteste incluem o hash do cartão de método, para que os responsáveis preparem o mesmo build. A divergência de versões é inimiga de um FIXED honesto. Os responsáveis às vezes corrigem um build diferente daquele que Sam testou. Colocar um prefixo de oito caracteres do SHA-256 no convite força a divergência a aparecer antes de a sessão começar. Se os hashes diferirem, o reteste ou muda de alvo ou registra a divergência explicitamente. Sam prefere remarcar a carimbar FIXED num primo do build vulnerável. A honestidade sobre versões faz parte da ética da verificação.

27.12 Links bidirecionais de GAP

Os itens do backlog de detecção apontam nos dois sentidos para as linhas GAP do PulseMap. Um link de mão única morre em silêncio quando alguém renomeia um ticket. Links bidirecionais permitem que qualquer um dos lados perceba uma quebra durante o refinamento. A verificação semanal de Sam é uma consulta de cinco minutos por linhas GAP sem id de backlog e por itens de backlog cujo link para o PulseMap dá 404. Consertar essas quebras é tedioso e necessário. O valor do purple team está, em grande parte, no encanamento que mantém os sinais ligados ao trabalho. Quando os dois sentidos resolvem, um engenheiro de detecção consegue ir de uma falha até um ticket sem perguntar a Sam para onde foi a captura de tela.

27.13 Prefixos de hash nos convites

Os hashes dos cartões de método nos convites são prefixos SHA-256 de oito caracteres hexadecimais — o suficiente para perceber divergências. Oito caracteres hexadecimais são curtos o bastante para colar num campo de agenda e longos o bastante para tornar improváveis colisões acidentais dentro de um engajamento. Os digests completos ficam no caderno para quem quiser recalculá-los. Sam certa vez pegou uma divergência porque o prefixo no convite já não correspondia ao cartão no compartilhamento. O responsável tinha refeito o build durante a noite e esquecido de avisar. Prefixos curtos se pagam quando evitam um falso FIXED.

27.14 Refinamento do backlog com o PulseMap

O refinamento do backlog de detecção inclui o PulseMap uma vez por sprint. Linhas GAP sem ids de backlog são defeitos do refinamento, e não do SOC. Sam registra esses defeitos contra o processo da plataforma. Um refinamento que ignora o PulseMap vai inventando aos poucos um backlog paralelo de capturas de tela. Incluir a visão de GAP uma vez por sprint mantém honestas as duas listas. Quando Sam encontra um GAP órfão, ele registra o defeito contra o processo que deveria tê-lo vinculado, e não contra o analista que estava ocupado naquela semana. Defeitos de processo são mais baratos de corrigir do que a culpa cultural. A sprint termina com todo GAP aberto apontando para algum lugar real.

Exemplo resolvido (TRB sintético)

O laboratório no estilo PulseMap mostra a T1190 com 0/2, GAP; o SOC prioriza a engenharia de detecção voltada ao público.

Caso sintético — Riverstone Transit Bank (TRB). O banco, Sam Ito, TrackScope/FindingsDesk/PulseMap e todos os números são inventados para fins didáticos.

Erros e limites

Este livro não concede nenhuma autoridade para testar bancos ou sistemas de pagamento reais. Os laboratórios usam apenas endereços de faixas de documentação e dados sintéticos; código de exploit nunca é fornecido.

Exercícios

Síntese

A verificação combina a honestidade do reteste com as lacunas de cobertura de detecção.

Continue estudando — capítulo 27 de 40

← Capítulo 26 (rascunho) · Índice de capítulos do curso · Capítulo 28 (rascunho) →