Capítulo 23 — Infraestrutura crítica e segurança setorial: análise de ameaças e de falhas
Mapa da aula
Aula 23 publicada. Mapa, exemplo, EX045.
flowchart TD
N0["23.1 Modelagem de ameaças"]
N1["23.2 Árvores de falhas"]
N2["23.3 Árvores de ataque e bow-ties"]
N3["23.4 Combinando falhas e ataques"]
N4["23.6 Atividade prática: Laboratório 9"]
N5["Síntese do capítulo"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5
N5 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX045"]
Desenho lógico
flowchart LR
N0["23.1 Modelagem de ameaças"]
N1["23.2 Árvores de falhas"]
N2["23.3 Árvores de ataque e bow-ties"]
N3["23.4 Combinando falhas e ataques"]
N4["23.6 Atividade prática: Laboratório 9"]
N5["Síntese do capítulo"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> Q["EX045"]
[23.1 Modelagem de ameaças]
|
v
[23.2 Árvores de falhas]
|
v
[23.3 Árvores de ataque e bow-ties]
|
v
[23.4 Combinando falhas e ataques]
|
v
[23.6 Atividade prática: Laboratório 9]
|
v
[Síntese do capítulo]
|
v
[Exemplo resolvido] --> [Exercício EX045]
Objetivos de aprendizagem e conexão
Ao fim deste capítulo você será capaz de (1) fazer a modelagem de ameaças sobre diagramas de fluxo de dados com STRIDE e ATT&CK for ICS; (2) construir árvores de falhas e calcular os conjuntos de corte mínimos e as probabilidades do evento de topo; (3) combinar a análise de falhas e a de ataques — árvores de ataque, bow-ties e cenários orientados por consequências; e (4) declarar as suposições e os limites de cada método. Ele usa os capítulos 7 e 22 e prepara os capítulos 24, 27 e 33.
23.1 Modelagem de ameaças
A modelagem de ameaças pergunta, de forma sistemática, o que pode dar errado em cada elemento e em cada fronteira de confiança de um modelo de sistema. O STRIDE — falsificação de identidade (spoofing), adulteração (tampering), repúdio, divulgação de informações, negação de serviço, elevação de privilégios — é um mnemônico para categorias de ameaças aplicado a cada fluxo de dados, processo e repositório. O MITRE ATT&CK for ICS cataloga táticas e técnicas de adversários observadas contra sistemas industriais, do acesso inicial ao impacto (por exemplo, manipulação do controle ou perda de visão). Use o STRIDE para gerar ameaças candidatas elemento por elemento e o ATT&CK para conferir o realismo e a completude contra o comportamento observado.
23.2 Árvores de falhas
Uma árvore de falhas decompõe um evento de topo indesejado em combinações de eventos básicos usando portas E e OU. Um conjunto de corte mínimo é um menor conjunto de eventos básicos cuja ocorrência conjunta causa o evento de topo; a lista dos conjuntos de corte mínimos é a lógica de falha do sistema em sua forma mais simples. Conjuntos de corte de um único evento são pontos únicos de falha. Com probabilidades independentes dos eventos básicos, a probabilidade do evento de topo é calculada exatamente por enumeração para árvores pequenas, ou aproximadamente somando as probabilidades dos conjuntos de corte (a aproximação de eventos raros, um limite superior quando as probabilidades são pequenas).
23.3 Árvores de ataque e bow-ties
Uma árvore de ataque aplica a mesma estrutura E/OU ao objetivo de um adversário; as folhas são ações do atacante com atributos como custo, habilidade ou detectabilidade, em vez de probabilidades. Atribuir probabilidades a ataques deliberados é questionável — os adversários se adaptam —, então as árvores de ataque costumam ser usadas para encontrar o caminho mais barato ou menos detectável e, depois, para posicionar controles nele. Um bow-tie junta as causas (à esquerda), o evento central e as consequências (à direita), mostrando as barreiras preventivas antes do evento e as barreiras mitigadoras depois dele; ele se comunica bem com operadores e gestores.
23.4 Combinando falhas e ataques
Os eventos de infraestrutura misturam causas acidentais e deliberadas: um atacante pode esperar por uma tempestade, ou uma falha pode mascarar uma intrusão. Métodos orientados por consequências, como o CCE do INL, partem da consequência inaceitável e perguntam quais combinações de falhas e ações de adversários chegam a ela. Uma abordagem prática: construa a árvore de falhas para a consequência; marque quais eventos básicos um adversário poderia causar deliberadamente; recalcule com esses eventos definidos como "ocorridos" para ver o que resta como proteção. O que restar é sua verdadeira defesa contra um adversário capaz.
23.5 Exemplo resolvido: perda do abastecimento do hospital (sintético)
Evento de topo: o St Brenna's perde o abastecimento por mais de 4 h num ano. Seguindo o modelo do Capítulo 22: o caminho A (PS4) se perde se a PS4 falhar, ou se o alimentador F2 e o gerador da PS4 falharem ambos; o caminho B se perde se o reservatório estiver indisponível, se a PS3 falhar ou se o alimentador F1 falhar; e o evento exige os dois caminhos perdidos e o tanque do hospital falhando em cobrir a lacuna (TANK). O Laboratório 9 enumera a árvore com probabilidades anuais sintéticas. Há seis conjuntos de corte mínimos, todos de ordem três ou quatro, porque TANK aparece em todos eles. O maior contribuinte é {G1, PS4, TANK}. A probabilidade exata é de 9,10 × 10⁻⁵ por ano; a aproximação de eventos raros dá 9,36 × 10⁻⁵.
Agora a visão adversarial: se um atacante consegue parar remotamente a PS3 e a PS4 (sem R1), as duas passam a "ocorridas" e o evento de topo se reduz apenas a TANK — probabilidade de 0,03. A autenticação dos comandos remotos faz o sistema passar de um problema de duas de três falhas independentes para um problema de ponto único de falha. Essa comparação é o argumento mais claro a favor de R1 em todo o dossiê.
23.6 Atividade prática: Laboratório 9
# Lab 9 - fault tree: minimal cut sets and top-event probability (synthetic annual probabilities, offline)
from itertools import product
P = {"G1": 0.10, "G2": 0.08, "GEN": 0.05, "PS4": 0.02, "PS3": 0.02, "RES": 0.01, "TANK": 0.03}
# Top: hospital loses supply > 4 h = (feed A lost AND feed B lost)
# feed A (PS4 direct) lost = PS4 OR (G2 AND GEN); feed B (reservoir) lost = RES OR PS3 OR G1
# hospital on-site tank TANK failing (empty/contaminated) is needed too: top = A AND B AND TANK
def top(s): A = s["PS4"] or (s["G2"] and s["GEN"]); B = s["RES"] or s["PS3"] or s["G1"]; return A and B and s["TANK"]
names = list(P); exact = 0.0; cuts = []
for bits in product([0, 1], repeat=len(names)):
s = dict(zip(names, bits)); pr = 1.0
for n in names: pr *= P[n] if s[n] else 1 - P[n]
if top(s):
exact += pr
on = frozenset(n for n in names if s[n])
cuts.append(on)
mcs = sorted({c for c in cuts if not any(o < c for o in cuts)}, key=lambda c: (len(c), sorted(c)))
for c in mcs:
pr = 1.0
for n in c: pr *= P[n]
print(sorted(c), f"{pr:.2e}")
rare = sum(eval("*".join(str(P[n]) for n in c)) for c in mcs)
print(f"rare-event approx {rare:.3e} exact {exact:.3e}")
Saída esperada:
['G1', 'PS4', 'TANK'] 6.00e-05
['PS3', 'PS4', 'TANK'] 1.20e-05
['PS4', 'RES', 'TANK'] 6.00e-06
['G1', 'G2', 'GEN', 'TANK'] 1.20e-05
['G2', 'GEN', 'PS3', 'TANK'] 2.40e-06
['G2', 'GEN', 'RES', 'TANK'] 1.20e-06
rare-event approx 9.360e-05 exact 9.101e-05
Os seis conjuntos de corte contêm TANK, então a reservação própria do hospital aparece em todos os caminhos até o evento de topo. O maior contribuinte isolado combina o alimentador F1, a PS4 e o tanque. Os dois valores de probabilidade diferem ligeiramente porque a aproximação de eventos raros conta duas vezes os conjuntos de corte que se sobrepõem, então dá um pequeno limite superior para o valor exato. A leitura adversarial do exemplo resolvido vem de definir a PS3 e a PS4 como falha certa e executar de novo, o que o EX045 pede que você mesmo faça.
23.7 Erros comuns e limites
- Árvores de falhas com eventos básicos dependentes tratados como independentes (energia comum, software comum).
- Probabilidades de ataques deliberados apresentadas como frequências.
- Modelos de ameaças sem fronteiras de confiança.
- Listas STRIDE nunca conferidas contra o comportamento observado de adversários.
- Tratar a aproximação de eventos raros como exata quando as probabilidades são grandes.
O próprio Laboratório 9 supõe independência, então uma falha de software compartilhada nas RTUs das duas estações tornaria seus números otimistas. Suas probabilidades de falha da PS3 e da PS4 são frequências de falhas aleatórias, então não dizem nada sobre quão provável é que um atacante pare as duas estações, e é por isso que o caso adversarial é tratado por condicionamento, e não pelo acréscimo de uma probabilidade de ataque.
Exercícios — capítulo 23
EX045 — Árvore condicionada ao adversário. Objetivo: quantificar o que a autenticação compra. Entradas: Laboratório 9. Passos: (1) defina a PS3 e a PS4 com probabilidade 1 (o atacante consegue pará-las remotamente) e calcule a probabilidade do evento de topo; (2) em vez disso, defina G1 e G2 como 1 (o atacante consegue cortar os dois alimentadores) e recalcule; (3) interprete ambos. Evidência esperada: números e uma interpretação de 150 palavras. Rubrica: 3 = números corretos (0,03; e, com G1=G2=1, topo = P(TANK)·P(PS4 ou GEN) — calcule), interpretação ligada aos controles (R1; independência do gerador e o tanque); 2 = um número errado; 1 = não executado; 0 = nada.
EX046 — STRIDE num fluxo. Objetivo: modelar as ameaças de um fluxo de dados. Entradas: o fluxo gateway–SCADA (quadros do Laboratório 8 sobre o conduto LTE). Passos: aplique cada categoria do STRIDE, nomeie uma técnica do ATT&CK for ICS onde couber e declare o controle existente ou proposto. Evidência esperada: tabela de seis linhas. Rubrica: 3 = as seis categorias significativas e controles correspondentes (por exemplo, falsificação de identidade → MAC; negação de serviço → retorno ao automático local); 2 = uma categoria vazia; 1 = apenas a lista; 0 = nada.
Síntese do capítulo
Os modelos de ameaças geram o que poderia dar errado em cada fronteira de confiança; o ATT&CK os mantém realistas. As árvores de falhas e os conjuntos de corte mínimos mostram a lógica de falha e os pontos únicos de falha; as árvores de ataque e os bow-ties mostram os caminhos dos adversários e as barreiras. Combine-os condicionando ao que um adversário consegue causar: o que restar é a defesa que realmente importa.
Continue estudando — capítulo 23 de 50
← Capítulo 22 · Índice de capítulos do curso · Capítulo 24 →
Siga para a próxima lição escrita.