
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 (assegnata 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
Interessati: SpeechBrain < 1.1.1
Corretto in: 1.1.1 / commit 22a6166
CWE: CWE-502 (Deserializzazione di Dati Non Attendibili)
Segnalato da: Sai Teja Erukude
CNA: VulnCheck
Pubblicato: 27 agosto 2026
SpeechBrain precedente alla versione utilizza il loader non sicuro di PyYAML durante il parsing dei metadati del checkpoint nel recupero dei checkpoint.
1.1.1CKPT.yamlUn attaccante che può fornire o modificare una directory di checkpoint di SpeechBrain può inserire un file CKPT.yaml dannoso all'interno di una directory di checkpoint CKPT*. Quando una vittima chiama Checkpointer.recover_if_possible(), SpeechBrain elenca i checkpoint candidati 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 dall'attaccante possono eseguire codice Python durante l'individuazione dei checkpoint.
Il checkpoint dannoso non deve essere selezionato o ripristinato. L'esecuzione del codice avviene mentre SpeechBrain enumera i checkpoint candidati.
Un attaccante può eseguire codice Python arbitrario nel contesto del processo Python che esegue SpeechBrain.
Ciò può influenzare i flussi di lavoro in cui gli utenti scaricano, estraggono, riprendono o eseguono training/inferenza da directory di checkpoint, artefatti di modelli o archivi non attendibili.
A seconda del processo host, ciò può consentire:
Il componente interessato è il flusso di recupero/elencazione dei checkpoint di SpeechBrain:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
Durante l'elencazione dei checkpoint, SpeechBrain esamina le sottodirectory denominate CKPT* che contengono CKPT.yaml. Ogni file di metadati candidato viene analizzato prima della selezione finale del checkpoint.
Il parsing non sicuro avviene in speechbrain.utils.checkpoints.checkpoints.py:
meta = yaml.load(fi, Loader=yaml.Loader)
La PoC crea due checkpoint:
CKPT+poisoned-metadata: un checkpoint dannoso più vecchio il cui CKPT.yaml contiene un payload object-apply di PyYAML.CKPT+benign-newer: un checkpoint benigno più recente che dovrebbe essere selezionato per recency.Il checkpoint benigno viene selezionato, ma i metadati del checkpoint dannoso vengono comunque eseguiti durante l'elencazione dei candidati. Ciò dimostra l'esecuzione di codice al momento del parsing dei metadati, indipendente dal ripristino del checkpoint.
package_builder.py crea il layout dei 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
La prova importante è che benign_checkpoint_selected: True e marker_after_recovery: True compaiono insieme. Ciò dimostra che il checkpoint dannoso più vecchio non è stato selezionato per il recupero, ma i suoi metadati sono stati comunque analizzati ed eseguiti mentre SpeechBrain elencava i checkpoint candidati.
Il payload è intenzionalmente innocuo. Scrive solo questa stringa di marcatore locale:
speechbrain_checkpoint_yaml_loader_rce_triggered
Non avvia una shell, non si connette a un servizio di rete, non legge segreti, non elimina dati e non modifica file al di fuori della directory della PoC.
Aggiornare a SpeechBrain 1.1.1 o successivo.
La correzione duratura del codice consiste nell'usare il loader sicuro di PyYAML per i metadati dei checkpoint:
yaml.safe_load(fi)
oppure:
yaml.load(fi, Loader=yaml.SafeLoader)
I metadati dei 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, coordinato tramite VulnCheck.
exploit_walkthrough.md