Skip to main content

Windows ML CLI EUVDEUVD-2026-70264

| CVE-2026-84452 HIGH
Permissive Cross-domain Security Policy with Untrusted Domains (CWE-942)
2026-09-02 GitHub_M GHSA-96p9-rh4f-92cf
8.6
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Recon
    Developer invokes winml-cli serve on localhost
  2. Delivery
    Attacker lures developer to malicious webpage
  3. Exploit
    Browser sends cross-origin POST to localhost API endpoint
  4. Install
    Payload sets trust_remote_code=true parameter
  5. C2
    Server passes flag to AutoConfig.from_pretrained
  6. Execute
    Server downloads attacker-controlled model Python code
  7. Impact
    Arbitrary code executes as developer user

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A02:2025 - Security Misconfiguration
ASVS 5.0
V13 - Configuration CORS policy restriction
Exploitation Conditions

The winml-cli serve command must be actively running on the victim's machine - this is a developer-invoked command, not a default installed service, so exploitation is limited to the window when a developer has explicitly started the server. The victim must concurrently visit or be redirected to a malicious webpage while the server is running; the browser's Same-Origin Policy is the sole protection, which the wildcard CORS configuration eliminates entirely. The exploitable endpoints are /v1/cli/build and /v1/cli/config; an attacker's page can probe likely localhost ports if the exact port is unknown. No API authentication, special privileges, or non-default configuration beyond running the serve subcommand is required. Only versions prior to 0.4.0 are vulnerable.

Impact

The CVSS 4.0 score of 8.6 (AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H) reflects the realistic threat model accurately: the API is effectively network-accessible via any browser tab, no authentication is required, but active user interaction - visiting a malicious site while the server is running - is a mandatory precondition. Real-world risk is bounded by the requirement that the victim be a developer actively running winml-cli serve, a non-default, explicitly invoked developer workflow rather than an always-on production service. The primitive exploitation path (a single fetch() POST from any webpage) means the attack barrier is very low once the prerequisite server is running, and an attacker embedding this payload in a malicious or compromised site targeting AI developers represents a credible scenario. No CISA KEV listing is present and no independent PoC beyond the advisory description exists in the input, which reduces urgency marginally. EPSS data is absent from the provided input; exploitation probability cannot be independently quantified. There are no conflicting signals between the CVSS vector and the description - both indicate network-accessible, user-interaction-dependent, unauthenticated RCE.

Exploit ScenarioDerived

A developer running winml-cli serve on their workstation visits a malicious webpage (or a legitimate site with injected script). The page's JavaScript issues a cross-origin fetch() POST to http://localhost:<port>/v1/cli/build with a payload setting trust_remote_code=true and a model identifier pointing to an attacker-controlled Hugging Face repository containing malicious Python. The server's wildcard CORS policy causes the browser to forward the request and honor the response; the server then calls AutoConfig.from_pretrained(trust_remote_code=True), importing the attacker's Python module and executing arbitrary code as the developer's user account.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.9% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 02, 2026

Unauthenticated cross-origin RCE in Windows ML CLI (winml-cli < 0.4.0) is reachable when a developer runs the serve command, which exposes a localhost HTTP API with a wildcard CORS policy and no authentication gate. Any malicious webpage visited by the user while the server is running can send cross-origin requests to /v1/cli/build or /v1/cli/config, inject trust_remote_code=true, and cause the server to call AutoConfig.from_pretrained(trust_remote_code=True) - downloading and executing attacker-controlled Python code from a remote model repository as the server user. The vendor has released a fix in version 0.4.0; no public exploit is identified at time of analysis.

RemediationAI

Upgrade to Windows ML CLI 0.4.0, which introduces SameOriginMiddleware (added in src/winml/modelkit/serve/_security.py) that validates the HTTP Origin header on every request and returns HTTP 403 for cross-origin requests, a loopback-only route restriction for sensitive API paths, and a _require_remote_code_execution_allowed() guard in both _autoconfig.py and hf.py that must be satisfied before trust_remote_code=True is accepted. The fix also sets proxy_headers=False in uvicorn invocations to block header-spoofing bypass paths. The patch is confirmed via commit f4073e0ef4700a25b623487e7e45c421ca0b9993 and PR #1321 at https://github.com/microsoft/winml-cli/pull/1321. For users who cannot upgrade immediately, avoid running winml-cli serve concurrently with general web browsing sessions, and restrict the server's listening port using a host-based firewall rule to deny connections from browser processes - noting this workaround is operationally fragile and does not substitute for the patch.

Affected VersionsENISA

winml-cli < 0.4.0

Affected Packages

pypi winml-cli fix: 0.4.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in pypi

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

Windows ML CLI is a Microsoft open-source developer tool (CPE: cpe:2.3:a:microsoft:winml-cli) for packaging, optimizing, and serving AI models on Windows ML. The serve subcommand starts a uvicorn/FastAPI HTTP server on localhost. The root cause is CWE-942 (Permissive Cross-domain Policy with Untrusted Domains): both src/winml/modelkit/serve/cli_api.py and src/winml/modelkit/serve/app.py configure CORS with a wildcard allow_origins='*', which instructs the browser to permit cross-origin responses from any web origin. Because the API has no authentication layer, any JavaScript running in the browser can successfully POST to the localhost endpoints. The dangerous path flows through src/winml/modelkit/loader/_autoconfig.py, which passes trust_remote_code=True directly to Hugging Face's AutoConfig.from_pretrained(), causing Python module code embedded in an attacker-controlled model repository to be imported and executed on the server.

Know when Winml Cli gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (GitHub_M) PRIMARY 8.6 HIGH
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
vuln.today AI 8.8 HIGH

Network-reachable via browser with no API auth (PR:N), but requires user to visit malicious site (UI:R); full RCE grants C:H/I:H/A:H on the developer's system without scope change.

3.1 AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
4.0 AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
Active
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
High
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Sep 02, 2026 - 21:17 EUVD
CVE Published
Sep 02, 2026 - 19:22 cve.org
HIGH 8.6

DescriptionCVE.org

Windows ML CLI is a command line tool for building portable, performant, and high-quality AI models for Windows ML. Prior to 0.4.0, the src/winml/modelkit/serve/cli_api.py component exposes WinML CLI commands through a localhost HTTP API without authentication and configures the allow_origins setting as a wildcard in both src/winml/modelkit/serve/cli_api.py and src/winml/modelkit/serve/app.py. A malicious website loaded by a user can send cross-origin requests to /v1/cli/build or /v1/cli/config and set the trust_remote_code parameter to true, which is converted to the --trust-remote-code command-line flag without validation. This reaches AutoConfig.from_pretrained with trust_remote_code=True in src/winml/modelkit/loader/_autoconfig.py and imports Python code from an attacker-controlled model repository, resulting in arbitrary code execution as the server user. This issue is fixed in version 0.4.0.

Technical POC Analysis

CWE-942 - permissive cross-domain policy combined with a missing authentication gate on a localhost HTTP API.

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

Windows ML CLI versions below 0.4.0 allow unauthenticated remote code execution through the local model serving feature; any malicious webpage visited by a developer while the server is running can inject code and execute arbitrary Python commands on their machine. This directly threatens development environments and proprietary ML model assets across teams using Microsoft's ML.NET framework.

Business Impact: High
Compensating Controls

Apply vendor patch (winml-cli 0.4.0 or later). If immediate patching is unavailable, restrict the serve command to isolated development networks disconnected from shared internet access; enforce browser policies to disable JavaScript in environments running the model server; and monitor localhost connections for anomalous cross-origin requests to /v1/cli/build and /v1/cli/config endpoints.

Threat Intelligence Overview

EPSS Score
0.9%
Top 41% exploitable
Prevalence
Rare
niche developer CLI tool for Windows ML AI model workflows
Threat Intel
1
1 sources
Exploit
POC
Public exploit code exists
Social Media
1
Sightings
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA CIRCL GitHub VulDB

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC Yes
EPSS 0.9%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact
High
Technical Impact
Total

Priority Score

64
Low Medium High Critical
KEV: 0
EPSS: +1
CVSS: +43
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy