
SpeechBrain < 1.1.1 RCE via metadados de checkpoint por análise insegura de PyYAML do CKPT.yaml.
Gravidade: Alta, CVSS 4.0 8.7, CVSS 3.1 8.8 (atribuída pela VulnCheck, a CNA)
Vetor (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
Vetor (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Afetado: SpeechBrain < 1.1.1
Corrigido em: 1.1.1 / commit 22a6166
CWE: CWE-502 (Desserialização de Dados Não Confiáveis)
Reportado por: Sai Teja Erukude
CNA: VulnCheck
Publicado: 27 de agosto de 2026
O SpeechBrain anterior à versão 1.1.1 usa o loader inseguro do PyYAML ao analisar os metadados de
durante a recuperação de checkpoints.
CKPT.yamlUm atacante que possa fornecer ou modificar um diretório de checkpoints do SpeechBrain pode colocar
um arquivo CKPT.yaml malicioso dentro de um diretório de checkpoint CKPT*. Quando uma vítima
chama Checkpointer.recover_if_possible(), o SpeechBrain lista os candidatos a checkpoint
e analisa os metadados de cada candidato com:
yaml.load(fi, Loader=yaml.Loader)
Como yaml.Loader suporta tags de construção de objetos Python, como
!!python/object/apply, metadados de checkpoint controlados pelo atacante podem executar
código Python durante a descoberta de checkpoints.
O checkpoint malicioso não precisa ser selecionado ou restaurado. A execução de código ocorre enquanto o SpeechBrain enumera os candidatos a checkpoint.
Um atacante pode executar código Python arbitrário no contexto do processo Python que executa o SpeechBrain.
Isso pode afetar fluxos de trabalho onde usuários baixam, descompactam, retomam ou executam treinamento/inferência a partir de diretórios de checkpoints, artefatos de modelo ou arquivos não confiáveis.
Dependendo do processo hospedeiro, isso pode permitir:
O componente afetado é o fluxo de recuperação/lista de checkpoints do SpeechBrain:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
Durante a listagem de checkpoints, o SpeechBrain verifica subdiretórios nomeados CKPT* que
contêm CKPT.yaml. Cada arquivo de metadados candidato é analisado antes da seleção final do checkpoint.
O parsing inseguro ocorre em speechbrain.utils.checkpoints.checkpoints.py:
meta = yaml.load(fi, Loader=yaml.Loader)
O PoC cria dois checkpoints:
CKPT+poisoned-metadata: um checkpoint malicioso mais antigo cujo CKPT.yaml
contém um payload de object-apply do PyYAML.CKPT+benign-newer: um checkpoint benigno mais recente que deve ser selecionado por
recência.O checkpoint benigno é selecionado, mas os metadados do checkpoint malicioso ainda executam durante a listagem de candidatos. Isso demonstra execução de código no momento do parsing de metadados, independente da restauração do checkpoint.
package_builder.py cria o layout de checkpoints controlado pelo atacante.
run_poc.py executa a validação, chama
Checkpointer.recover_if_possible() e imprime as evidências de execução.
Execute apenas em um ambiente de teste local:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python -B run_poc.py
Evidências esperadas em versões vulneráveis:
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
A evidência importante é que benign_checkpoint_selected: True e
marker_after_recovery: True aparecem juntos. Isso mostra que o checkpoint malicioso
mais antigo não foi selecionado para recuperação, mas seus metadados ainda foram analisados
e executados enquanto o SpeechBrain listava os candidatos a checkpoint.
O payload é intencionalmente inofensivo. Ele apenas escreve esta string de marcador local:
speechbrain_checkpoint_yaml_loader_rce_triggered
Ele não abre um shell, não se conecta a um serviço de rede, não lê segredos, não exclui dados nem modifica arquivos fora do diretório do PoC.
Atualize para o SpeechBrain 1.1.1 ou posterior.
A correção durável no código é usar o loader seguro do PyYAML para metadados de checkpoint:
yaml.safe_load(fi)
ou:
yaml.load(fi, Loader=yaml.SafeLoader)
Os metadados de checkpoint precisam apenas de valores escalares, como unixtime e
end-of-epoch, portanto a construção de objetos Python não deve ser habilitada para este
caminho de parsing.
Se um patch ou atualização imediata não estiver disponível:
CKPT.yaml.Descoberto e reportado por Sai Teja Erukude, coordenado através da VulnCheck.
exploit_walkthrough.md