CVE-2026-64849: Critical Server-Side Request Forgery (SSRF) in MLflow Webhook Notifications
HERMES THREAT SCORE & MLOPS CLOUD INFRASTRUCTURE EXPOSURE
Target:MLflow (Machine Learning Lifecycle Platform) CVSS v3.1 rates CVE-2026-64849 at 9.3 (Critical) and CVSS v4.0 scores 9.3. The Hermes Threat Score assigns 94 (CRITICAL). Alignment is direct: MLflow servers frequently execute within high-privilege Kubernetes namespaces or cloud virtual machines with IAM access to S3/GCS model buckets and training datasets. Exploiting SSRF delivers instance metadata tokens, granting full cloud tenant administration.
CVE-2026-64849: Critical Server-Side Request Forgery (SSRF) in MLflow Webhook NotificationsVULNERABILITY
Software platform affected by security vulnerabilities and agentic attack patterns.
π Why is this related? (Evidence & Provenance)
“Confirmed security vulnerability in CPython Interpreter & Standard Library documented in Hermes dossier.”
- [vulnerability_report]
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source: Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Reliability: VERY_HIGH)
Adversaries search compromise victims for unsecured credentials in files, environment variables, or memory.
π Why is this related? (Evidence & Provenance)
“Attack execution telemetry aligns with MITRE ATT&CK technique T1552.”
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source: Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Reliability: VERY_HIGH)
1. Technical Context & Affected Software Matrix
Section titled β1. Technical Context & Affected Software MatrixβMLflow manages machine learning experiments, code packaging, model registry versions, and production deployment integrations.
| Parameter | Technical Specification | Threat Context |
|---|---|---|
| CVE Identifier | CVE-2026-64849 | International Vulnerability Tracking ID |
| Vulnerable Component | mlflow.server.handlers (Webhook Dispatcher) | Model registry event notification engine |
| Network Vector | HTTP/HTTPS (Default Port 5000/TCP) | Public or VPC internal tracking servers |
| Root Cause | Unrestricted URL destination in HTTP client (CWE-918) | SSRF targeting cloud metadata APIs |
| Affected Versions | MLflow < 3.15.0 | Cloud and on-premises MLflow tracking servers |
| Fixed Versions | 3.15.0 | Official release enforcing IP deny-lists |
| Exploitation Impact | Cloud IAM credentials theft, internal Kubernetes pivot | Full cloud tenant compromise |
2. In-Depth Technical Decomposition: Webhook SSRF Mechanics
Section titled β2. In-Depth Technical Decomposition: Webhook SSRF MechanicsβA. The Unvalidated Webhook Registration
Section titled βA. The Unvalidated Webhook RegistrationβMLflow allows users to register webhooks to notify external platforms (Slack, PagerDuty, CI/CD runners) when model transitions occur:
# Vulnerable handler in mlflow/server/handlers.pydef _create_webhook(request_data): url = request_data.get("url") # VULNERABILITY: No check for loopback, RFC 1918, or cloud metadata IP addresses webhook = WebhookModel(url=url, events=request_data.get("events")) return webhook_store.save(webhook)
def _dispatch_webhook_notification(webhook, payload): # Direct outbound request from MLflow server context response = requests.post(webhook.url, json=payload, timeout=5) return response.text+----------------------------------------------------------------------------------------------------+| CVE-2026-64849 ATTACK SEQUENCE DIAGRAM |+----------------------------------------------------------------------------------------------------+
[Remote Adversary] β β [1] HTTP POST /ajax-api/2.0/mlflow/webhooks/create β Payload: { "url": "http://169.254.169.254/latest/meta-data/iam/security-credentials/", β "events": ["MODEL_VERSION_CREATED"] } βΌ [MLflow Tracking Server (Port 5000 / AWS EC2 or EKS)] β βββββΊ 1. Webhook Registration: β - Accepts target URL without DNS validation or private IP filtering β β [2] Adversary triggers: POST /ajax-api/2.0/mlflow/model-versions/create βΌ [MLflow Webhook Dispatch Engine] β βββββΊ 3. Internal SSRF Query: β - Issues HTTP GET/POST to http://169.254.169.254/latest/meta-data/ β - AWS IMDS service answers query from instance context β - MLflow captures IAM temporary access tokens: β AccessKeyId, SecretAccessKey, Token β βΌ [Credential Exfiltration via Event Response / Error Log] β βββββΊ Attacker reads reflected token from test notification logs: - Configures AWS CLI with stolen IAM Role credentials - Accesses S3 buckets containing training sets and model weights - Escalates privileges across entire AWS account+----------------------------------------------------------------------------------------------------+3. Threat Intelligence & Exploitation in the Wild
Section titled β3. Threat Intelligence & Exploitation in the Wildβ- Targeting ML Infrastructure: Automated reconnaissance tools specifically probe MLflow tracking servers on port 5000 to identify instances hosted on cloud platforms.
- IMDSv1 Vulnerability: Deployments where AWS IMDSv2 (session token requirement) is not enforced are particularly vulnerable, allowing single-request extraction of IAM role credentials.
- Internal Kubernetes Pivoting: When deployed within Kubernetes, attackers target
https://kubernetes.default.svcusing the podβs service account token located in/var/run/secrets/kubernetes.io/serviceaccount/token.
4. MITRE ATT&CK Mapping
Section titled β4. MITRE ATT&CK Mappingβ| Tactic | Technique ID | Technique Name | Exploitation Manifestation |
|---|---|---|---|
| Initial Access | T1190 | Exploit Public-Facing Application | Remote HTTP POST registering malicious webhook |
| Credential Access | T1552.005 | Cloud Instance Metadata API | Querying 169.254.169.254 to dump IAM credentials |
| Discovery | T1046 | Network Service Discovery | Port scanning internal cluster services via SSRF |
| Lateral Movement | T1021 | Remote Services | Utilizing cloud IAM tokens to access AWS/GCP infrastructure |
5. Detection Engineering & Telemetry
Section titled β5. Detection Engineering & TelemetryβA. Suricata Detection Rule
Section titled βA. Suricata Detection Ruleβalert http any any -> $MLFLOW_SERVERS 5000 ( msg:"HERMES DEFENSE - MLflow Webhook Metadata SSRF Attempt (CVE-2026-64849)"; flow:established,to_server; http.method; content:"POST"; http.uri; content:"/webhooks/create"; http.request_body; pcre:"/(\"url\"\s*:\s*\"https?:\/\/(169\.254\.169\.254|metadata\.google\.internal|127\.0\.0\.1|localhost))/i"; classtype:web-application-attack; sid:202664849; rev:1; reference:cve,2026-64849;)B. Sigma Detection Rule
Section titled βB. Sigma Detection Ruleβtitle: MLflow Process Connecting to Cloud Metadata IPid: 8c7b6a5d-4e3f-2a1b-0c9d-64849c026e01status: highdescription: Detects outbound network connections initiated by the MLflow server process towards cloud instance metadata endpoints.author: Hermes Codex Detection Engineeringdate: 2026-09-11logsource: product: linux category: network_connectiondetection: selection_process: Image|contains: 'python' CommandLine|contains: 'mlflow' selection_destination: DestinationIp: - '169.254.169.254' - '127.0.0.1' condition: selection_process and selection_destinationfalsepositives: - Legitimate initial cloud provider SDK authentication handshakes (should use IMDSv2).level: criticaltags: - attack.initial_access - attack.t1190 - attack.credential_access - attack.t1552.0056. Digital Forensics & Incident Response (DFIR)
Section titled β6. Digital Forensics & Incident Response (DFIR)βForensics Triage Checklist:
Section titled βForensics Triage Checklist:β- Query MLflow Webhook Database:
SELECT id, url, events, created_time FROM webhooks;-- Identify any URLs containing 169.254, internal IP ranges, or localhost
- Review CloudTrail / GCP Audit Logs:
- Filter for
GetRoleorAssumeRolecalls originating from the MLflow instance IP at the time of the event.
- Filter for
- Inspect Outbound Network Flows:
- Check VPC Flow Logs for connections from the MLflow host to
169.254.169.254:80.
- Check VPC Flow Logs for connections from the MLflow host to
Hunting Query (Elasticsearch / OpenSearch):
Section titled βHunting Query (Elasticsearch / OpenSearch):β{ "query": { "bool": { "must": [ { "term": { "url.path": "/ajax-api/2.0/mlflow/webhooks/create" } }, { "wildcard": { "http.request.body.content": "*169.254.169.254*" } } ] } }}7. Mitigation & Remediation
Section titled β7. Mitigation & Remediationβ- Upgrade MLflow: Upgrade the
mlflowserver to version 3.15.0 or later. - Enforce AWS IMDSv2: Require tokens for instance metadata queries and set the hop limit to 1 to block container-based SSRF queries:
Terminal window aws ec2 modify-instance-metadata-options \--instance-id i-0123456789abcdef0 \--http-tokens required \--http-put-response-hop-limit 1 - Network Egress Filtering: Deploy Kubernetes NetworkPolicies or firewall egress rules blocking MLflow worker pods from connecting to
169.254.169.254/32. - Credential Rotation: Immediately rotate any AWS IAM role keys or service account tokens associated with the MLflow instance.