OpenCyber Academy
Graduação · Capítulo 25 · Português
Código do curso: OCA-114Capítulo 25: OCA-114-C025

Capítulo 25 — Laboratório I

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

Mapa da aula

Aula 25 publicada. Mapa, exemplo, EX073.

flowchart TD
  N0["25.1 O experimento"]
  N1["25.2 Interpretando a saída"]
  N2["25.3 Relato honesto"]
  N3["Síntese"]
  N0 --> N1 --> N2 --> N3
  N3 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX073"]

Desenho lógico

flowchart LR
  N0["25.1 O experimento"]
  N1["25.2 Interpretando a saída"]
  N2["25.3 Relato honesto"]
  N3["Síntese"]
  N0 --> N1 --> N2 --> N3 --> Q["EX073"]
[25.1 O experimento]
    |
    v
[25.2 Interpretando a saída]
    |
    v
[25.3 Relato honesto]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX073]

Objetivos de aprendizagem

Você vai (1) executar um experimento reprodutível com detectores, usando sementes fixas; (2) comparar uma faixa fixa com um detector CUSUM quanto a alarmes falsos, detecção e atraso; (3) relatar os resultados com denominadores; e (4) ligar os resultados à crítica de avaliação de Urbina et al. (2016).

25.1 O experimento

O laboratório simula a temperatura de ida da LDHP em 90 °C com ruído gaussiano (σ = 1 °C). Nas execuções com ataque, a partir da amostra 100, uma rampa lenta acrescenta 0,08 °C por amostra — uma deriva furtiva de setpoint no espírito da técnica T0836 do ATT&CK for ICS. O detector de faixa alarma quando a leitura sai de 90 ± 3,5 °C. O CUSUM acumula os desvios positivos menos uma folga de 0,5 °C e alarma acima de 12.

"""Lab 25: compare a fixed band and a CUSUM detector on synthetic supply temperature."""
import random
def run(seed, attack):
    rnd = random.Random(seed); s = 0.0; band = cus = None
    for t in range(200):
        x = 90 + rnd.gauss(0, 1.0) + (0.08 * (t - 100) if attack and t >= 100 else 0)
        if band is None and abs(x - 90) > 3.5: band = t
        s = max(0.0, s + (x - 90) - 0.5)
        if cus is None and s > 12: cus = t
    return band, cus
fa_b = sum(run(s, False)[0] is not None for s in range(40)); fa_c = sum(run(s, False)[1] is not None for s in range(40))
det = [run(1000 + s, True) for s in range(40)]
db = [b for b, _ in det if b is not None and b >= 100]; dc = [c for _, c in det if c is not None and c >= 100]
print(f"band : false alarms {fa_b}/40, detections {len(db)}/40, mean delay {sum(b-100 for b in db)/max(1,len(db)):.1f}")
print(f"cusum: false alarms {fa_c}/40, detections {len(dc)}/40, mean delay {sum(c-100 for c in dc)/max(1,len(dc)):.1f}")

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

band : false alarms 9/40, detections 37/40, mean delay 28.8
cusum: false alarms 0/40, detections 40/40, mean delay 23.1

Com σ = 1 °C, os limites de ±3,5 °C da faixa ficam a 3,5 desvios-padrão, então os alarmes falsos são raros por amostra, mas não por execução de 200 amostras.

25.2 Interpretando a saída

Em 40 execuções tranquilas, a faixa gerou alarmes falsos em 9 execuções — com σ = 1 °C, uma única amostra além de 3,5 σ é rara, mas em 200 amostras por execução ela acontece —, enquanto o CUSUM não gerou nenhum. Contra a rampa, o CUSUM detectou as 40 execuções, com atraso médio de 23,1 amostras; a faixa detectou 37 de 40 (contando apenas alarmes na amostra 100 ou depois), com atraso médio de 28,8. Como a faixa também dispara com ruído, algumas das suas "detecções" são excursões de ruído com sorte. Os limites de Wilson tornam a comparação concreta: as 9 execuções com alarme falso em 40 da faixa dão aproximadamente de 12 % a 38 %.

25.3 Relato honesto

Escreva: "CUSUM 0/40 execuções com alarme falso (limite superior de Wilson de 95 % ≈ 8,8 %), 40/40 detecções, atraso médio de 23,1 amostras, sementes 0–39 tranquilas e 1000–1039 com ataque." Não escreva "o CUSUM é perfeito". Urbina et al. também perguntariam quão grande é a rampa que um atacante conseguiria sustentar abaixo do limiar do CUSUM — uma inclinação menor poderia escapar dele por muito mais tempo. A linha da faixa deve ser relatada da mesma forma: "faixa 9/40 execuções com alarme falso (intervalo de Wilson de 95 % de cerca de 12 % a 38 %), 37/40 detecções na amostra 100 ou depois, atraso médio de 28,8 amostras". O acompanhamento de Maya, reduzindo a inclinação pela metade para 0,04 °C por amostra com as mesmas sementes, responde à pergunta de Urbina para um ponto da curva.

Exemplo resolvido (LDHP sintética)

Maya reduz a inclinação do ataque pela metade, para 0,04 °C/amostra, numa cópia do script e registra a mudança no atraso, mantendo as sementes. Isso transforma um resultado numa curva e mostra o compromisso do atacante entre velocidade e furtividade.

Caso sintético — Lakeside District Heating Plant. Todos os dados são simulados; as sementes tornam a saída reprodutível.

Erros e limites

Ruído gaussiano e independente é otimista. Os limiares foram definidos à mão na mesma família de dados em que são avaliados.

Exercícios

Síntese

Um resultado de laboratório é uma contagem sobre sementes, com limites e um modelo de atacante; mudar o atacante é o próximo experimento, e não um detalhe posterior.

Respostas comentadas

EX073. Faixa: alarmes falsos em 9 de 40 execuções tranquilas. CUSUM: 0 de 40, com limite superior de 95 % de cerca de 7,5 % (regra de três) ou 8,8 % (Wilson), ou seja, "nenhum alarme falso observado", e não "nunca".

EX074. A folga (valor de referência) é subtraída de cada desvio para que, sob o ruído normal, a soma cumulativa continue voltando a zero; só um deslocamento sustentado maior que a folga a faz crescer até o limiar, o que suprime alarmes de ruído de uma única amostra.

EX075. Varrer a inclinação da rampa (por exemplo, 0,005–0,08 °C/amostra) e, para cada uma, registrar o desvio de temperatura alcançado antes de o CUSUM alarmar; o maior desvio alcançado sem detecção num horizonte fixo é a métrica de impacto de ataque furtivo que Urbina et al. recomendam.