
Prova de conceito que reproduz a falha de chave hardcoded da CVE-2021-22681 e valida uma correção de TLS mútuo/CRL por dispositivo sobre EtherNet/IP simulado, com mapeamento para IEC 62443-4-2.
Quatro scripts executáveis. Tráfego real de protocolo EtherNet/IP, criptografia real, zero software Rockwell ou licenciamento em qualquer ponto da cadeia. Construído para testar uma afirmação antes de documentá-la, não para defendê-la por fé.
Proveniência: construído em 31/07/2026, em paralelo a uma investigação sobre o Braham, MN WWTF — uma das quatro concessionárias divulgadas publicamente no incidente coordenado no setor de água de Minnesota de 26 a 27 de julho de 2026. O contexto desse incidente está no advisory da CISA AA26-097A (emissão conjunta FBI/CISA/NSA/EPA/DOE/USCYBERCOM/Treasury; emitido em 07/04/2026, expandido em 22/07/2026), que cobre a campanha contínua CyberAv3ngers associada ao IRGC. Ressalva de atribuição, mantida precisamente: nenhuma agência atribuiu formalmente o incidente de Minnesota especificamente a esse grupo — apenas a campanha mais ampla em curso o foi. Esta pasta é o lado da correção técnica, mantida separada da investigação do incidente de propósito.
Um pacote de divulgação vive ou morre por não misturar essas coisas, porque cada uma tem uma correção diferente:
A correção demonstrada aqui — vínculo de identidade por dispositivo (Teste 3) — trata da falha de chave de frota.
Não confunda as duas linhas. O princípio está comprovado. A implementação específica do fornecedor dele é crível (é a intenção de design declarada por eles), mas não testada por nós contra equipamento real.
test1_baseline_vulnerable.py — a linha de base sem autenticação, ao vivoInicia um simulador real de PLC EtherNet/IP (cpppo, emulando um Allen-Bradley ControlLogix) e
lê + escreve uma tag de controle com zero credenciais. (Escopo: esta é a
linha de base sem autenticação ampla em que a campanha se apoiou — não o mecanismo específico de chave hardcoded
do CVE-2021-22681. Mantida distinta de propósito; veja "Três falhas distintas" acima.)
python test1_baseline_vulnerable.py
test2_shared_secret_fails.py — a forma da falha de chave de frota (ponte narrativa, não um teste)Dois endpoints guardam uma chave estática; uma credencial do Dispositivo A abre o Dispositivo B inalterado — o análogo estrutural mais próximo da falha de uma-chave-para-todos do CVE-2021-22681. Mas é tautológico: ambos os manipuladores são construídos para aceitar essa chave, então não há caminho de execução em que ela possa falhar. Isso não demonstra nada que o código não defina como existente. Mantido como a ponte narrativa do Teste 1 ao Teste 3; não carrega nenhum peso probatório e deliberadamente não é um pilar de prova.
python test2_shared_secret_fails.py
test3_mutual_tls_fix.py — a correção, com seu controle negativo e ambas as direçõesCA real, dois certificados de dispositivo individualmente únicos — identidade vinculada no SubjectAlternativeName, não no CommonName obsoleto. Cinco casos, todos executados:
device-a (check_hostname contra um SAN real). Mútuo — ambas as extremidades vinculam identidade.python test3_mutual_tls_fix.py
test4_revocation.py — a perna do ciclo de vida: revogaçãoUma CRL real assinada por CA. Uma credencial de cliente (engineer-1) é concedida; então seu serial é adicionado à
CRL, e a mesma credencial ainda válida, não expirada e assinada pela CA é negada — o conteúdo empírico
da cláusula de revogação CR 1.8 / 1.9. Unicidade (Teste 3) ≠ revogabilidade; isso mostra que uma credencial
pode ser retirada.
python test4_revocation.py
test4_revocation.py); rotação — ainda não. A unicidade
por dispositivo (Teste 3) não é o mesmo que revogabilidade; o Teste 4 fecha essa lacuna — uma credencial
ainda válida, não expirada e assinada pela CA é concedida antes da revogação e negada depois, somente porque a
CRL assinada pela CA agora lista seu serial. Rotação (reemitir uma credencial substituta e aposentar a
antiga) é intimamente relacionada e habilitada pela mesma PKI, mas não é demonstrada separadamente aqui —
portanto, "vínculo de identidade por dispositivo" ainda não deve se expandir silenciosamente para "rotação resolvida."presented == KEY, identity in SAN) não são de tempo constante. Não explorável aqui — os valores
comparados são strings de identidade quase públicas e o TLS já fez a autenticação criptográfica real
antes de a comparação ser executada —, mas sinalizado porque o padrão é copiado para lugares
onde isso importa.python -m venv venv
venv\Scripts\activate # or: source venv/bin/activate
pip install -r requirements.txt
62443-4-2_SL2_MAPPING.md (CR 1.2 / 1.8 / 1.9 / 1.14 / 3.1,
honestamente classificados, cada lacuna nomeada; CR 1.2, CR 1.9 e a parte de emissão/validação/revogação do CR 1.8
agora estão demonstrados). Antes do PSIRT ([email protected] / [email protected]):
verificar o texto normativo de cada CR contra uma cópia adquirida da IEC 62443-4-2:2019.PHASED_ROLLOUT.md (Fase 0 estancar o sangramento · 1 segmentar · 2
controles compensatórios · 3 CIP Security/PKI, conforme o hardware permitir · 4 operar). Dimensionado para uma pequena
concessionária; honesto quanto ao CIP Security ser limitado por hardware, portanto as Fases 0–2 carregam a redução de risco de qualquer forma.Cada identificador externo aqui foi obtido de uma fonte viva em 31/07/2026, não lembrado do
treinamento: AA26-097A (multifonte, incl. WaterISAC / Tenable / SecurityWeek), Braham como uma das
quatro vítimas divulgadas, CyberAv3ngers/IRGC, PN1550 confirmou o advisory real da Rockwell com sua
citação da Linha 2 verificada verbatim ("Quando implantado corretamente, o CIP Security remedia essa vulnerabilidade"
ICSA-21-056-03, e 62443-4-2 CR 1.8 (PKI) + CR 3.1
(integridade de comunicação) confirmados exatamente.
Disciplina para o pacote: recuperar novamente cada identificador de fontes primárias no momento da submissão.
Advisories são renumerados, expandidos e substituídos — AA26-097A já mostra uma expansão —, portanto
"verificado em 31/07/2026" não é "verificado no envio." O mapeamento formal completo CR por CR do 62443-4-2 está
agora escrito (62443-4-2_SL2_MAPPING.md) — o que resta é recuperar o texto normativo citado contra
uma cópia adquirida do padrão antes da submissão, não escrever o mapeamento.l0gic — Patrick Crosby · 31/07/2026.
Registro de endurecimento: O Teste 3 foi reforçado para incluir o controle negativo (caso 4, provando necessidade, não apenas que dispara), o caso de direção reversa (caso 5, vínculo mútuo) e identidade baseada em SAN (não CN), e depois reverificado ao executar novamente todos os cinco casos; o Teste 4 (revogação por CRL) foi adicionado. As legendas dos Testes 1/2 foram ajustadas para manter as três classes de falha distintas; o Teste 2 foi rebaixado de "teste" para ponte narrativa; os limites de escopo de revogação e tempo constante foram adicionados. A cadeia de citações foi recuperada de fontes primárias e carimbada para nova recuperação no momento da submissão.
| Afirmação | Nível | Porquê |
|---|
| O princípio arquitetural | "um único segredo compartilhado em uma frota é comprometido em toda a frota por um único vazamento; autenticação vinculada à identidade por dispositivo fecha essa brecha" | COMPROVADO | demonstrado com código real em execução incluindo o controle negativo que prova que a verificação é necessária, não apenas que ela dispara: em um endpoint estrito, o certificado do Dispositivo B genuinamente válido pela CA é rejeitado por identidade (Teste 3 · caso 3), mas em um endpoint que verifica apenas a validade da CA, o mesmo certificado é aceito (caso 4 — o controle) → "assinado validamente pela CA sozinho == acesso à frota inteira == Teste 2 em roupagem de TLS." O vínculo também se sustenta no sentido inverso: um servidor malicioso apresentando um certificado de frota válido é rejeitado pelo cliente (caso 5). O Teste 1 mostra separadamente a linha de base mais ampla sem autenticação. |
| A implementação específica de CIP Security da Rockwell se comporta de forma idêntica | "habilitar o CIP Security em hardware Rockwell real remedia o CVE-2021-22681 exatamente dessa forma" | INDÍCIO, com fonte, não verificado | esta é a linguagem do próprio advisory da Rockwell (PN1550) — "Quando implantado corretamente, o CIP Security remedia essa vulnerabilidade... não faz uso de nenhuma chave hardcoded" — não é algo que confirmamos de forma independente contra hardware Logix real. Testamos o princípio que o advisory deles descreve, não sua implementação exata no nível de protocolo. |