Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
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
6hace 1 mesAú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 , reinyectar una trama capturada previamente hizo que el listener volviera a informar el estado y los datos anteriores.
stNum=2
stNum=1
  • 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:

    root@kitploit:~
    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:

    root@kitploit:~
    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:

    root@kitploit:~
    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:

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

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

    root@kitploit:~
    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:

    root@kitploit:~
    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.

    Impacto observado

    El impacto demostrado a nivel de software es:

    • Un estado GOOSE previamente aceptado puede entregarse al listener después de que ya se haya procesado un estado más nuevo.
    • El estado visible por el suscriptor puede pasar de un stNum más nuevo a un stNum más antiguo.
    • Las tramas obsoletas repetidas pueden seguir causando actividad del listener incluso cuando las copias posteriores se informan como no válidas.

    Las aplicaciones que consumen datos del callback sin una aplicación independiente de frescura pueden procesar valores obsoletos o reinyectados.

    El efecto posterior depende de la aplicación del suscriptor, la configuración, la lógica de enclavamiento y la lógica de protección.

    No se probó ni operó ningún relé de protección físico, circuito de disparo, disyuntor ni red de subestación de producción en estos experimentos.

    Dirección de remediación sugerida

    Antes de actualizar el estado del suscriptor o invocar al listener:

    1. Rechazar un stNum recibido que sea más antiguo que el último stNum aceptado.
    2. Cuando stNum no haya cambiado, rechazar un sqNum no creciente.
    3. Asegurarse de que una trama clasificada como no válida no pueda sobrescribir el último estado aceptado ni entregar datos obsoletos a través de la ruta normal del listener.
    4. Tener en cuenta el comportamiento legítimo de reinicio, resincronización y manejo de contadores en la implementación final.

    Reducción temporal del riesgo

    • Restringir el acceso a los segmentos Ethernet GOOSE y a las VLAN.
    • Evitar que dispositivos no autorizados inyecten tramas de capa 2.
    • Supervisar retrocesos inesperados de stNum y valores repetidos de sqNum.
    • Validar la frescura de los datos del suscriptor antes de usar los valores del callback en lógica crítica.
    • Probar los cambios en un entorno de laboratorio aislado antes del despliegue en producción.

    Evidencia de respaldo

    Las siguientes imágenes proporcionan información de procedencia y del entorno. Respaldan la reproducción, pero no son individualmente necesarias para comprender el resultado principal.

    Inspección del banco de pruebas

    Inspección del banco de pruebas

    Compilación exitosa

    Compilación exitosa

    Red veth aislada

    Red veth aislada

    Resumen de captura de línea base

    Resumen de captura de línea base

    Checksums de los artefactos

    Checksums de los artefactos

    Clasificación propuesta

    • Debilidad: debilidad de validación de replay y frescura de mensajes
    • CWE propuesto: CWE-294, Omisión de autenticación mediante captura-replay

    El resultado demostrado es la aceptación de replay y la entrega de estado obsoleto. No depende de demostrar que la autenticación criptográfica estaba habilitada en el despliegue probado.

    Referencias

    • Repositorio oficial de libiec61850
    • Archivo fuente afectado en el árbol v1.6
    • CVE-2026-52134 en CVE.org

    Créditos

    Informado por:

    • Wang Jing
    • Li Chen Yu
    • Guo Lu Lu
    • Guo Jia Xin
    • Zhang Jia Tu
    Descargar herramienta