ZeroHour

CVE-2026-81735

niche

Unauthenticated RCE via exposed MCP transports in UI-TARS-desktop mcp-http-server

CVSS 4.0
10.0 critical
EPSS
<1%p43
Published
()
Modified
AI analysis

The mcp-http-server package in UI-TARS-desktop defaulted its listen address to '::' (all interfaces) and applied authentication middleware only when a caller explicitly supplied it, leaving the Streamable HTTP and SSE MCP transports unauthenticated in the default and common configurations. The @agent-infra/mcp-server-commands and @agent-infra/mcp-server-filesystem entry points call the server with only a host and port and no middleware, so any unauthenticated client that can reach the port can invoke the servers' tools without credentials. Through the commands server's run_command tool, which passes the caller-supplied string to child_process.exec, an attacker gains arbitrary command execution as the user running the server, and the filesystem server allows unauthenticated file reads and writes. Anyone running these MCP servers with the HTTP/SSE transport bound to a network-reachable interface is affected; the fix (a 127.0.0.1 listen default) landed in commit c2ad42e3eb9b27830db41a3e6f51ca7179d9b168 while the package version remained 1.2.4, so the affected boundary is that commit rather than a release number. No public proof-of-concept is known, EPSS is 0.5% (43rd percentile), and the issue is not in CISA KEV, so no exploitation is currently known.

What to do: Update mcp-http-server (and dependents @agent-infra/mcp-server-commands and @agent-infra/mcp-server-filesystem) to a build that includes commit c2ad42e3eb9b27830db41a3e6f51ca7179d9b168 or a release containing it, since the 1.2.4 version number alone does not indicate the fix. Until patched, do not expose the MCP HTTP/SSE port to untrusted networks: pass an explicit 127.0.0.1 host, supply authentication middleware to startSseAndStreamableHttpMcpServer, and firewall the port. Check listening sockets on hosts running these servers for bindings on '::' or 0.0.0.0 to identify exposed instances.

Affected
ByteDance (UI-TARS-desktop) mcp-http-server (npm)all builds through 1.2.4 prior to commit c2ad42e3eb9b27830db41a3e6f51ca7179d9b168 (version stayed at 1.2.4 across the fix, so the boundary is the commit, not a
ByteDance (agent-infra) @agent-infra/mcp-server-commands (npm)versions calling startSseAndStreamableHttpMcpServer with no middleware against vulnerable mcp-http-server builds (no version range given in the advisory)
ByteDance (agent-infra) @agent-infra/mcp-server-filesystem (npm)versions calling startSseAndStreamableHttpMcpServer with no middleware against vulnerable mcp-http-server builds (no version range given in the advisory)
Estimated exposure
nichelikely hundreds to low thousands of network-exposed instances (no public install counts available) — No download or install statistics were provided, so this is estimated from deployment patterns: these are developer-oriented MCP server packages typically launched locally and on demand, and only deployments that expose the HTTP/SSE port…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

startServer.ts in the mcp-http-server package of UI-TARS-desktop defaulted its listen address to '::' when no host was given, so startSseAndStreamableHttpMcpServer bound the Streamable HTTP and SSE MCP transports to every interface, and its authentication middleware was optional: middlewares are applied only when a caller supplies them. The @agent-infra/mcp-server-commands and @agent-infra/mcp-server-filesystem entry points call startSseAndStreamableHttpMcpServer with a host and port alone and pass no middleware, so neither server required a credential. The commands server exposes a run_command tool that hands its caller-supplied command string to promisify(child_process.exec), so any unauthenticated client able to reach the port could run arbitrary commands as the user running the server, and the filesystem server exposed its file read and write tools on the same terms. The listen default became 127.0.0.1 in commit c2ad42e3eb9b27830db41a3e6f51ca7179d9b168; the package version stayed at 1.2.4 across that change, so the boundary is the commit rather than a release.

Weakness
CWE-306
Vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X

In the news

No ingested article mentions this CVE yet.