Mapa da aula
Aula 27 publicada. Mapa, exemplo, EX079.
flowchart TD
N0["27.1 Três tipos"]
N1["27.2 Competência do operador"]
N2["27.3 Compensação"]
N3["Nota prática"]
N4["27.1b Titularidade e detecção da quebra de vidro"]
N5["Nota de campo — dia de saúde dos controles"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
N6 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX079"]
Desenho lógico
flowchart LR
N0["27.1 Três tipos"]
N1["27.2 Competência do operador"]
N2["27.3 Compensação"]
N3["Nota prática"]
N4["27.1b Titularidade e detecção da quebra de vidro"]
N5["Nota de campo — dia de saúde dos controles"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX079"]
[27.1 Três tipos]
|
v
[27.2 Competência do operador]
|
v
[27.3 Compensação]
|
v
[Nota prática]
|
v
[27.1b Titularidade e detecção da quebra de vidro]
|
v
[Nota de campo — dia de saúde dos controles]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX079]
Objetivos de aprendizagem
Você vai (1) projetar controles preventivos, detectivos e corretivos para o CNHP; (2) ligar os controles aos requisitos; (3) evitar controles que exijam competências de exploit para serem operados.
27.1 Três tipos
Preventivo: lista de permissões antes do encaminhamento. Detectivo: alerta sobre códigos de escrita negados. Corretivo: desativar automaticamente uma conta de engenharia comprometida no fim da janela. Cada um corresponde a um id de requisito.
Na ABP, a lista de permissões no monitor serial é preventiva, o alerta quando a HMI-1 tenta escrever fora de 40001 a 40010 é detectivo, e a desativação das contas temporárias de engenharia no fim de cada janela é corretiva. Lena registra o id do requisito ao lado de cada controle, para que um revisor veja qual requisito falha se o controle for removido ou enfraquecido.
27.2 Competência do operador
Os controles do CNHP são verificados pelos engenheiros do local durante janelas autorizadas, não por especialistas em exploits. Um controle que exige shellcode sob medida para ser verificado é o controle errado para este programa.
Lena escreve uma entrada de runbook para cada controle do CNHP, descrevendo como verificá-lo com ferramentas comuns, como reproduzir um quadro sintético na bancada e ler o log de decisões. Se um controle só pode ser verificado por alguém escrevendo código de exploit, ela o substitui por um que possa ser conferido com segurança pelos próprios engenheiros do site no trabalho de rotina.
27.3 Compensação
Se um CLP legado não consegue impor listas de permissões, acrescente monitoramento detectivo e uma aprovação humana mais rígida para o acesso de engenharia. Documente a compensação na permissão de trabalho.
"""Lab: Modbus function-code allow-list on synthetic, already-decoded requests (no network)."""
ALLOW = {("HMI-1", 3), ("HMI-1", 6), ("HIST-1", 3), ("HIST-1", 4)} # (source, function code)
WRITE_REGS = {("HMI-1", 6): range(40001, 40011)} # HMI may write setpoints only
reqs = [("HMI-1", 3, 40001), ("HMI-1", 6, 40003), ("HMI-1", 6, 40050),
("HIST-1", 3, 30001), ("HIST-1", 16, 40001), ("ENG-WS", 8, 0), ("HIST-1", 4, 30010)]
for src, fc, reg in reqs:
if (src, fc) not in ALLOW:
d = "BLOCK fc-not-allowed"
elif (src, fc) in WRITE_REGS and reg not in WRITE_REGS[(src, fc)]:
d = "BLOCK register-out-of-range"
else:
d = "PASS"
print(f"{src:7} fc={fc:2} reg={reg:5} -> {d}")
Saída esperada:
HMI-1 fc= 3 reg=40001 -> PASS
HMI-1 fc= 6 reg=40003 -> PASS
HMI-1 fc= 6 reg=40050 -> BLOCK register-out-of-range
HIST-1 fc= 3 reg=30001 -> PASS
HIST-1 fc=16 reg=40001 -> BLOCK fc-not-allowed
ENG-WS fc= 8 reg= 0 -> BLOCK fc-not-allowed
HIST-1 fc= 4 reg=30010 -> PASS
Caso sintético — Ashford Batch Plant. Escritas fora de 40001-40010 são negadas — uma barreira preventiva com um evento detectivo quando alguém tenta.
Na ABP, a compensação é escrita na permissão de trabalho com um dono e uma data de revisão, para que seja conferida, e não presumida. Para um CLP legado que não consegue impor uma lista de permissões, Lena combina monitoramento detectivo no seu tronco com aprovação por duas pessoas para o acesso de engenharia.
27.4 Erros e limites
Pilhas de controles compensatórios sem dono viram alertas ignorados.
O registro de controles de Lena lista cada controle compensatório da ABP com o seu dono, os seus alertas e a data do último teste. Um controle encontrado sem dono recebe um antes da janela seguinte, ou é retirado do registro e o seu requisito é marcado como não atendido. Controles que ninguém observa são contados como ausentes, porque os seus alertas serão ignorados quando finalmente dispararem. A titularidade é revista em cada dia de saúde.
Nota prática
Uma vez por trimestre, Lena reserva um dia de saúde dos controles na bancada: cada controle preventivo do CNHP é quebrado com tráfego sintético, e o alerta correspondente do monitor precisa disparar. Controles não testados são desejos.
27.1b Titularidade e detecção da quebra de vidro
Todo controle do CNHP, como a lista de permissões do tronco do PLC-A, tem um dono que recebe os seus alertas e uma data de revisão. Registre quando um operador usa a quebra de vidro para pular a dupla aprovação. Uma quebra de vidro sem detecção é só um controle único escondido. A revisão semanal dos eventos de quebra de vidro faz parte do projeto do controle, e cada revisão nomeia quem usou a quebra de vidro e o motivo informado.
A entrada de cada controle no registro também declara como ele falha: se uma lista de permissões quebrada bloqueia ou deixa passar o tráfego decide qual alerta detectivo precisa disparar primeiro; no tronco do PLC-A, é o alerta de política ausente, que aciona o líder da janela.
Nota de campo — dia de saúde dos controles
No dia de saúde de março, a equipe apagou a lista de permissões de um monitor de bancada e confirmou que o alerta detectivo disparou em 12 segundos. O caminho preventivo negou as escritas imediatamente. Um controle compensatório de um CLP legado não tinha dono; recebeu um antes da janela seguinte.
Exercícios
- EX079 — Mapa. Um controle preventivo e um detectivo contra a adulteração de evidências. Rubrica: 3 = os dois; 2 = um; 1 = vago; 0 = nada.
- EX080 — Operável. Por que "verificar explorando de novo" é um controle ruim? Rubrica: 3 = uso dual + instável + competência errada; 2 = uma razão; 1 = vago; 0 = defende.
- EX081 — Laboratório. Qual regra bloqueia HIST-1 fc=16? Rubrica: 3 = fc-not-allowed; 2 = negação vaga; 1 = errada; 0 = nada.
Síntese
Os controles são preventivos/detectivos/corretivos, têm dono e são operáveis sem exploits.