
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 1.1.1 utilizza il loader non sicuro di PyYAML durante il parsing dei metadati del checkpoint CKPT.yaml nel recupero dei checkpoint.
Un 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