
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 (asignado por VulnCheck, la 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
Afectado: SpeechBrain < 1.1.1
Corregido en: 1.1.1 / commit 22a6166
CWE: CWE-502 (Deserialización de Datos No Confiables)
Reportado por: Sai Teja Erukude
CNA: VulnCheck
Publicado: 27 de agosto de 2026
SpeechBrain anterior a utiliza el cargador inseguro de PyYAML al analizar los metadatos de durante la recuperación de puntos de control.
1.1.1CKPT.yamlUn atacante que pueda suministrar o modificar un directorio de puntos de control de SpeechBrain puede colocar un archivo CKPT.yaml malicioso dentro de un directorio de puntos de control CKPT*. Cuando una víctima llama a Checkpointer.recover_if_possible(), SpeechBrain enumera los candidatos de puntos de control 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 puntos de control controlados por el atacante pueden ejecutar código Python durante el descubrimiento de puntos de control.
El punto de control malicioso no necesita ser seleccionado o restaurado. La ejecución de código ocurre mientras SpeechBrain enumera los candidatos de puntos de control.
Un atacante puede ejecutar código Python arbitrario en el contexto del proceso Python que ejecuta SpeechBrain.
Esto puede afectar flujos de trabajo donde los usuarios descargan, descomprimen, reanudan o ejecutan entrenamiento/inferencia desde directorios de puntos de control, artefactos de modelos o archivos no confiables.
Dependiendo del proceso de alojamiento, esto puede permitir:
El componente afectado es el flujo de recuperación/enumeración de puntos de control de SpeechBrain:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
Durante la enumeración de puntos de control, SpeechBrain escanea los subdirectorios llamados CKPT* que contienen CKPT.yaml. Cada archivo de metadatos candidato se analiza antes de la selección final del punto de control.
El análisis inseguro ocurre en speechbrain.utils.checkpoints.checkpoints.py:
meta = yaml.load(fi, Loader=yaml.Loader)
El PoC crea dos puntos de control:
CKPT+poisoned-metadata: un punto de control malicioso más antiguo cuyo CKPT.yaml contiene una carga útil de aplicación de objeto PyYAML.CKPT+benign-newer: un punto de control benigno más reciente que debería ser seleccionado por antigüedad.El punto de control benigno es seleccionado, pero los metadatos del punto de control malicioso aún se ejecutan durante la enumeración de candidatos. Esto demuestra la ejecución de código en tiempo de análisis de metadatos independiente de la restauración del punto de control.
package_builder.py crea el diseño de puntos de control 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 punto de control malicioso más antiguo no fue seleccionado para la recuperación, pero sus metadatos aún fueron analizados y ejecutados mientras SpeechBrain enumeraba los candidatos de puntos de control.
La carga útil es intencionalmente inofensiva. Solo escribe esta cadena de marcador local:
speechbrain_checkpoint_yaml_loader_rce_triggered
No inicia 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 de código duradera es usar el cargador seguro de PyYAML para los metadatos de puntos de control:
yaml.safe_load(fi)
o:
yaml.load(fi, Loader=yaml.SafeLoader)
Los metadatos de puntos de control solo necesitan valores escalares como unixtime y end-of-epoch, por lo que la construcción de objetos de Python no debería estar habilitada para esta ruta de análisis.
Si un parche o actualización inmediata no está disponible:
CKPT.yaml.Descubierto y reportado por Sai Teja Erukude, coordinado a través de VulnCheck.
exploit_walkthrough.md