Skip to main content

MLflow CVE-2026-116692

| EUVDEUVD-2026-111383 CRITICAL
Code Injection (CWE-94)
2026-10-27 GitHub_M GHSA-26p8-2jq9-3vq9
9.8
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Reach MLflow tracking server over network
  2. Delivery
    Create experiment with file:// artifact root under allowed scorer package
  3. Exploit
    Upload malicious Python module as run artifact
  4. Execution
    Invoke scorer endpoint to import module
  5. Impact
    Constructor runs, achieving code execution as server process

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Code injection prevention, sandbox exec
MITRE ATT&CK

2 techniques across 2 tactics: Execution, Initial Access

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

The allowed third-party scorer package directory (e.g. mlflow/genai/scorers/trulens under site-packages) must be writable by the MLflow server process - this holds in the official v3.14.0 image, which runs as uid 0 with a writable installed package tree, and may hold in virtualenvs installed and run by the same OS user. On authentication-disabled deployments (the default) no credentials are required. On basic-auth deployments the caller must be an authenticated principal able to create an experiment and run and upload artifacts, because the scorer-invoke endpoint uses validate_gateway_proxy and performs no experiment/scorer-level resource permission check. Affected versions are MLflow >= 3.12.0rc0 and < 3.17.0 (the feature is absent in 3.11.1). Exploitation is blocked by a read-only container filesystem or a scorer package directory owned by a different, non-writable user.

Impact

This is a genuine high-priority issue, not a CVSS-inflated one. The supplied CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 9.8) aligns with the mechanism described: the GHSA advisory demonstrates unauthenticated remote Python code execution against the default no-auth MLflow server using the official v3.14.0 image, with the process running as uid 0. The vuln.today decision label is 'act_now' and a vendor patch (3.17.0) is available, reinforcing urgency. The one nuance is that PR:N is only accurate for authentication-disabled deployments; for basic-auth deployments the attacker must be an authenticated principal able to create an experiment/run and upload artifacts, so PR would effectively be PR:L there - the single 9.8 score blends two deployment modes. Additionally, the whole chain depends on an environmental precondition - the allowed scorer package directory must be writable by the server process - which the CVSS vector does not capture; this holds by default in the official image but is blocked by a read-only filesystem or a package tree owned by a non-writable user. No EPSS score and no CISA KEV entry are present in the input, so widespread automated exploitation cannot be confirmed from the data; however, a reporter-executed proof of concept is attached to the advisory. On balance: default-configuration internet- or network-reachable MLflow tracking servers below 3.17.0 are at serious, realistic risk and should be patched immediately.

Exploit ScenarioDerived

An attacker with network reach to an MLflow tracking server (default no-auth configuration) creates an experiment whose file:// artifact location points beneath one of the allow-listed third-party scorer packages, creates a run, and uploads a malicious Python module as a run artifact. They then submit a serialized third-party scorer referencing that uploaded module via /ajax-api/3.0/mlflow/scorer/invoke, causing the server to import the module and run the attacker's constructor as the server process (uid 0 in the official image) before any trace processing. A reporter-executed proof of concept (new_remote_poc.py) is attached to the GHSA advisory and demonstrated code execution (PROOF_MATCH=1), though it is not independently verified here as weaponized exploit code.

Act Now Prioritize within 24-48h. Why: CRITICAL severity + public POC available.
1 PoC candidate (unverified) Patch available 0.7% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 28, 2026

Unauthenticated remote code execution in MLflow 3.12.0rc0 through 3.16.x lets any network caller reach the tracking server place a Python module under an allow-listed third-party scorer package and have the server import and instantiate it via the scorer invoke endpoint, executing arbitrary code in the MLflow server process. The flaw is a prefix-matching mistake in the third-party scorer allow-list combined with MLflow's own experiment, run and artifact-upload endpoints, which can be used to publish a module inside a writable scorer package directory; the shipped v3.14.0 container image, running as uid 0 with a writable site-packages tree, is fully exploitable without credentials, while basic-auth deployments require a principal able to create an experiment and run and upload artifacts (the invoke endpoint is gated only by validate_gateway_proxy, with no experiment- or scorer-level permission check). A public proof-of-concept script and a working reproduction accompany the GitHub advisory, and the vendor fixed the issue in 3.17.0.

RemediationAI

Vendor-released patch: MLflow 3.17.0. Upgrade to 3.17.0 or later (release tag https://github.com/mlflow/mlflow/releases/tag/v3.17.0); the fix lands via PR https://github.com/mlflow/mlflow/pull/25906 and commit https://github.com/mlflow/mlflow/commit/a732443e695c3c677680c54320efc394c81654ab, and enforces exact-module allow-listing, identifier-only metric_name, no metric_name kwargs override, and a Scorer-subclass check. If upgrading immediately is not possible, the documented compensating controls are: run the MLflow server from a read-only container filesystem, and/or run it as an operating-system user that does not own and cannot write to the installed scorer package directories (for example mlflow/genai/scorers/trulens under site-packages) - either condition blocks the artifact-placement chain, at the cost of losing the ability to install packages or write files in that tree at runtime. Enabling MLflow basic authentication only raises the bar: the scorer-invoke AJAX endpoint is bound to validate_gateway_proxy and performs no experiment- or scorer-level permission check, so any authenticated principal that can create an experiment and run and upload artifacts can still exploit the flaw. Note also that the stock official image runs as uid 0 with a writable package tree, so simply using the vendor image without one of the above controls does not mitigate the issue.

Affected VersionsENISA

MLflow 3.12.0rc0, < 3.17.0

Affected Packages

pypi mlflow fix: 3.17.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in pypi

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

MLflow 3.12.0 introduced registration and deserialization of third-party scorers. In mlflow/genai/scorers/scorer_utils.py the constant THIRD_PARTY_SCORER_ALLOWED_MODULES lists four package roots (mlflow.genai.scorers.ragas, .deepeval, .trulens, .phoenix), and in mlflow/genai/scorers/base.py the deserializer accepted either an exact root or any dotted descendant via 'module_path == m or module_path.startswith(m + ".")', then called importlib.import_module(module_path), getattr(module, class_name) and scorer_class(**init_kwargs). Because a package prefix is not a provenance boundary, a file planted below an allowed package satisfies the string check and is imported as mlflow.genai.scorers.<pkg>.<run_id>.artifacts.<module> - the classic CWE-94 code-injection outcome, with CWE-470 unsafe reflection as the secondary classification. The handler _invoke_scorer_handler() at /ajax-api/3.0/mlflow/scorer/invoke calls Scorer.model_validate_json(serialized_scorer) before get_trace_batches_for_scorer(), so the attacker-controlled constructor runs before any trace-ID validation (the reproduced attempt ends in an HTTP 500 after the marker file was already written). Placement is made trivial by MLflow's file-backed artifact layout: an experiment created with artifact_location file:///usr/local/lib/python3.10/site-packages/mlflow/genai/scorers/trulens causes each run to write into <artifact_location>/<run_id>/artifacts/. The 3.17.0 fix (PR #25906, commit a732443e) switches to verbatim module matching, requires metric_name to be a plain identifier (closing the RagasScorer/DeepEvalScorer metric-name splicing route), rejects a metric_name kwarg override, and requires the resolved class to be an actual Scorer subclass.

Know when Mlflow gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (GitHub_M) PRIMARY 9.8 CRITICAL
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
vuln.today AI 9.8 CRITICAL

Default no-auth servers allow network, unauthenticated, no-interaction code execution as the server process with full C/I/A impact; the writable-package precondition is met by default in the official image, so AC:L.

3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

Lifecycle Timeline

2
Patch available
Oct 27, 2026 - 21:18 EUVD
CVE Published
Oct 27, 2026 - 20:03 cve.org
CRITICAL 9.8

DescriptionCVE.org

MLflow is an open source AI engineering platform for agents, large language models, and machine learning models. From 3.12.0rc0 until 3.17.0, third-party scorer deserialization in mlflow/genai/scorers/base.py accepts request-selected descendants of THIRD_PARTY_SCORER_ALLOWED_MODULES rather than requiring an exact allowed module. A caller can use MLflow artifact endpoints to place a Python module beneath a writable allowed package and submit its module and class through /ajax-api/3.0/mlflow/scorer/invoke. Scorer.model_validate_json() imports the module and constructs the class before trace processing. Authentication-disabled deployments permit this code execution without credentials, while basic-auth deployments require a principal capable of creating an experiment and run and uploading artifacts. In either configuration, the allowed scorer package must be writable by the server process. This issue is fixed in version 3.17.0.

Technical POC Analysis

CWE-94 code injection, with CWE-470 unsafe reflection as a secondary weakness, in MLflow third-party scorer deserialization.

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Latest POC

1 PoC candidate from github (unverified)

Sign in to open the public PoC links collected for this CVE.

Executive ViewAI

Why It Matters

A critical vulnerability (CVE-2026-116692) in MLflow versions 3.12.0rc0 through 3.16.x allows unauthenticated attackers to execute arbitrary code on the MLflow tracking server, potentially leading to full system compromise. The flaw is especially dangerous for organizations using the default container image (v3.14.0) running as root, as any network attacker can exploit it without credentials, putting sensitive ML data and infrastructure at risk. Leadership should prioritize immediate patching to prevent data breaches or service disruption.

Business Impact: Severe
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.7%
Top 47% exploitable
Prevalence
Medium
popular MLOps platform, common in ML/data-science environments but not universal
Threat Intel
1
1 source
Data Quality
5 sources
Confidence: Medium

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity CRITICAL
CISA KEV No
Public POC Yes
EPSS 0.7%
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity + public POC available
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
Poc
System Exposure· derived
Open
Automatable· derived
Yes
Human Impact
Very High

Priority Score

70
Low Medium High Critical
KEV: 0
EPSS: +1
CVSS: +49
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Insecure deserialization occurs when an application converts serialized data (a stream of bytes representing an object's state) back into a living object without proper validation.

Code Injection CRITICAL

Code injection occurs when an application accepts user input and passes it directly into a language interpreter or evaluator without proper sanitization.

Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.

More in Mlflow

View all
CVE-2026-64849 CRITICAL POC
9.3 Aug 17

Server-side request forgery in MLflow before 3.15.0 lets remote unauthenticated attackers coerce the server into making

CVE-2024-8859 HIGH POC
7.5 Mar 20

A path traversal vulnerability exists in mlflow/mlflow version 2.15.1. Rated high severity (CVSS 7.5), this vulnerabilit

CVE-2023-3765 CRITICAL POC
10.0 Jul 19

Absolute Path Traversal in GitHub repository mlflow/mlflow prior to 2.5.0. Rated critical severity (CVSS 10.0), this vul

CVE-2026-0545 CRITICAL POC
9.8 Apr 03

MLflow's FastAPI job endpoints bypass basic-auth entirely, allowing network attackers to submit and execute jobs without

CVE-2023-6975 CRITICAL POC
9.8 Dec 20

A malicious user could use this issue to get command execution on the vulnerable machine and get access to data & models

CVE-2023-6974 CRITICAL POC
9.8 Dec 20

A malicious user could use this issue to access internal HTTP(s) servers and in the worst case (ie: aws instance) it cou

CVE-2023-6014 CRITICAL POC
9.8 Nov 16

An attacker is able to arbitrarily create an account in MLflow bypassing any authentication requirment. Rated critical s

CVE-2023-6018 CRITICAL POC
9.8 Nov 16

An attacker can overwrite any file on the server hosting MLflow without any authentication. Rated critical severity (CVS

CVE-2023-2780 CRITICAL POC
9.8 May 17

Path Traversal: '\..\filename' in GitHub repository mlflow/mlflow prior to 2.3.1. Rated critical severity (CVSS 9.8), th

CVE-2023-1177 CRITICAL POC
9.8 Mar 24

Path Traversal: '\..\filename' in GitHub repository mlflow/mlflow prior to 2.2.1. Rated critical severity (CVSS 9.8), th

CVE-2024-27133 CRITICAL POC
9.6 Feb 23

Insufficient sanitization in MLflow leads to XSS when running a recipe that uses an untrusted dataset. Rated critical se

CVE-2024-27132 CRITICAL POC
9.6 Feb 23

Insufficient sanitization in MLflow leads to XSS when running an untrusted recipe. Rated critical severity (CVSS 9.6), t

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy