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
- EX073 — Lendo as execuções com alarme falso. Informe a contagem de alarmes falsos do detector de faixa e dê um limite superior de 95 % para a do CUSUM.
Mostrar critérios de avaliação
Rubrica: 3 = 9/40 para a faixa; CUSUM 0/40 com limite superior de ≈7,5–8,8 %; 2 = um; 1 = "CUSUM 0 %"; 0 = nada. - EX074 — Por que um termo de folga? Explique o papel da folga de 0,5 °C no CUSUM.
Mostrar critérios de avaliação
Rubrica: 3 = subtrai o ruído esperado, para que a soma volte a zero na operação normal e só cresça sob um deslocamento sustentado; 2 = parcial; 1 = "reduz alarmes"; 0 = nada. - EX075 — Aplicando a crítica da furtividade. Descreva um experimento adicional inspirado em Urbina et al.
Mostrar critérios de avaliação
Rubrica: 3 = varrer a inclinação/o tamanho do ataque para achar o maior impacto não detectado numa janela de tempo; 2 = variar o limiar; 1 = só mais sementes; 0 = nada.
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.