
SpeechBrain < 1.1.1 exécution de code à distance (RCE) via les métadonnées de point de contrôle, due à un analyseur PyYAML non sécurisé de CKPT.yaml.
Sévérité : Élevée, CVSS 4.0 8.7, CVSS 3.1 8.8 (attribuée par VulnCheck, le CNA)
Vecteur (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
Vecteur (v3.1) : CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Versions concernées : SpeechBrain < 1.1.1
Corrigé dans : 1.1.1 / commit 22a6166
CWE : CWE-502 (Désérialisation de données non fiables)
Signalé par : Sai Teja Erukude
CNA : VulnCheck
Publié : 27 août 2026
SpeechBrain avant la version utilise le chargeur non sécurisé de PyYAML lors de l'analyse des métadonnées pendant la récupération de points de contrôle.
1.1.1CKPT.yamlUn attaquant capable de fournir ou de modifier un répertoire de points de contrôle SpeechBrain peut placer un fichier CKPT.yaml malveillant dans un répertoire de points de contrôle CKPT*. Lorsqu'une victime appelle Checkpointer.recover_if_possible(), SpeechBrain liste les points de contrôle candidats et analyse chaque fichier de métadonnées candidat avec :
yaml.load(fi, Loader=yaml.Loader)
Étant donné que yaml.Loader prend en charge les balises de construction d'objets Python telles que !!python/object/apply, des métadonnées de points de contrôle contrôlées par l'attaquant peuvent exécuter du code Python pendant la découverte des points de contrôle.
Le point de contrôle malveillant n'a pas besoin d'être sélectionné ou restauré. L'exécution de code se produit pendant que SpeechBrain énumère les points de contrôle candidats.
Un attaquant peut exécuter du code Python arbitraire dans le contexte du processus Python exécutant SpeechBrain.
Cela peut affecter les flux de travail où les utilisateurs téléchargent, décompressent, reprennent ou exécutent un entraînement/une inférence à partir de répertoires de points de contrôle, d'artefacts de modèles ou d'archives non fiables.
Selon le processus hôte, cela peut permettre :
Le composant concerné est le flux de récupération/listing des points de contrôle de SpeechBrain :
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
Pendant le listing des points de contrôle, SpeechBrain analyse les sous-répertoires nommés CKPT* contenant CKPT.yaml. Chaque fichier de métadonnées candidat est analysé avant la sélection finale du point de contrôle.
L'analyse non sécurisée se produit dans speechbrain.utils.checkpoints.checkpoints.py :
meta = yaml.load(fi, Loader=yaml.Loader)
La preuve de concept crée deux points de contrôle :
CKPT+poisoned-metadata : un point de contrôle malveillant plus ancien dont le CKPT.yaml contient une charge utile d'application d'objet PyYAML.CKPT+benign-newer : un point de contrôle bénin plus récent qui devrait être sélectionné par récence.Le point de contrôle bénin est sélectionné, mais les métadonnées du point de contrôle malveillant s'exécutent toujours pendant le listing des candidats. Cela démontre une exécution de code au moment de l'analyse des métadonnées, indépendamment de la restauration du point de contrôle.
package_builder.py crée la disposition des points de contrôle contrôlée par l'attaquant.
run_poc.py exécute la validation, appelle Checkpointer.recover_if_possible() et affiche les preuves d'exécution.
À exécuter uniquement dans un environnement de test local :
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
Preuves attendues sur les versions vulnérables :
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 preuve importante est que benign_checkpoint_selected: True et marker_after_recovery: True apparaissent ensemble. Cela montre que le point de contrôle malveillant plus ancien n'a pas été sélectionné pour la récupération, mais que ses métadonnées ont tout de même été analysées et exécutées pendant que SpeechBrain listait les points de contrôle candidats.
La charge utile est intentionnellement inoffensive. Elle écrit uniquement cette chaîne de marqueur locale :
speechbrain_checkpoint_yaml_loader_rce_triggered
Elle ne lance pas de shell, ne se connecte pas à un service réseau, ne lit pas de secrets, ne supprime pas de données et ne modifie pas de fichiers en dehors du répertoire de la preuve de concept.
Mettez à niveau vers SpeechBrain 1.1.1 ou une version ultérieure.
Le correctif de code durable consiste à utiliser le chargeur sécurisé de PyYAML pour les métadonnées de points de contrôle :
yaml.safe_load(fi)
ou :
yaml.load(fi, Loader=yaml.SafeLoader)
Les métadonnées de points de contrôle ne nécessitent que des valeurs scalaires telles que unixtime et end-of-epoch, la construction d'objets Python ne devrait donc pas être activée pour ce chemin d'analyse.
Si un correctif ou une mise à niveau immédiate n'est pas disponible :
CKPT.yaml.Découvert et signalé par Sai Teja Erukude, coordonné via VulnCheck.
exploit_walkthrough.md