<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Mcp (&lt;= 0.22.0) - CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/products/mcp--0.22.0/</link><description>Trending threats, MITRE ATT&amp;CK coverage, and detection metadata. Fed continuously.</description><generator>Hugo</generator><language>en</language><managingEditor>hello@craftedsignal.io</managingEditor><webMaster>hello@craftedsignal.io</webMaster><lastBuildDate>Thu, 30 Jul 2026 15:30:16 +0000</lastBuildDate><atom:link href="https://feed.craftedsignal.io/products/mcp--0.22.0/feed.xml" rel="self" type="application/rss+xml"/><item><title>Uncontrolled Memory Allocation in MCP Ruby SDK</title><link>https://feed.craftedsignal.io/briefs/2026-07-mcp-ruby-oom/</link><pubDate>Thu, 30 Jul 2026 15:30:16 +0000</pubDate><author>hello@craftedsignal.io</author><guid isPermaLink="true">https://feed.craftedsignal.io/briefs/2026-07-mcp-ruby-oom/</guid><description>An unauthenticated remote attacker can cause a denial-of-service in MCP Ruby SDK servers by sending oversized JSON-RPC requests that trigger unbounded memory allocation.</description><content:encoded><![CDATA[<p>The MCP Ruby SDK contains a vulnerability in the <code>StreamableHTTPTransport</code> and <code>StdioTransport</code> components that allows for trivial denial-of-service (DoS) via memory exhaustion. The vulnerability stems from the <code>handle_post</code> method, which reads the entire body of an incoming HTTP request into memory using <code>request.body.read</code> without any size constraints or pre-validation of the <code>Content-Length</code> header. Subsequently, the application calls <code>JSON.parse</code> with <code>symbolize_names: true</code> on the entire payload. Because <code>symbolize_names</code> creates a Ruby symbol for every JSON key, the memory consumption is significantly amplified beyond the raw size of the payload. This vulnerability is reachable without authentication, making it accessible to any unauthenticated remote attacker with network reach to the MCP server. Successfully sending a single large payload can drive a worker process to consume gigabytes of memory, leading to OOM-termination.</p>
<h2 id="attack-chain">Attack Chain</h2>
<ol>
<li>Attacker identifies an MCP Ruby SDK server exposing the <code>StreamableHTTPTransport</code> interface.</li>
<li>Attacker crafts a malicious JSON-RPC POST request with a large payload (e.g., several hundred megabytes).</li>
<li>Attacker sends the HTTP request to the target server's endpoint.</li>
<li>The <code>StreamableHTTPTransport</code> component receives the request and executes <code>request.body.read</code>.</li>
<li>The application loads the entirety of the attacker-supplied payload into a Ruby <code>String</code>.</li>
<li>The <code>JSON.parse</code> method executes on the full payload, creating a large object graph and numerous symbols.</li>
<li>The server process memory usage spikes dramatically, consuming system resources.</li>
<li>The worker process crashes or is terminated due to OOM (Out of Memory) conditions, resulting in denial-of-service.</li>
</ol>
<h2 id="impact">Impact</h2>
<p>The vulnerability allows any unauthenticated attacker with network access to crash individual worker processes of an MCP Ruby SDK application. By repeatedly sending these malicious requests, an attacker can maintain a persistent DoS state. In multi-tenant environments, this vulnerability enables an attacker to starve shared server resources, potentially impacting services running alongside the vulnerable worker.</p>
<h2 id="recommendation">Recommendation</h2>
<p>Prioritized actions for mitigation:</p>
<ul>
<li>Upgrade the <code>mcp</code> gem to a version containing the patch for CVE-2026-67432 once available.</li>
<li>Implement an inbound request size limit at the reverse proxy or web server layer (e.g., Nginx <code>client_max_body_size</code>) to drop requests exceeding a reasonable threshold (e.g., 4 MiB) before they reach the Ruby application.</li>
<li>Apply middleware in the Rack application to validate the <code>Content-Length</code> header before reading the request body.</li>
<li>Configure the application to use a streaming JSON parser rather than loading the full request body into memory.</li>
</ul>
]]></content:encoded><category domain="severity">low</category><category domain="type">advisory</category></item></channel></rss>