
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
Affecté : SpeechBrain < 1.1.1
Corrigé dans : 1.1.1 / commit 22a6166
CWE : CWE-502 (Désérialisation de données non fiables)
Découvert et signalé par : Sai Teja Erukude
Publié : 27 août 2026
SpeechBrain avant 1.1.1 utilise le chargeur non sécurisé de PyYAML lors de l'analyse des métadonnées de point de contrôle CKPT.yaml pendant la récupération de point de contrôle.
Un attaquant capable de fournir ou de modifier un répertoire de point de contrôle SpeechBrain peut placer un fichier CKPT.yaml malveillant à l'intérieur d'un répertoire de point 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)
Parce que yaml.Loader prend en charge les balises de construction d'objets Python telles que
!!python/object/apply, des métadonnées de checkpoint contrôlées par un attaquant peuvent exécuter
du code Python lors de la découverte des checkpoints.
Le checkpoint malveillant n'a pas besoin d'être sélectionné ou restauré. L'exécution de code se produit pendant que SpeechBrain énumère les checkpoints 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 checkpoints, d'artefacts de modèles ou d'archives non fiables.
Selon le processus hôte, cela peut permettre :
Le composant affecté est le flux de récupération/listage des checkpoints de SpeechBrain :
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
Lors du listage des checkpoints, SpeechBrain parcourt les répertoires enfants nommés CKPT* qui contiennent CKPT.yaml. Chaque fichier de métadonnées candidat est analysé avant la sélection finale du checkpoint.
L'analyse non sécurisée se produit dans speechbrain.utils.checkpoints.checkpoints.py :
meta = yaml.load(fi, Loader=yaml.Loader)
Le PoC crée deux checkpoints :
CKPT+poisoned-metadata : un checkpoint malveillant plus ancien dont le CKPT.yaml
contient une charge utile d'application d'objet PyYAML.CKPT+benign-newer : un checkpoint bénin plus récent qui devrait être sélectionné par
ancienneté.Le checkpoint bénin est sélectionné, mais les métadonnées du checkpoint malveillant s'exécutent tout de même lors du listage 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 checkpoint.
package_builder.py crée la disposition de checkpoint
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
L'élément de preuve important est que benign_checkpoint_selected: True et
marker_after_recovery: True apparaissent ensemble. Cela montre que l'ancien
checkpoint malveillant 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 checkpoints candidats.
La charge utile est intentionnellement inoffensive. Elle écrit uniquement cette chaîne de marqueur locale :
speechbrain_checkpoint_yaml_loader_rce_triggered
Il ne lance pas de shell, ne se connecte à aucun service réseau, ne lit aucun secret, ne supprime aucune donnée et ne modifie aucun fichier en dehors du répertoire PoC.
Mettez à niveau vers SpeechBrain 1.1.1 ou une version ultérieure.
Le correctif durable dans le code consiste à utiliser le chargeur sécurisé de PyYAML pour les métadonnées de point de contrôle :
yaml.safe_load(fi)
ou :
yaml.load(fi, Loader=yaml.SafeLoader)
Les métadonnées de point de contrôle n'ont besoin que de valeurs scalaires telles que unixtime et
end-of-epoch, donc la construction d'objets Python ne devrait 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.
La divulgation a été coordonnée via VulnCheck.
exploit_walkthrough.md