Prior to version 1.4.0, the rmcp crate's Streamable HTTP server transport (crates/rmcp/src/transport/streamable_http_server/) did not validate the incoming Host header. This allowed a malicious public website, via a DNS rebinding attack, to send authenticated requests to an MCP server running on the victim's loopback or private-network interface — violating the MCP specification's transport security guidance.
An attacker who convinces a victim to visit a malicious page can:
Because MCP servers frequently run with the user's privileges and expose developer tooling (filesystems, shells, browser control, language servers, etc.), the practical impact can extend to arbitrary code execution on the victim's machine.
rmcp < 1.4.0 — all prior releases of the Streamable HTTP server transport. Non-HTTP transports (stdio, child-process) are not affected.
rmcp >= 1.4.0 (current: 1.5.1).
Fixed in PR #764 (commit 8e22aa2), released as v1.4.0 on 2026-04-09:
StreamableHttpServerConfig::allowed_hosts now defaults to a loopback-only allowlist: ["localhost", "127.0.0.1", "::1"].validate_dns_rebinding_headers(), which parses the Host header and returns HTTP 403 if the host is not on the allowlist.StreamableHttpService::with_allowed_hosts(...), or opt out (not recommended without an upstream reverse proxy that validates Host) via disable_allowed_hosts().This fix validates the Host header only. Origin header validation is tracked as a defense-in-depth follow-up in #822 and is not required to block the DNS rebinding attack described here — the browser cannot forge the Host header sent to the rebound server.
rmcp >= 1.4.0.Host header is not one of your expected hostnames.0.0.0.0 without such a proxy.{
"github_reviewed": true,
"github_reviewed_at": "2026-05-06T21:55:56Z",
"cwe_ids": [
"CWE-346",
"CWE-350"
],
"severity": "HIGH",
"nvd_published_at": null
}