Mapa da aula
Aula 07 publicada. Mapa, exemplo, EX019.
flowchart TD
N0["7.1 Modbus/TCP num quadro"]
N1["7.2 Nenhuma identidade no protocolo"]
N2["7.3 Lendo a saída"]
N3["Síntese"]
N0 --> N1 --> N2 --> N3
N3 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX019"]
Desenho lógico
flowchart LR
N0["7.1 Modbus/TCP num quadro"]
N1["7.2 Nenhuma identidade no protocolo"]
N2["7.3 Lendo a saída"]
N3["Síntese"]
N0 --> N1 --> N2 --> N3 --> Q["EX019"]
[7.1 Modbus/TCP num quadro]
|
v
[7.2 Nenhuma identidade no protocolo]
|
v
[7.3 Lendo a saída]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX019]
Objetivos de aprendizagem
Você vai (1) decodificar o cabeçalho MBAP e o código de função do Modbus/TCP a partir de bytes brutos; (2) distinguir códigos de função de leitura e de escrita; (3) explicar por que o Modbus não oferece autenticação; e (4) dizer o que um decodificador de protocolo pode e não pode contar a um analista.
7.1 Modbus/TCP num quadro
O Modbus/TCP carrega um cabeçalho MBAP de sete bytes — identificador de transação (2 bytes), identificador de protocolo (2, sempre zero), comprimento (2) e identificador de unidade (1) —, seguido da unidade de dados de protocolo, que começa com um código de função de um byte. A Modbus Application Protocol Specification V1.1b3 define os códigos: 3 lê holding registers, 6 escreve um único registrador, 16 escreve vários registradores. No laboratório do decodificador, o quadro 2 traz o código de função 6 e o quadro 3, o código de função 16; ambos são escritas, e é por isso que a lista de permissão do Capítulo 27 se preocupa com o código de função antes do endereço.
7.2 Nenhuma identidade no protocolo
Nada no quadro diz quem o enviou. Qualquer host que consiga abrir a porta TCP 502 de um controlador pode emitir uma escrita, se o dispositivo aceitá-la. A segurança precisa, portanto, vir da rede (segmentação, listas de permissão) ou de uma variante protegida como o Modbus/TCP Security, que envolve o protocolo em TLS com papéis baseados em certificados.
"""Lab 07: decode synthetic Modbus/TCP request headers (offline bytes only)."""
import struct
FC = {1: "read coils", 3: "read holding registers", 4: "read input registers",
5: "write single coil", 6: "write single register", 16: "write multiple registers"}
frames = ["000100000006010300640002", "00020000000601060064012c", "000300000006011000c80001"]
for h in frames:
b = bytes.fromhex(h)
tid, pid, length, unit, fc = struct.unpack(">HHHBB", b[:8])
addr, val = struct.unpack(">HH", b[8:12])
kind = "WRITE" if fc in (5, 6, 15, 16) else "read"
print(f"tid={tid} unit={unit} fc={fc} ({FC[fc]}) addr={addr} arg={val} -> {kind}")
Execute com python3 lab_modbus.py. Saída verificada:
tid=1 unit=1 fc=3 (read holding registers) addr=100 arg=2 -> read
tid=2 unit=1 fc=6 (write single register) addr=100 arg=300 -> WRITE
tid=3 unit=1 fc=16 (write multiple registers) addr=200 arg=1 -> WRITE
Para o PLC-H, que não consegue autenticar clientes Modbus, esse é todo o argumento para os controles compensatórios do Capítulo 24: a lista de permissão do firewall que nomeia a HMI-1 e o HIST-1 como as únicas origens permitidas é a verificação de identidade que falta ao protocolo. Um host na VLAN do escritório que alcance a porta 502 é, para o PLC-H, indistinguível da HMI-1.
7.3 Lendo a saída
O quadro 2 escreve o valor 300 no registrador 100; o quadro 3 é uma escrita de vários registradores começando em 200. Observe que o decodificador imprime o endereço inicial e o primeiro argumento, mas não sabe o que o registrador 100 significa — isso vem do mapa de registradores do CLP, que é documentação da planta, e não protocolo. No mapa de registradores da LDHP, o registrador 100 guarda o setpoint de temperatura de ida em décimos de grau, de modo que o valor 300 significa 30,0 °C, muito abaixo do ponto de operação de 90 °C. Essa é a diferença entre "escrever um único registrador" e "possível perda de calor". A nota de Maya acrescenta uma coluna de mapa de registradores exatamente por isso, e marca a escrita de vários registradores do quadro 3, em 200, como inexplicada até que o mapa diga o que os registradores a partir de 200 controlam.
Caso sintético — Lakeside District Heating Plant. Os quadros do laboratório foram compostos à mão; nenhum dispositivo ou rede foi contatado.
Erros e limites
Alguns dispositivos usam endereçamento a partir de zero, e alguns documentos usam a numeração no estilo 40001; misturá-los causa erros de deslocamento de um. Decodificar o tráfego de uma planta que você não está autorizado a monitorar não é uma prática aceitável.
Exercícios
- EX019 — Decodificando um quarto quadro. Decodifique
000400000006010400320004.Mostrar critérios de avaliação
Rubrica: 3 = tid 4, fc 4 leitura de input registers, endereço 50, quantidade 4, leitura; 2 = código de função certo; 1 = ordem de bytes errada; 0 = nada. - EX020 — O que o quadro não consegue dizer. Dê dois fatos sobre o quadro 2 que não podem ser obtidos a partir dos seus bytes.
Mostrar critérios de avaliação
Rubrica: 3 = identidade/autorização de quem enviou e significado de engenharia do registrador 100; 2 = um; 1 = lista campos do cabeçalho; 0 = nada. - EX021 — Escalonando uma escrita de setpoint. Usando a escala em décimos de grau da LDHP, que valor de registrador define 92,5 °C?
Mostrar critérios de avaliação
Rubrica: 3 = 925; 2 = 92 ou 93 com a escala mencionada; 1 = 92,5; 0 = nada.
Síntese
Um decodificador de protocolo dá a estrutura; a documentação da planta dá o significado; e a segmentação, não o protocolo, dá a identidade.