Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-52134-libiec61850 — Aviso técnico público e evidência de reprodução para CVE-2026-52134 que afeta o tratamento de replay GOOSE no libiec61850 v1.6. | Kitploit
Ferramentas/GitHubGitHub/if-forget/cve-2026-52134-libiec61850
Análise de VulnerabilidadesSegurança SCADA/ICSSegurança de RedeAprendizado e EducaçãoRecursos CuradosLabs e Prática
GitHubif-forget/cve-2026-52134-libiec61850

CVE-2026-52134-libiec61850

Aviso técnico público e evidência de reprodução para CVE-2026-52134 que afeta o tratamento de replay GOOSE no libiec61850 v1.6.

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
Ver Repositório
há 21 diasAinda não revisado

CVE-2026-52134: Tratamento de replay e atualidade de mensagens GOOSE no libiec61850 v1.6

Status

O CVE-2026-52134 foi atribuído. A publicação do registro CVE correspondente está pendente.

Produto afetado

  • Fornecedor: MZ Automation GmbH
  • Produto: libiec61850
  • Versão testada: 1.6
  • Status das demais versões: Não confirmado
  • Arquivo afetado: src/goose/goose_receiver.c
  • Função afetada: parseGoosePayload()

Resumo

O caminho de recepção do assinante GOOSE no libiec61850 v1.6 não rejeita adequadamente determinadas mensagens GOOSE repetidas (replay) ou obsoletas antes de atualizar o estado visível ao assinante e invocar o callback do listener registrado.

Dois experimentos controlados demonstram comportamento relacionado no mesmo caminho de recepção:

  1. Retrocesso de stNum menor: após o assinante processar stNum=2, repetir um quadro stNum=1 capturado anteriormente fez o listener reportar novamente o estado e os dados mais antigos.
  2. Replay de sqNum não crescente: quando um quadro capturado anteriormente com o mesmo stNum, porém com sqNum mais antigo, foi repetido, o quadro foi marcado como inválido, mas os callbacks do listener ainda ocorreram e os dados repetidos permaneceram visíveis.

Estes são apresentados como duas observações relacionadas de um único problema de tratamento de replay/atualidade de mensagens, e não como dois CVEs separados.

Pré-requisitos do ataque

Um atacante deve ser capaz de:

  • Acessar o domínio de broadcast IEEE 802.3 de Camada 2 ou VLAN relevante
  • Capturar quadros Ethernet GOOSE legítimos
  • Injetar quadros Ethernet usando EtherType 0x88B8

Este não é um ataque remoto arbitrário baseado na Internet.

Base técnica

A lógica de recepção relevante verifica sqNum quando o stNum recebido é igual ao stNum armazenado. O caminho de código testado não rejeita um stNum menor antes de o estado do assinante ser atualizado e o listener ser invocado.

O arquivo de biblioteca testado não foi modificado. As cópias original e de trabalho de src/goose/goose_receiver.c tinham o mesmo valor SHA-256:

root@kitploit:~
c42f2aec80f605c458d0bca524ccb09f2e35f9b83a02f854f95d9444616c075b

Verificação de integridade da origem

Ambiente de teste

  • Ubuntu 20.04.6 LTS
  • libiec61850 v1.6
  • Par de Ethernet virtual isolado veth0 / veth1 do Linux
  • tcpdump
  • TShark
  • Python 3 e Scapy
  • Publicador e assinante de exemplo modificados, usados apenas como bancada de teste

A bancada de teste produziu transições de estado controladas e imprimiu valores de stNum, sqNum, validade e dados visíveis no callback. O próprio arquivo vulnerável da biblioteca não foi modificado.

Experimento A: retrocesso de stNum menor

Linha de base

O publicador controlado enviou dois estados:

root@kitploit:~
State A: stNum=1, sqNum=0, data=1111
State B: stNum=2, sqNum=0, data=2222

A captura de pacotes da linha de base continha dois quadros GOOSE nesta ordem:

root@kitploit:~
Frame 1: stNum=1, sqNum=0
Frame 2: stNum=2, sqNum=0

Campos e callbacks da linha de base

A saída do assinante também continha um callback auxiliar para stNum=1, sqNum=0 marcado com valid=false antes do Estado B. Esse callback auxiliar é mantido nas evidências, mas não é usado como base para a conclusão do retrocesso. O estado decisivo anterior ao replay era o callback posterior contendo stNum=2 e o valor de dados 2222.

Replay único

O script de replay carregou a captura de linha de base com dois quadros, selecionou o quadro 1 e o enviou uma vez através de veth0.

Imediatamente antes do replay, o listener havia reportado:

root@kitploit:~
stNum=2, sqNum=0, valid=true, allData={2222}

Depois que o quadro antigo foi repetido uma vez, o listener reportou:

root@kitploit:~
stNum=1, sqNum=0, valid=true, allData={1111}

Replay único e retrocesso de stNum

Isso demonstra um retrocesso observado do estado do assinante de stNum=2 para stNum=1 após repetir um quadro de stNum menor capturado anteriormente.

Replays idênticos adicionais

Mais quatro cópias do mesmo quadro antigo foram enviadas. Todas as quatro continham stNum=1, sqNum=0.

As cópias posteriores foram reportadas como valid=false, mas os números de callback continuaram aumentando e os dados repetidos permaneceram visíveis:

Replays duplicados ainda geram callbacks

Essa observação secundária mostra que marcar um quadro repetido como inválido não impediu a entrega ao listener no caminho de recepção testado.

Experimento B: replay de sqNum não crescente

Uma reprodução anterior usou o publicador e o assinante de exemplo oficiais. O publicador produziu uma sequência normal com:

root@kitploit:~
stNum=1
sqNum=0, 1, 2, 3

O primeiro quadro capturado (stNum=1, sqNum=0) foi então repetido depois que o assinante já havia processado o valor posterior da sequência.

Linha de base original do sqNum

As cópias repetidas foram reportadas como inválidas porque o sqNum=0 recebido não era mais recente que o valor de sequência armazenado. No entanto, o assinante continuou a imprimir eventos do listener contendo os dados repetidos:

Callbacks do replay original do sqNum

Este experimento suporta uma observação mais restrita, porém relacionada:

  • O replay do mesmo estado foi detectado por meio do sinalizador de validade.
  • A detecção não impediu a entrega por callback da mensagem repetida no exemplo testado.

As capturas de tela brutas do replay original são mantidas como material de apoio:

  • 12-original-sqnum-replay-command-raw.png
  • 13-original-sqnum-replay-terminal-raw.png

Essas imagens brutas contêm avisos não relacionados de importação de módulos opcionais do Scapy. Os avisos não impediram o script de reportar os quadros GOOSE capturados e concluir a transmissão, mas as capturas de tela mais limpas acima são preferidas para revisar o resultado técnico.

Relação entre os dois experimentos

Os experimentos demonstram diferentes ramificações do mesmo problema de replay/atualidade de mensagens GOOSE:

A primeira observação é o principal achado do CVE porque demonstra retrocesso de um estado mais novo para um estado mais antigo. A segunda observação é uma evidência de apoio sobre como replays inválidos do mesmo estado continuam pelo caminho do listener.

Impacto observado

O impacto demonstrado no nível de software é:

  • Um estado GOOSE anteriormente aceito pode ser entregue ao listener depois que um estado mais novo já foi processado.
  • O estado visível ao assinante pode passar de um stNum mais novo para um stNum mais antigo.
  • Quadros obsoletos repetidos podem continuar a causar atividade do listener mesmo quando as cópias posteriores são reportadas como inválidas.

Aplicações que consomem dados de callback sem aplicação independente de atualidade podem processar valores obsoletos ou repetidos.

O efeito a jusante depende da aplicação do assinante, da configuração, da lógica de intertravamento e da lógica de proteção.

Nenhum relé de proteção físico, circuito de disparo, disjuntor ou rede de subestação de produção foi testado ou operado nestes experimentos.

Direção de correção sugerida

Antes de atualizar o estado do assinante ou invocar o listener:

  1. Rejeite um stNum recebido que seja mais antigo que o último stNum aceito.
  2. Quando stNum não mudar, rejeite um sqNum não crescente.
  3. Garanta que um quadro classificado como inválido não possa sobrescrever o último estado aceito nem entregar dados obsoletos pelo caminho normal do listener.
  4. Considere o comportamento legítimo de reinicialização, ressincronização e tratamento de contadores na implementação final.

Redução temporária de risco

  • Restrinja o acesso aos segmentos Ethernet e VLANs GOOSE.
  • Impeça que dispositivos não autorizados injetem quadros de Camada 2.
  • Monitore retrocessos inesperados de stNum e valores repetidos de sqNum.
  • Valide a atualidade dos dados do assinante antes de usar valores de callback em lógica crítica.
  • Teste as alterações em um ambiente de laboratório isolado antes da implantação em produção.

Evidências de apoio

As imagens a seguir fornecem informações de proveniência e ambiente. Elas apoiam a reprodução, mas não são individualmente necessárias para compreender o resultado principal.

Inspeção da bancada de teste

Inspeção da bancada de teste

Build bem-sucedido

Build bem-sucedido

Rede veth isolada

Rede veth isolada

Resumo da captura de linha de base

Resumo da captura de linha de base

Checksums dos artefatos

Checksums dos artefatos

Classificação proposta

  • Fraqueza: fraqueza de validação de replay e atualidade de mensagens
  • CWE proposto: CWE-294, Authentication Bypass by Capture-replay

O resultado demonstrado é a aceitação de replay e a entrega de estado obsoleto. Isso não depende de comprovar que a autenticação criptográfica estava habilitada na implantação testada.

Referências

  • Repositório oficial do libiec61850
  • Arquivo de origem afetado na árvore v1.6
  • CVE-2026-52134 no CVE.org

Créditos

Reportado por:

  • Wang Jing
  • Li Chen Yu
  • Guo Lu Lu
  • Guo Jia Xin
  • Zhang Jia Tu
Baixar ferramenta
ObservaçãoMensagem recebidaResultado observado
Replay de stNum menorstNum=2 armazenado; stNum=1 antigo recebidoO estado e os dados antigos foram entregues ao listener e reportados como válidos na execução testada
Replay de sqNum não crescenteMesmo stNum; sqNum mais antigo ou duplicado recebidoA mensagem foi reportada como inválida, mas os callbacks do listener e a entrega dos dados repetidos continuaram