Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-52134-libiec61850 — Aviso técnico público y evidencia de reproducción para CVE-2026-52134 que afecta el manejo de reproducción de GOOSE en libiec61850 v1.6. | Kitploit
Herramientas/GitHubGitHub/if-forget/cve-2026-52134-libiec61850
Análisis de VulnerabilidadesSeguridad SCADA/ICSSeguridad de RedesAprendizaje y EducaciónRecursos CuradosLabs y Práctica
GitHubif-forget/cve-2026-52134-libiec61850

CVE-2026-52134-libiec61850

Aviso técnico público y evidencia de reproducción para CVE-2026-52134 que afecta el manejo de reproducción de GOOSE en libiec61850 v1.6.

Ver Repositorio
17hace 2 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-52134: Replay de GOOSE y manejo de frescura de mensajes en libiec61850 v1.6

Estado

Se ha asignado CVE-2026-52134. La publicación del registro CVE correspondiente está pendiente.

Producto afectado

  • Proveedor: MZ Automation GmbH
  • Producto: libiec61850
  • Versión probada: 1.6
  • Estado de otras versiones: No confirmado
  • Archivo afectado: src/goose/goose_receiver.c
  • Función afectada: parseGoosePayload()

Resumen

La ruta de recepción del suscriptor GOOSE en libiec61850 v1.6 no rechaza adecuadamente ciertos mensajes GOOSE reinyectados u obsoletos antes de actualizar el estado visible por el suscriptor e invocar la devolución de llamada (callback) del listener registrado.

Dos experimentos controlados demuestran un comportamiento relacionado en la misma ruta de recepción:

  1. Retroceso de stNum inferior: después de que el suscriptor procesara stNum=2, reinyectar una trama stNum=1 capturada previamente hizo que el listener volviera a informar el estado y los datos anteriores.
  2. Replay de sqNum no creciente: cuando se reinyectó una trama capturada previamente con el mismo stNum pero un sqNum más antiguo, la trama se marcó como no válida, pero los callbacks del listener siguieron ocurriendo y los datos reinyectados permanecieron visibles.

Estos se presentan como dos observaciones relacionadas de un único problema de manejo de replay/frescura de mensajes, no como dos CVEs separados.

Requisitos del ataque

Un atacante debe poder:

  • Acceder al dominio de difusión IEEE 802.3 de capa 2 o a la VLAN correspondiente
  • Capturar tramas Ethernet GOOSE legítimas
  • Inyectar tramas Ethernet usando EtherType 0x88B8

Esto no es un ataque remoto arbitrario basado en Internet.

Base técnica

La lógica de recepción relevante comprueba sqNum cuando el stNum recibido es igual al stNum almacenado. La ruta de código probada no rechaza un stNum inferior antes de que se actualice el estado del suscriptor y se invoque al listener.

El archivo de la librería probado no fue modificado. Las copias original y de trabajo de src/goose/goose_receiver.c tenían el mismo valor SHA-256:

c42f2aec80f605c458d0bca524ccb09f2e35f9b83a02f854f95d9444616c075b

Verificación de integridad de la fuente

Entorno de prueba

  • Ubuntu 20.04.6 LTS
  • libiec61850 v1.6
  • Par Ethernet virtual aislado veth0 / veth1 de Linux
  • tcpdump
  • TShark
  • Python 3 y Scapy
  • Publicador y suscriptor de ejemplo modificados, utilizados únicamente como banco de pruebas (test harness)

El banco de pruebas produjo transiciones de estado controladas e imprimió los valores de stNum, sqNum, validez y datos visibles por el callback. El archivo vulnerable de la librería no fue modificado.

Experimento A: retroceso de stNum inferior

Línea base

El publicador controlado envió dos estados:

State A: stNum=1, sqNum=0, data=1111
State B: stNum=2, sqNum=0, data=2222

La captura de paquetes de línea base contenía dos tramas GOOSE en este orden:

Frame 1: stNum=1, sqNum=0
Frame 2: stNum=2, sqNum=0

Campos y callbacks de la línea base

La salida del suscriptor también contenía un callback auxiliar para stNum=1, sqNum=0 marcado como valid=false antes del Estado B. Este callback auxiliar se conserva en las evidencias, pero no se utiliza como base para la conclusión del retroceso. El estado decisivo previo a la reinyección fue el callback posterior que contenía stNum=2 y el valor de datos 2222.

Replay único

El script de replay cargó la captura de línea base de dos tramas, seleccionó la trama 1 y la envió una vez a través de veth0.

Inmediatamente antes del replay, el listener había informado:

stNum=2, sqNum=0, valid=true, allData={2222}

Después de que la trama antigua se reinyectó una vez, el listener informó:

stNum=1, sqNum=0, valid=true, allData={1111}

Replay único y retroceso de stNum

Esto demuestra un retroceso observado del estado del suscriptor de stNum=2 a stNum=1 después de reinyectar una trama capturada previamente con un stNum inferior.

Replays idénticos adicionales

Se enviaron cuatro copias más de la misma trama antigua. Las cuatro contenían stNum=1, sqNum=0.

Las copias posteriores se informaron como valid=false, pero los números de callback continuaron aumentando y los datos reinyectados permanecieron visibles:

Los replays duplicados aún provocan callbacks

Esta observación secundaria muestra que marcar una trama repetida como no válida no impidió la entrega al listener en la ruta de recepción probada.

Experimento B: replay de sqNum no creciente

Una reproducción anterior utilizó el publicador y el suscriptor de ejemplo oficiales. El publicador produjo una secuencia normal con:

stNum=1
sqNum=0, 1, 2, 3

La primera trama capturada (stNum=1, sqNum=0) se reinyectó después de que el suscriptor ya hubiera procesado el valor posterior de la secuencia.

Línea base original de sqNum

Las copias reinyectadas se informaron como no válidas porque el sqNum=0 recibido no era más reciente que el valor de secuencia almacenado. Sin embargo, el suscriptor continuó imprimiendo eventos del listener que contenían los datos reinyectados:

Callbacks del replay original de sqNum

Este experimento respalda una observación más limitada pero relacionada:

  • El replay del mismo estado se detectó mediante el indicador de validez.
  • La detección no impidió la entrega por callback del mensaje reinyectado en el ejemplo probado.

Las capturas de pantalla originales sin procesar del replay se conservan como material de respaldo:

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

Esas imágenes sin procesar contienen advertencias de importación de módulos opcionales de Scapy no relacionadas. Las advertencias no impidieron que el script informara de las tramas GOOSE capturadas y completara la transmisión, pero las capturas de pantalla más limpias de arriba son las preferidas para revisar el resultado técnico.

Relación entre los dos experimentos

Los experimentos demuestran diferentes ramas del mismo problema de replay/frescura de mensajes de GOOSE:

ObservaciónMensaje recibidoResultado observado
Replay de stNum inferiorstNum=2 almacenado; recibido stNum=1 antiguoEl estado y los datos antiguos se entregaron al listener y se informaron como válidos en la ejecución probada
Replay de sqNum no crecienteMismo stNum; recibido sqNum más antiguo o duplicadoEl mensaje se informó como no válido, pero los callbacks del listener y la entrega de los datos reinyectados continuaron

La primera observación es el hallazgo principal del CVE porque demuestra un retroceso de un estado más nuevo a un estado más antiguo. La segunda observación es evidencia de respaldo sobre cómo los replays no válidos del mismo estado continúan a través de la ruta del listener.

Descargar herramienta