Model Context Protocol project
Kotlin SDK discloses two Streamable HTTP denial-of-service records, one unauthenticated, both fixed nine weeks earlier
The official Kotlin SDK published two advisories on 2026-09-03. CVE-2026-63658 (high, 7.5) is an unauthenticated remote DoS: a chunked-encoding request has no Content-Length, so it bypasses the pre-read size guard and the whole attacker-controlled body is buffered in memory. CVE-2026-63657 (medium, 6.5) is the client-side mirror, where a server that never terminates an SSE event grows the client's heap without bound. Both affect 0.13.0 and earlier and were fixed in 0.14.0 on 2026-06-30, nine weeks before the records. It is the fifth official SDK in a month to disclose an unbounded-read defect in its HTTP transport.
The official Kotlin SDK published two security advisories on 2026-09-03, both against its Streamable HTTP transport and both describing the same failure in opposite directions: a size limit that does not hold.
CVE-2026-63658, rated high at CVSS 7.5, is the server-side case and needs
no credentials. The transport enforces a request body limit by checking
the size before reading, but a request sent with
Transfer-Encoding: chunked carries no Content-Length to check, and
neither does HTTP/2. The guard is skipped, receiveText() buffers the
whole attacker-supplied body, and the JVM heap is exhausted. The advisory
also records that SSEServerTransport.handlePostMessage() has the same
flaw with no size limit at all.
CVE-2026-63657, medium at 6.5, is the client-side mirror. A malicious or
compromised MCP server can stream data: lines forever without ever
sending the blank line that terminates an SSE event, so
StreamableHttpClientTransport accumulates the fragments in memory
waiting for an event that never arrives.
Both affect 0.13.0 and earlier and were fixed in 0.14.0, released 2026-06-30, which puts the records nine weeks behind the fix; the current release is 0.15.0. Neither CVE had a populated record at cveawg.mitre.org when checked on 2026-09-03, so the repository advisories are the primary evidence for both.
The pattern is now hard to miss. In under a month, unbounded-read defects in HTTP transports have been disclosed against five official SDKs: the PHP SDK's client-side SSE buffer, the Java SDK bounding its unbounded HTTP reads, the Python SDK extending its body limit to SSE and OAuth endpoints, and now the Kotlin SDK in both directions at once. The 2026-07-28 revision made Streamable HTTP the primary binding, and each SDK has had to learn separately where its own reads were unbounded.
Related spec revisions
- MCP 2026-07-28 - current
Related publishers
How was this verified, and what are the sources?
Published · confidence 1.00.
- GHSA-f47c-p7wj-q7gx on modelcontextprotocol/kotlin-sdk, published 2026-09-03, severity high, CVSS 3.1 7.5 - "Unauthenticated Remote Denial of Service in MCP Kotlin SDK Streamable HTTP transport (request body size limit bypass)"; affected <= 0.13.0, patched 0.14.0. States that a request using Transfer-Encoding chunked, or HTTP/2 which has no Content-Length, bypasses the pre-read guard and receiveText() then buffers the entire attacker-controlled body - accessed
- GHSA-4x39-xh35-w96w on modelcontextprotocol/kotlin-sdk, published 2026-09-03, severity medium, CVSS 3.1 6.5 - "Unbounded memory growth in StreamableHttpClientTransport when parsing inline Server-Sent Events on HTTP POST responses"; a malicious or compromised server can send endless data lines without the SSE event terminator, growing the client heap until OOM; affected <= 0.13.0, patched 0.14.0 - accessed
- Kotlin SDK releases, fetched 2026-09-03 - 0.14.0, the version both advisories name as patched, was published 2026-06-30; 0.13.0 was published 2026-06-02 and the current release is 0.15.0 (2026-07-28) - accessed