Daniel Reyes, YuSMP Group
Daniel Reyes Principal Engineer (AI/ML), YuSMP Group · Securing ML infrastructure for US and EU teams
Monitor displaying an SSRF attack chain diagram showing a webhook URL redirecting through AWS instance-metadata service to leak IAM credentials, illustrating the MLflow CVE-2026-64849 vulnerability

The short answer

CVE-2026-64849 is a critical unauthenticated SSRF in MLflow versions below 3.15.0 that lets attackers redirect your ML tracking server to the cloud instance-metadata endpoint and retrieve IAM credentials without any login. The flaw lives in the webhook test endpoint. Scanning began within hours of the CVE being assigned on August 17, 2026. MLflow 3.15.0 is available and fixes the vulnerability.

The practical reading for engineering and platform teams: an ML tracking server is rarely hardened to the same standard as a production API, yet it typically runs with a cloud IAM role that has broad read/write access to object storage. That combination makes it an exceptionally lucrative target once attackers have a reliable way to steal the credentials. They do now.

What is CVE-2026-64849?

MLflow is the dominant open-source platform for ML experiment tracking, model packaging, and deployment. Teams use it to log runs, compare hyperparameters, and version model artifacts, typically running a tracking server that ML engineers connect to during training. The server exposes a REST API, and part of that API handles webhooks — outbound HTTP calls that fire when experiments or model versions change state.

CVE-2026-64849 lives in the endpoint that tests those webhooks: POST /api/2.0/mlflow/webhooks/{id}/test. The flaw is a time-of-check-to-time-of-use (TOCTOU) issue. When a webhook is registered, the server validates the target URL. But when the test endpoint fires, the HTTP client follows redirects without re-validating the final destination. An attacker can register a webhook pointing to a URL that initially looks benign but immediately issues an HTTP 302 redirect to an internal address — such as the AWS instance-metadata service at 169.254.169.254 — and the tracking server dutifully fetches and returns the response.

The endpoint requires no authentication, which means any network-reachable attacker can trigger it without credentials. The flaw carries a CVSS 3.1 score of 9.3 and was assigned the GitHub security advisory identifier GHSA-7gwp-5pfp-969j on August 17, 2026. All MLflow versions prior to 3.15.0 are affected.

How does the attack work?

The attack is straightforward enough that automated scanners had already begun probing exposed MLflow instances within hours of the CVE assignment, according to watchTowr’s Attacker Eye honeypot network. The basic chain:

  1. Attacker registers a webhook on the MLflow tracking server with a URL pointing to an attacker-controlled redirect server. The initial URL passes validation because it resolves to an external IP.
  2. Attacker calls POST /api/2.0/mlflow/webhooks/{id}/test — no authentication required.
  3. MLflow’s HTTP client follows the redirect to http://169.254.169.254/latest/meta-data/iam/security-credentials/ (on AWS) or equivalent metadata endpoints on GCP and Azure.
  4. The metadata service returns temporary IAM credentials: access key ID, secret access key, and session token.
  5. MLflow returns the response to the attacker. Credentials are in hand.

DNS rebinding is a secondary attack path: a domain resolves to a valid external IP for the validation check, then resolves to an internal IP on the actual request. Researchers at Hadrian published a working proof-of-concept covering both paths shortly after the CVE was disclosed.

Why are MLflow servers high-value targets?

Development tooling rarely gets the same hardening attention as production services, yet it often holds production-grade credentials. MLflow tracking servers are a particularly attractive target because:

  • IAM roles with broad storage access. MLflow needs to read and write model artifacts and datasets to object storage, so the attached role typically has S3, GCS, or Azure Blob read/write permissions — sometimes on buckets containing training data with customer records.
  • Infrequent patching cycles. ML infrastructure is often treated as a shared dev tool maintained by a data engineering team, not a product team with a security SLA. Version upgrades lag.
  • Internet exposure by convenience. Teams expose the tracking server so remote ML engineers can log runs from their workstations or from cloud training jobs, often without putting it behind a VPN or authentication proxy.
  • Temporary credentials, but with days-long validity. AWS, GCP, and Azure instance-metadata credentials rotate periodically, but the window is long enough for attackers to exfiltrate data or pivot before the key expires.

What it means for US & EU software teams

Any team that ships products with an AI or ML component — recommendation engines, fraud detection, document processing, forecasting — has likely stood up an MLflow tracking server at some point in the development lifecycle. The question is whether that server is still running and still internet-reachable.

For US teams, the immediate concern is the IAM credentials themselves. A stolen temporary credential with S3 access can read training datasets, exfiltrate models, or be used to move laterally into other AWS services. If the role also had permissions to write to infrastructure state files (Terraform backends, for example), the blast radius extends further. Teams building AI/ML data pipelines should audit every tracking server instance against this CVE before the end of the week.

For EU teams, the GDPR angle matters: training data stored in the same cloud storage bucket that MLflow’s role can access may contain personal data. An SSRF-driven credential theft that reaches that data is a reportable breach under Article 33 GDPR — 72-hour notification to the supervisory authority from the moment you become aware. If your MLflow server was exposed, start that clock now, investigate thoroughly, and do not assume no data was accessed just because you see no obvious exfiltration.

Beyond the immediate patch, this vulnerability is a reminder that dev tooling in ML pipelines deserves the same zero-trust network posture as production services. MLflow tracking servers, Jupyter notebooks, Airflow instances, and similar tools should not be internet-reachable without a VPN or strong authentication layer in front of them.

What to do this week

  1. Identify all MLflow instances. Check cloud environments, developer workstations, CI/CD runners, and dedicated ML training infrastructure. Look for anything running the tracking server on port 5000 (default) or any other exposed port.
  2. Upgrade to MLflow 3.15.0 immediately. This is the only full fix. If you cannot upgrade right now, block port access to the tracking server at the network layer and disable inbound requests to /api/2.0/mlflow/webhooks at the load balancer or WAF.
  3. Rotate cloud credentials. Identify the IAM role or service account attached to each MLflow instance. Rotate the temporary credentials and, if the instance used long-lived keys, rotate those immediately. Check all other services that share the same role.
  4. Audit cloud logs. Review CloudTrail (AWS), Cloud Audit Logs (GCP), or Azure Activity Logs for unexpected API calls originating from the MLflow server’s IAM role in the 48 hours before patching. Pay attention to GetObject calls on training-data buckets and any AssumeRole calls indicating lateral movement.
  5. Enforce network isolation going forward. MLflow tracking servers should sit in a private subnet, behind a VPN or authentication proxy. If remote ML engineers need access, wire it through a bastion or a zero-trust access tool — not a public IP.
  6. Enable IMDSv2 (AWS-specific). IMDSv2 requires a PUT request to obtain a session token before metadata can be read, which breaks the SSRF chain for redirect-based attacks. Enforce IMDSv2 via instance metadata options and verify via aws ec2 describe-instances.

Frequently asked questions

What is CVE-2026-64849 in MLflow?

CVE-2026-64849 is a critical unauthenticated server-side request forgery (SSRF) in MLflow’s webhook test endpoint (/api/2.0/mlflow/webhooks/{id}/test). A TOCTOU flaw means the URL is checked at registration time but the HTTP client follows redirects at test time without re-validation. Attackers can redirect the server to internal cloud metadata endpoints and read the IAM credentials returned. CVSS 9.3. Fixed in MLflow 3.15.0.

How quickly were attackers exploiting CVE-2026-64849?

Automated scanning began within hours of CVE assignment on August 17, 2026, detected by watchTowr’s Attacker Eye honeypot network. Full public disclosure followed on August 18, with a working proof-of-concept published by Hadrian. The rapid timeline reflects the simplicity of the attack: no authentication, no complex payload, just a webhook registration and a test call.

Why do attackers target MLflow specifically?

MLflow tracking servers typically run with cloud IAM roles that have broad object-storage access, they are frequently left internet-reachable for convenience, and they rarely receive the same patching urgency as production services. That combination makes them a high-value, low-effort target once a reliable credential-theft path exists.

What should teams do immediately if they run MLflow?

Upgrade to MLflow 3.15.0. If you cannot patch immediately, block network access to the webhook endpoint. Rotate all cloud credentials attached to the MLflow instance. Review cloud audit logs for unexpected API calls from the MLflow IAM role in the 48 hours before patching. On AWS, enforce IMDSv2 to break the SSRF chain at the metadata layer.

Does running MLflow inside a VPC protect teams from this flaw?

Significantly, yes. A private VPC with no public exposure prevents external attackers from reaching the webhook endpoint. However, internal attackers or compromised developer workstations on the same network can still exploit the flaw, since 169.254.169.254 is a link-local address reachable from inside the VPC. VPC isolation reduces the attack surface substantially but is not a substitute for patching.

Sources: