CVE-2026-2652: MLflow: auth bypass exposes Job API and trace injection
AWAITING NVDMLflow 3.9.0 and earlier contain a complete authentication bypass when deployed with `--app-name basic-auth` via uvicorn: FastAPI's permission middleware only guards `/gateway/` routes, leaving the Job API (`/ajax-api/3.0/jobs/*`) and OpenTelemetry trace ingestion (`/v1/traces`) entirely open to unauthenticated requests. Any attacker with network access to an exposed MLflow server can submit arbitrary jobs, read experiment results and model metrics, cancel in-flight training runs, and inject poisoned trace data — all without credentials. The insidious aspect is that operators who explicitly enabled authentication believe they are protected; this is a silent security regression caused by the Flask-to-FastAPI migration mismatch. Upgrade to MLflow 3.10.0 immediately; if patching is blocked, isolate the MLflow server behind an authenticated reverse proxy or firewall and audit `/ajax-api/3.0/jobs/` and `/v1/traces` access logs for unauthorized activity.
What is the risk?
HIGH for organizations with MLflow reachable on internal networks or internet-facing. The bypass requires no credentials, no user interaction, and no special tooling — a standard HTTP client is sufficient. Severity is unscored (CVSS N/A) because the CVE was published the same day, but the vulnerability class (CWE-305: Missing Authentication for Critical Function) maps to CVSS 9.1 CRITICAL under comparable auth-bypass CVEs. Blast radius scales with how central MLflow is to the ML pipeline: in a shared MLOps platform serving multiple teams, a single exploit can disrupt all concurrent training workloads and exfiltrate proprietary model experiment data.
Attack Kill Chain
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| mlflow | pip | — | No patch |
Do you use mlflow? You're affected.
Severity & Risk
What should I do?
5 steps-
PATCH
Upgrade to MLflow 3.10.0 where the FastAPI authentication middleware correctly handles non-
/gateway/routes. -
WORKAROUND (if upgrade blocked): Place MLflow behind an authenticated reverse proxy (nginx with auth_basic, Caddy with basicauth directive, or an API gateway) that enforces authentication before requests reach the MLflow server.
-
NETWORK ISOLATION
Restrict access to the MLflow server port via firewall rules to trusted CI/CD runners and data science workstations only — MLflow should never be internet-facing.
-
DETECTION
Audit server access logs for unauthenticated requests to
/ajax-api/3.0/jobs/and/v1/traces; unexpected HTTP 200 responses without Authorization headers indicate active exploitation. -
INTEGRITY CHECK
If exposure is suspected, review experiment run history for unexpected job submissions and validate trace data integrity for active experiments.
Classification
Compliance Impact
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-2652?
MLflow 3.9.0 and earlier contain a complete authentication bypass when deployed with `--app-name basic-auth` via uvicorn: FastAPI's permission middleware only guards `/gateway/` routes, leaving the Job API (`/ajax-api/3.0/jobs/*`) and OpenTelemetry trace ingestion (`/v1/traces`) entirely open to unauthenticated requests. Any attacker with network access to an exposed MLflow server can submit arbitrary jobs, read experiment results and model metrics, cancel in-flight training runs, and inject poisoned trace data — all without credentials. The insidious aspect is that operators who explicitly enabled authentication believe they are protected; this is a silent security regression caused by the Flask-to-FastAPI migration mismatch. Upgrade to MLflow 3.10.0 immediately; if patching is blocked, isolate the MLflow server behind an authenticated reverse proxy or firewall and audit `/ajax-api/3.0/jobs/` and `/v1/traces` access logs for unauthorized activity.
Is CVE-2026-2652 actively exploited?
No confirmed active exploitation of CVE-2026-2652 has been reported, but organizations should still patch proactively.
How to fix CVE-2026-2652?
1. PATCH: Upgrade to MLflow 3.10.0 where the FastAPI authentication middleware correctly handles non-`/gateway/` routes. 2. WORKAROUND (if upgrade blocked): Place MLflow behind an authenticated reverse proxy (nginx with auth_basic, Caddy with basicauth directive, or an API gateway) that enforces authentication before requests reach the MLflow server. 3. NETWORK ISOLATION: Restrict access to the MLflow server port via firewall rules to trusted CI/CD runners and data science workstations only — MLflow should never be internet-facing. 4. DETECTION: Audit server access logs for unauthenticated requests to `/ajax-api/3.0/jobs/` and `/v1/traces`; unexpected HTTP 200 responses without Authorization headers indicate active exploitation. 5. INTEGRITY CHECK: If exposure is suspected, review experiment run history for unexpected job submissions and validate trace data integrity for active experiments.
What systems are affected by CVE-2026-2652?
This vulnerability affects the following AI/ML architecture patterns: MLOps pipelines, model training pipelines, experiment tracking systems, model development workflows, CI/CD-integrated ML pipelines.
What is the CVSS score for CVE-2026-2652?
No CVSS score has been assigned yet.
Technical Details
NVD Description
A vulnerability in mlflow/mlflow versions 3.9.0 and earlier allows unauthenticated access to certain FastAPI routes when the server is started with authentication enabled (`--app-name basic-auth`) and served via uvicorn (ASGI). The FastAPI permission middleware only enforces authentication on `/gateway/` routes, leaving other routes such as the Job API (`/ajax-api/3.0/jobs/*`) and the OpenTelemetry trace ingestion API (`/v1/traces`) unprotected. This allows unauthenticated remote attackers to submit jobs, read job results, cancel running jobs, and inject arbitrary trace data into experiments. The issue arises from an architectural mismatch between Flask and FastAPI authentication mechanisms, where the `_find_fastapi_validator()` function fails to handle non-`/gateway/` paths, resulting in a complete authentication bypass. This vulnerability is fixed in version 3.10.0.
Exploitation Scenario
An attacker conducting internal network reconnaissance identifies a MLflow server on port 5000 running mlflow 3.9.0 with `--app-name basic-auth` configured. Knowing that auth is enabled, they probe non-gateway routes and discover that `GET /ajax-api/3.0/jobs/list` returns a 200 with full job metadata — no credentials required. The attacker then enumerates all active training runs via the Jobs API, extracts model performance metrics and dataset artifact URIs, and submits a malicious job via `POST /ajax-api/3.0/jobs/create` pointing to an attacker-controlled script. Simultaneously, they POST to `/v1/traces` to inject falsified observability data into ongoing experiments, manipulating the accuracy metrics visible to the ML engineering team. The entire compromise happens over HTTP with no exploitation tooling beyond curl.
Weaknesses (CWE)
References
Timeline
Related Vulnerabilities
CVE-2025-15379 10.0 MLflow: RCE via unsanitized model dependency specs
Same package: mlflow CVE-2023-3765 10.0 MLflow: path traversal allows arbitrary file read
Same package: mlflow CVE-2026-2635 9.8 mlflow: security flaw enables exploitation
Same package: mlflow CVE-2023-2780 9.8 MLflow: path traversal allows arbitrary file read/write
Same package: mlflow CVE-2023-1177 9.8 MLflow: path traversal allows arbitrary file read/write
Same package: mlflow