Unbounded session retention in StreamableHTTPTransport allows memory exhaustion via initialize flood
Published: July 07, 2026
SECURITY IDENTIFIERS
- CVE: CVE-2026-67430 (NVD)
- GHSA: GHSA-52jp-gj8w-j6xh
GEM
SEVERITY
CVSS v3.x: 5.3 (Medium)
PATCHED VERSIONS
>= 0.23.0
DESCRIPTION
Summary
In its default configuration, MCP::Server::Transports::StreamableHTTPTransport never expires sessions. Every successful initialize request stores a new ServerSession and a session record under a fresh UUID, and the only path that removes them is an explicit client-issued HTTP DELETE. An unauthenticated attacker can repeatedly initialize new sessions and immediately disconnect, forcing the server to retain an unbounded number of ServerSession objects until memory is exhausted.
Impact
-
Attacker requirements: unauthenticated TCP reach of the MCP endpoint. No session, no credentials.
-
Effect: memory-exhaustion denial of service. A sustained or distributed attacker can OOM the worker; on services that recycle workers, the attacker simply repeats. On multi-tenant gateways, one tenant can starve all others.
-
Affected deployments: every deployment that does not opt into
session_idle_timeout. Because the README presents this as an opt-in mitigation rather than a default, real-world deployments are likely to ship vulnerable.
RELATED
- https://nvd.nist.gov/vuln/detail/CVE-2026-67430
- https://rubygems.org/gems/mcp/versions/0.23.0
- https://github.com/modelcontextprotocol/ruby-sdk/releases/tag/v0.23.0
- https://github.com/modelcontextprotocol/ruby-sdk/commit/afb968c468c178c4d3294b423fcce250621692f4
- https://advisories.gitlab.com/gem/mcp/CVE-2026-67430
- https://osv.dev/vulnerability/GHSA-52jp-gj8w-j6xh
- https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-52jp-gj8w-j6xh
- https://github.com/advisories/GHSA-52jp-gj8w-j6xh
