
SpeechBrain < 1.1.1 RCE via metadados de checkpoint por análise insegura de PyYAML do CKPT.yaml.
Severidade: 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)
Descoberto e reportado por: Sai Teja Erukude
Publicado: 27 de agosto de 2026
O SpeechBrain anterior à versão 1.1.1 utiliza o carregador inseguro do PyYAML ao analisar os metadados de checkpoint CKPT.yaml durante a recuperação de checkpoints.
Um atacante capaz de fornecer ou modificar um diretório de checkpoint do SpeechBrain pode colocar um arquivo CKPT.yaml malicioso dentro de um diretório de checkpoint CKPT*. Quando a vítima chama Checkpointer.recover_if_possible(), o SpeechBrain lista os checkpoints candidatos e analisa cada arquivo de metadados candidato com:
yaml.load(fi, Loader=yaml.Loader)
Como yaml.Loader oferece suporte a 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 está enumerando 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 nos quais os usuários baixam, descompactam, retomam ou executam treinamento/inferência a partir de diretórios de checkpoint, artefatos de modelo ou arquivos não confiáveis.
Dependendo do processo de hospedagem, isso pode permitir:
O componente afetado é o fluxo de recuperação/listagem de checkpoints do SpeechBrain:
Checkpointer.recover_if_possible()
-> list_checkpoints()
-> _construct_checkpoint_objects()
Durante a listagem de checkpoints, o SpeechBrain examina diretórios filhos chamados CKPT* que
contêm CKPT.yaml. Cada arquivo de metadados candidato é analisado antes da seleção
final do checkpoint.
A análise insegura 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 aplicação de objeto 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 são executados durante a listagem de candidatos. Isso demonstra execução de código em tempo de análise de metadados, independente da restauração do checkpoint.
package_builder.py cria o layout de
checkpoint controlado pelo atacante.
run_poc.py executa a validação, chama
Checkpointer.recover_if_possible() e imprime 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ência esperada 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 grava esta string de marcador local:
speechbrain_checkpoint_yaml_loader_rce_triggered
Não abre um shell, não se conecta a um serviço de rede, não lê segredos, não elimina dados nem modifica ficheiros fora do diretório do PoC.
Atualize para o SpeechBrain 1.1.1 ou posterior.
A correção de código duradoura consiste em utilizar o carregador seguro do PyYAML para os metadados do 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 esse
caminho de análise.
Se um patch ou upgrade imediato não estiver disponível:
CKPT.yaml.Descoberto e reportado por Sai Teja Erukude.
A divulgação foi coordenada através da VulnCheck.
exploit_walkthrough.md