OpenCyber Academy
Pesquisa doutoral · Capítulo 3 · Português
Código do curso: OCA-206Capítulo 03: OCA-206-C003

Capítulo 3 — Proposta de contribuição original

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 03 publicada. Mapa, exemplo, EX015.

flowchart TD
  N0["3.1 Tipos de contribuição"]
  N1["3.2 O mecanismo como um invariante físico"]
  N2["3.3 Modelo de atacante"]
  N3["3.4 Hipóteses e limiares"]
  N4["3.5 Linhas de base e rivais"]
  N5["Síntese do capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5
  N5 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX015"]

Desenho lógico

flowchart LR
  N0["3.1 Tipos de contribuição"]
  N1["3.2 O mecanismo como um invariante físico"]
  N2["3.3 Modelo de atacante"]
  N3["3.4 Hipóteses e limiares"]
  N4["3.5 Linhas de base e rivais"]
  N5["Síntese do capítulo"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> Q["EX015"]
[3.1 Tipos de contribuição]
    |
    v
[3.2 O mecanismo como um invariante físico]
    |
    v
[3.3 Modelo de atacante]
    |
    v
[3.4 Hipóteses e limiares]
    |
    v
[3.5 Linhas de base e rivais]
    |
    v
[Síntese do capítulo]
    |
    v
[Exemplo resolvido] --> [Exercício EX015]

Objetivos de aprendizagem e conexão

Ao final deste capítulo, você será capaz de (1) escolher o tipo de contribuição que a sua tese faz, (2) expressar um mecanismo de detecção como um invariante físico, (3) definir um modelo de atacante explícito, (4) declarar hipóteses com limiares e explicações rivais e (5) pré-declarar as condições sob as quais a sua contribuição falha. Ele transforma a lacuna do Capítulo 2 num estudo que o Capítulo 4 pode pilotar.

3.1 Tipos de contribuição

Uma tese de segurança de TO pode contribuir com um mecanismo (um novo detector ou proteção), uma medição (uma forma de quantificar o impacto ou a exposição), uma constatação empírica (como os operadores ou as plantas de fato se comportam) ou um princípio validado (uma regra de projeto que se mantém entre contextos). O Setpoint Study contribui com uma comparação apoiada em medições: ele não inventa o teste CUSUM (Page, 1954) nem a detecção baseada em resíduos (levantada por Giraldo et al.); ele testa quando um invariante entre sensores ajuda contra um objetivo de adversário específico e documentado — a manipulação da visão — e quantifica onde ele deixa de ajudar. Um posicionamento honesto desse tipo é uma força numa defesa, não uma fraqueza.

3.2 O mecanismo como um invariante físico

O tanque da Plant A obedece a um balanço de massa discreto: próximo nível = nível + entrada − saída, com saída ≈ 0,02 × nível através de um orifício fixo no modelo sintético (equilíbrio de 50 unidades quando a entrada é 1,0). Um transmissor de nível e um medidor de vazão medem grandezas diferentes produzidas pela mesma física. Se um atacante repete leituras antigas de nível enquanto força a bomba, a estimativa de nível prevista a partir do medidor de vazão diverge do nível relatado. O resíduo r = nível relatado − nível previsto deve ficar perto de zero em operação normal e afastar-se sob esse ataque. Um CUSUM acumula a magnitude do resíduo acima de uma folga k e alarma quando a soma excede um limiar h; ele é projetado para captar pequenos desvios persistentes que uma faixa fixa deixa passar.

O invariante tem um pressuposto embutido: o medidor de vazão é honesto. Se o atacante controla os dois sensores (ou o CLP que os relata), o invariante pode ser satisfeito por uma mentira coerente. Declarar esse pressuposto é o início do modelo de atacante.

3.3 Modelo de atacante

Escreva o modelo como capacidades, conhecimento e objetivo:

Tabela da aula; deslize para ver todas as colunas →

Elemento Pressuposto do Setpoint Study
Capacidades Acesso de escrita ao comando da bomba e à leitura de nível no enlace SCADA (coerente com Modify Parameter e Spoof Reporting Message do ATT&CK for ICS); classe A: só o sensor de nível; classe B: sensores de nível e de vazão.
Conhecimento Conhece os limites do alarme de faixa; na classe B, conhece também o detector.
Objetivo Elevar o nível real enquanto mantém os valores exibidos normais (manipulação da visão).
Fora do escopo Comprometimento da válvula boia mecânica; adulteração física.

3.4 Hipóteses e limiares

Os limiares são justificados, não decorativos: 60 passos correspondem, na base de tempo sintética, ao tempo que o transbordamento leva para atingir metade da margem até o trip de nível muito alto. H4 é uma hipótese que você quer poder confirmar: um método cujos limites são medidos é mais útil do que um cujos limites são desconhecidos.

3.5 Linhas de base e rivais

As linhas de base são (a) o alarme de faixa que a planta já tem, (b) um detector de rede que sinaliza qualquer escrita no registrador de nível — trivialmente eficaz se as escritas forem raras, inútil se o atacante fizer o replay no sensor — e (c) um oráculo com acesso ao nível real, que dá o melhor atraso possível. As explicações rivais para qualquer vantagem do CUSUM incluem o ajuste do limiar nos dados de teste, um simulador limpo demais e magnitudes de ataque escolhidas para favorecer o método. Cada rival recebe um teste no Capítulo 4 ou 5.

3.6 Exemplo resolvido e Laboratório 3

O Laboratório 3 implementa o modelo e os dois detectores para 100 execuções com sementes fixas por condição.

# Lab 3 - Setpoint Study (synthetic): fixed-band alarm vs. physics-residual CUSUM on one tank.
# Python 3 standard library only. Attack: pump forced to over-fill while the level sensor replays
# nominal values ("replay"); variant "replay+flow" also spoofs the inflow meter.
import random

def run(seed, attack, detector, steps=600, onset=300):
    rng = random.Random(seed)
    true_level, s, first_alarm, max_dev = 50.0, 0.0, None, 0.0
    est = 50.0
    for t in range(steps):
        inflow = 1.0 + rng.gauss(0, 0.05)
        if attack and t >= onset:
            inflow += 0.05                      # forced pump: hidden extra inflow
        true_level += inflow - 0.02 * true_level
        level_meas = true_level + rng.gauss(0, 0.3)
        flow_meas = inflow + rng.gauss(0, 0.02)
        if attack and t >= onset:
            level_meas = 50.0 + rng.gauss(0, 0.3)   # replayed nominal level
            if attack == "replay+flow":
                flow_meas = 1.0 + rng.gauss(0, 0.02)
        est = est + flow_meas - 0.02 * est      # mass-balance prediction from flow meter
        if detector == "band":
            hit = abs(level_meas - 50.0) > 1.5
        else:
            s = max(0.0, s + abs(level_meas - est) - 0.6)
            hit = s > 6.0
        if hit and first_alarm is None:
            first_alarm = t
        if t >= onset:
            max_dev = max(max_dev, true_level - 50.0)
    return first_alarm, max_dev

for det in ("band", "cusum"):
    fa = sum(run(k, None, det)[0] is not None for k in range(100))
    for atk in ("replay", "replay+flow"):
        res = [run(k, atk, det) for k in range(100)]
        hits = [a - 300 for a, _ in res if a is not None and a >= 300]
        delay = f"{sum(hits)/len(hits):.1f}" if hits else "n/a"
        print(f"{det:5s} {atk:11s} false_alarm_runs={fa}/100 detected={len(hits)}/100 "
              f"mean_delay={delay} worst_true_overfill={max(d for _, d in res):.2f}")

Saída esperada:

band  replay      false_alarm_runs=9/100 detected=0/100 mean_delay=n/a worst_true_overfill=3.36
band  replay+flow false_alarm_runs=9/100 detected=0/100 mean_delay=n/a worst_true_overfill=3.26
cusum replay      false_alarm_runs=0/100 detected=100/100 mean_delay=31.8 worst_true_overfill=3.36
cusum replay+flow false_alarm_runs=0/100 detected=0/100 mean_delay=n/a worst_true_overfill=3.26

Lendo a saída em relação às hipóteses: H1 é apoiada no modelo (100/100, atraso de 31,8, contra 0/100); H2 é apoiada (0 contra 9 execuções com alarme falso — a faixa estreita de ±1,5 dispara com o ruído); H4 é confirmada (a classe B escapa completamente). O "worst true overfill" (pior transbordamento real) é o máximo ao longo de toda a janela do ataque, então H3 exige uma medição separada do transbordamento no instante do alarme — um exercício abaixo. Todos os números são propriedades de um modelo sintético, não de uma planta.

3.7 Erros comuns e limites

Alegar que um mecanismo é novo quando só a sua aplicação é; omitir o pressuposto do sensor honesto; escolher as magnitudes de ataque depois de ver o comportamento do detector; não ter nenhuma condição sob a qual a hipótese falhe.

Cada um desses erros tem um sintoma visível numa proposta: uma frase de contribuição que alega inventar o CUSUM, um modelo de atacante sem uma classe B, um ganho de ataque alterado depois que o Laboratório 3 foi executado ou uma lista de hipóteses sem H4. Leia a proposta em busca desses sintomas antes de enviá-la à banca e corrija-os enquanto o estudo ainda é barato de mudar.

Exercícios — capítulo 3

Síntese do capítulo

Uma proposta forte se posiciona com honestidade, expressa o mecanismo como um invariante físico, torna explícito o pressuposto do sensor honesto por meio de um modelo de atacante e pré-declara as hipóteses — incluindo a que marca onde a contribuição falha.

Respostas comentadas

EX015. Tipo de contribuição: comparação apoiada em medições, com limites caracterizados. "Não propomos um novo detector; partindo do CUSUM (Page, 1954) e da detecção baseada em resíduos (Giraldo et al., 2018), medimos quando um invariante de balanço de massa entre sensores detecta a manipulação da visão e a capacidade do atacante na qual ele falha."

EX016. Equilíbrio L* = entrada/0,02 = 1,05/0,02 = 52,5 unidades. Uma entrada extra persistente de 0,05 eleva o nível em apenas 2,5 unidades em regime permanente; o atacante precisa de uma forçante maior (ou de uma saída bloqueada) para chegar a um trip, o que afeta quais ganhos são realistas no Capítulo 6.

EX017. A classe C modifica a lógica do CLP, então pode forjar os dois valores relatados de forma coerente e suprimir os alarmes calculados no CLP. Alarme de faixa: evadido. CUSUM no CLP: evadido. CUSUM calculado fora do CLP, sobre sensores com fiação independente: ainda detecta. Conclusão: o posicionamento do detector importa tanto quanto o algoritmo.

EX018. Registrar true_level − 50 no primeiro alarme dá, para o CUSUM com ganho 0,05, um transbordamento médio de 1,22 unidade e um máximo de 1,60 no instante do alarme; o alarme de faixa nunca dispara depois do início, então o seu transbordamento cresce até o máximo da janela, de 3,36. H3 é apoiada no modelo.

EX019. Suponha que o trip de nível muito alto esteja em 56 (margem de 6) e que o ataque eleve o nível a até ≈0,05 unidade/passo inicialmente. Metade da margem (3 unidades) seria alcançada em cerca de 60–80 passos, considerando a aproximação exponencial; um limiar de 60 passos é conservador. Um nível de trip diferente justifica um limiar diferente pela mesma aritmética.

EX020. (1) Ajuste do limiar nos dados de teste → ajustar em sementes separadas (Laboratório 6) e congelar. (2) Simulador limpo demais → acrescentar viés de calibração e validar na T2. (3) Magnitude do ataque escolhida para favorecer o método → varrer os ganhos (EX034) e relatar a curva completa.