mcp
The official Ruby SDK for the Model Context Protocol servers and clients.
Activity
- Latest release
- 5d ago
- Total releases
- 35
- Cadence
- ~7 days
- Last 12 months
- 32
Reach
- Downloads
- 9.7M
- Stars
- 908
Details
- License
- Apache-2.0
- First release
- May 30, 2025
| Version | Released | |
|---|---|---|
1.5.1
patch
| ||
1.5.0
minor
| ||
1.4.0
minor
| ||
1.3.0
minor
| ||
1.2.0
minor
| ||
1.1.0
minor
| ||
1.0.0
major
| ||
0.25.0
minor
| ||
0.24.0
minor
| ||
0.23.0
minor
| ||
0.22.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.21.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.20.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.19.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.18.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.17.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.16.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.15.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.14.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.13.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.12.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.11.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.10.0
minor
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.9.2
patch
5 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.9.1
patch
6 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.9.0
minor
6 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.8.0
minor
6 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.7.1
patch
6 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.7.0
minor
6 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.6.0
minor
6 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.5.0
minor
6 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.4.0
minor
6 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.3.0
minor
6 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.2.0
minor
6 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
| ||
0.1.0
initial
6 CVEs
CVE-2026-67431
GHSA-5p9g-j988-pcwv
Jul 30, 2026
MCP Ruby SDK: Ruby SSE Session Poisoning
High
Network
Low
None
None
SummaryVulnerability: Missing Session Ownership Validation in the Ruby MCP SDK's Streamable and SSE HTTP transport implementation. Any attacker with a stolen session ID can execute tools with the victim's session. This is a silent attack - the victim's session is compromised and being used for unauthorized actions, but it is hard to know for the victim Detailshttps://github.com/modelcontextprotocol/ruby-sdk/blob/main/lib/mcp/server/transports/streamable_http_transport.rb#L260-L278 Victim starts a legitimate MCP session and receives session ID abc-123 Attacker obtains the session ID (various means - network sniffing, logs, etc. out of scope for this analysis) Attacker sends POST to /messages/abc-123 with a tool call Server accepts the request (no ownership validation!) Server executes the tool and sends response to victim's SSE stream Victim receives attacker's response, thinking it's legitimate PoCattacker_client.py legitimate_client.py Prerequisites
Running the Demo
Makes use of https://github.com/modelcontextprotocol/ruby-sdk/blob/main/examples/streamable_http_server.rb This server has a tool call notification_tool which the clients call
Copy the session ID from Terminal 1 and run:
Impact
Additional DetailsSession Hijacking Protection in MCP Implementations The MCP specification recommends - "MCP servers SHOULD bind session IDs to user-specific information". User Binding - Comparison other SDKscsharp-sdk
Go-sdk
Comparison with the Stream Replacement vulnerabilityStream Replacement https://github.com/modelcontextprotocol/ruby-sdk/security/advisories/GHSA-qvqr-5cv7-wh35
Session Poisoning
Affected versions
0.1.0
0.10.0
0.11.0
0.12.0
0.13.0
0.14.0
0.15.0
0.16.0
0.17.0
0.18.0
0.19.0
0.2.0
+ 13 more Show less
0.20.0
0.21.0
0.22.0
0.3.0
0.4.0
0.5.0
0.6.0
0.7.0
0.7.1
0.8.0
0.9.0
0.9.1
0.9.2
Fixed in
0.23.0
References
Updated Jul 30, 2026 · Source: OSV.dev
CVE-2026-67432
GHSA-h669-8m4g-r2hc
Jul 30, 2026
MCP Ruby SDK: Unbounded JSON-RPC request body causes uncontrolled memory allocation in StreamableHTTPTransport
7.5
/ 10
High
Network
Low
None
None
Unchanged
None
None
High
SummaryAn unauthenticated remote attacker can force any MCP Ruby SDK server using Affected component
The vulnerable path runs before session validation, so it is reachable in both the default stateful mode and in A second instance of the same root cause exists in Proof of conceptBoth files below are self-contained. Save them anywhere on disk, run the server in one terminal and the client in another. The only dependencies are the SDK's existing Gemfile entries ( Server (
|