
SpeechBrain < 1.1.1 RCE a través de metadatos de checkpoint mediante análisis inseguro de PyYAML de CKPT.yaml.
Gravedad: Alta, CVSS 4.0 8.7, CVSS 3.1 8.8 (asignada por VulnCheck, el CNA)
Vector (v4.0): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Vector (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Afecta a: SpeechBrain < 1.1.1
Corregido en: 1.1.1 / commit 22a6166
CWE: CWE-502 (Deserialización de datos no confiables)
Descubierto y reportado por: Sai Teja Erukude
Publicado: 27 de agosto de 2026
SpeechBrain anterior a 1.1.1 utiliza el cargador inseguro de PyYAML al analizar los metadatos del checkpoint CKPT.yaml durante la recuperación de checkpoints.
Un atacante que pueda proporcionar o modificar un directorio de checkpoint de SpeechBrain puede colocar un archivo CKPT.yaml malicioso dentro de un directorio de checkpoint CKPT*. Cuando una víctima llama a Checkpointer.recover_if_possible(), SpeechBrain enumera los checkpoints candidatos y analiza cada archivo de metadatos candidato con:
yaml.load(fi, Loader=yaml.Loader)
Debido a que yaml.Loader admite etiquetas de construcción de objetos de Python como
!!python/object/apply, los metadatos de checkpoint controlados por el atacante pueden ejecutar
código Python durante el descubrimiento de checkpoints.
El checkpoint malicioso no necesita ser seleccionado ni restaurado. La ejecución de código ocurre mientras SpeechBrain está enumerando los candidatos a checkpoint.
Un atacante puede ejecutar código Python arbitrario en el contexto del proceso de Python que ejecuta SpeechBrain.
Esto puede afectar flujos de trabajo en los que los usuarios descargan, descomprimen, reanudan o ejecutan entrenamiento/inferencia desde directorios de checkpoints, artefactos de modelos o archivos no confiables.
Dependiendo del proceso anfitrión, esto puede permitir:
El componente afectado es el flujo de recuperación/listado de checkpoints de SpeechBrain:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
Durante el listado de checkpoints, SpeechBrain escanea los directorios hijos llamados CKPT* que contienen CKPT.yaml. Cada archivo de metadatos candidato se analiza antes de la selección final del checkpoint.
El análisis inseguro ocurre en speechbrain.utils.checkpoints.checkpoints.py:
meta = yaml.load(fi, Loader=yaml.Loader)
El PoC crea dos checkpoints:
CKPT+poisoned-metadata: un checkpoint malicioso más antiguo cuyo CKPT.yaml
contiene un payload de aplicación de objetos de PyYAML.CKPT+benign-newer: un checkpoint benigno más reciente que debería ser seleccionado por
antigüedad.Se selecciona el checkpoint benigno, pero los metadatos del checkpoint malicioso aún se ejecutan durante el listado de candidatos. Esto demuestra la ejecución de código en tiempo de análisis de metadatos, independientemente de la restauración del checkpoint.
package_builder.py crea el diseño del
checkpoint controlado por el atacante.
run_poc.py ejecuta la validación, llama a
Checkpointer.recover_if_possible() e imprime la evidencia de ejecución.
Ejecutar solo en un entorno de prueba local:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
Evidencia esperada en versiones vulnerables:
speechbrain_version: 1.1.0
installed_package: True
recovery_error: None
benign_checkpoint_selected: True
marker_before_recovery: False
marker_after_recovery: True
marker_contents:
speechbrain_checkpoint_yaml_loader_rce_triggered
success: True
La evidencia importante es que benign_checkpoint_selected: True y
marker_after_recovery: True aparecen juntos. Esto demuestra que el checkpoint
malicioso más antiguo no fue seleccionado para la recuperación, pero sus metadatos
aun así fueron analizados y ejecutados mientras SpeechBrain listaba los candidatos
a checkpoint.
El payload es intencionalmente inofensivo. Solo escribe esta cadena de marcador local:
speechbrain_checkpoint_yaml_loader_rce_triggered
No genera un shell, no se conecta a un servicio de red, no lee secretos, no elimina datos ni modifica archivos fuera del directorio del PoC.
Actualice a SpeechBrain 1.1.1 o posterior.
La corrección duradera del código consiste en utilizar el cargador seguro de PyYAML para los metadatos del checkpoint:
yaml.safe_load(fi)
o:
yaml.load(fi, Loader=yaml.SafeLoader)
Los metadatos del checkpoint solo necesitan valores escalares como unixtime y
end-of-epoch, por lo que la construcción de objetos de Python no debería habilitarse para esta
ruta de análisis.
Si no hay disponible un parche o una actualización inmediata:
CKPT.yaml.Descubierto y reportado por Sai Teja Erukude.
La divulgación se coordinó a través de VulnCheck.
exploit_walkthrough.md