
SpeechBrain < 1.1.1 RCE tramite metadati dei checkpoint, dovuta a un parsing non sicuro di PyYAML di CKPT.yaml.
Gravità: Alta, CVSS 4.0 8.7, CVSS 3.1 8.8 (assegnato da VulnCheck, il CNA)
Vettore (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
Vettore (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Interessato: SpeechBrain < 1.1.1
Corretto in: 1.1.1 / commit 22a6166
CWE: CWE-502 (Deserializzazione di dati non attendibili)
Scoperto e segnalato da: Sai Teja Erukude
Pubblicato: 27 agosto 2026
SpeechBrain precedente alla versione 1.1.1 utilizza il loader non sicuro di PyYAML durante il parsing dei metadati del checkpoint CKPT.yaml durante il ripristino del checkpoint.
Un attaccante in grado di fornire o modificare una directory di checkpoint di SpeechBrain può inserire un file CKPT.yaml malevolo all'interno di una directory di checkpoint CKPT*. Quando una vittima chiama Checkpointer.recover_if_possible(), SpeechBrain elenca i candidati checkpoint e analizza ogni file di metadati candidato con:
yaml.load(fi, Loader=yaml.Loader)
Poiché yaml.Loader supporta tag di costruzione di oggetti Python come
!!python/object/apply, i metadati dei checkpoint controllati da un attaccante possono eseguire
codice Python durante la scoperta dei checkpoint.
Il checkpoint malevolo non deve essere selezionato o ripristinato. L'esecuzione del codice avviene mentre SpeechBrain sta enumerando i candidati checkpoint.
Un attaccante può eseguire codice Python arbitrario nel contesto del processo Python che esegue SpeechBrain.
Ciò può influire su flussi di lavoro in cui gli utenti scaricano, estraggono, riprendono o eseguono addestramento/inferenza da directory di checkpoint, artefatti di modello o archivi non attendibili.
A seconda del processo ospitante, ciò può consentire di:
Il componente interessato è il flusso di recupero/elencazione dei checkpoint di SpeechBrain:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
Durante l'elenco dei checkpoint, SpeechBrain analizza le directory figlie denominate CKPT* che
contengono CKPT.yaml. Ogni file di metadati candidato viene analizzato prima della selezione
finale del checkpoint.
L'analisi non sicura avviene in speechbrain.utils.checkpoints.checkpoints.py:
meta = yaml.load(fi, Loader=yaml.Loader)
Il PoC crea due checkpoint:
CKPT+poisoned-metadata: un checkpoint malevolo più vecchio il cui CKPT.yaml
contiene un payload PyYAML object-apply.CKPT+benign-newer: un checkpoint benigno più recente che dovrebbe essere selezionato in base
alla recency.Il checkpoint benigno viene selezionato, ma i metadati del checkpoint malevolo vengono comunque eseguiti durante l'elenco dei candidati. Ciò dimostra l'esecuzione di codice al momento del parsing dei metadati indipendentemente dal ripristino del checkpoint.
package_builder.py crea il layout del
checkpoint controllato dall'attaccante.
run_poc.py esegue la validazione, chiama
Checkpointer.recover_if_possible() e stampa le prove di esecuzione.
Eseguire solo in un ambiente di test locale:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
Prove attese sulle versioni vulnerabili:
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'evidenza importante è che benign_checkpoint_selected: True e
marker_after_recovery: True compaiono insieme. Questo dimostra che il
checkpoint malevolo più vecchio non è stato selezionato per il ripristino, ma i suoi metadati sono stati comunque analizzati
ed eseguiti mentre SpeechBrain elencava i candidati checkpoint.
Il payload è intenzionalmente innocuo. Scrive solo questa stringa marker locale:
speechbrain_checkpoint_yaml_loader_rce_triggered
Non genera una shell, non si connette a un servizio di rete, non legge segreti, non elimina dati né modifica file al di fuori della directory PoC.
Eseguire l'aggiornamento a SpeechBrain 1.1.1 o versione successiva.
La correzione duratura del codice consiste nell'utilizzare il loader sicuro di PyYAML per i metadati dei checkpoint:
yaml.safe_load(fi)
o:
yaml.load(fi, Loader=yaml.SafeLoader)
I metadati del checkpoint richiedono solo valori scalari come unixtime e
end-of-epoch, quindi la costruzione di oggetti Python non dovrebbe essere abilitata per questo
percorso di parsing.
Se una patch o un aggiornamento immediato non è disponibile:
CKPT.yaml.Scoperto e segnalato da Sai Teja Erukude.
La divulgazione è stata coordinata tramite VulnCheck.
exploit_walkthrough.md