CVE-2026-55604: @arikusi/deepseek-mcp-server has an Authorization Bypass Through User-Controlled Key
In @arikusi/deepseek-mcp-server's HTTP mode, every client shares one in-memory session store. Any connected client can list other clients' session ids with `deepseek_sessions`, then reuse one in `deepseek_chat` to read and extend that conversation. Versions 1.4.2 up to 1.7.0 are affected; 1.7.0 gives each HTTP session its own store. STDIO mode was never affected.
Published Aug 25, 2026 · Analysis Oct 25, 2026
What an attacker can do
The server keeps conversations in a process-wide SessionStore (src/session.ts). It accepts any session_id the caller supplies and ties it to no user or transport session. deepseek_sessions with action: "list" (src/tools/deepseek-sessions.ts) prints every active id. deepseek_chat (src/tools/deepseek-chat.ts) then loads the stored messages for the supplied id, puts them in front of the attacker's message, sends them to the DeepSeek API, and appends the new turn to the victim's session.
In HTTP mode with several clients, a connected client therefore reads the other users' prompts and model answers, which may hold code, secrets or business data pasted into chats. It can also inject messages that the victim's next turn will carry, and the sessions tool can delete or clear other clients' sessions. The advisory rates this C:H, I:L, A:L.
The attacker needs to be a client of the same HTTP server, with no further authentication. The report was tested against 1.6.0 with a mock DeepSeek client. Single-user STDIO setups are not exposed, because each client runs its own process.
Who is affected
npm package @arikusi/deepseek-mcp-server from 1.4.2 up to but not including 1.7.0, when run with the HTTP transport (TRANSPORT=http) and shared by more than one client. Those versions are deprecated on npm. STDIO deployments are not affected.
Check:
npm ls @arikusi/deepseek-mcp-server
npm ls -g @arikusi/deepseek-mcp-server
env | grep TRANSPORT@arikusi/deepseek-mcp-server
- Ecosystem
- npm
- Affected
- >= 1.4.2, < 1.7.0
- Fixed in
- 1.7.0
- Check
npm ls @arikusi/deepseek-mcp-server
How to fix it
Upgrade to 1.7.0:
npm install @arikusi/[email protected]Each HTTP session now has its own SessionStore, so history, listings and deletion stay inside the session that created them. This is a breaking change for HTTP users who shared sessions across clients, and the activeSessions usage stat now returns 0 in HTTP mode. Library users must replace SessionStore.getInstance() with new SessionStore() and pass it to registerChatTool, registerSessionsTool and registerAllTools.
Workaround from the advisory: run in STDIO transport by unsetting TRANSPORT=http, or stop the HTTP server. Treat conversations held in a shared server's memory as exposed, and restart the process after upgrading to drop old sessions.
How to tell if you were hit
The server gives no audit log for this in the sources. Check your HTTP front end or MCP gateway logs for deepseek_sessions calls with action: "list" from clients that have no reason to list sessions, and for deepseek_chat calls where one client uses a session_id first created by another client.
Also review who can reach the HTTP port. If it is open to several users or agents, assume prompts stored in memory could have been read since 1.4.2.
Original advisory
From the GitHub Advisory Database (CC BY 4.0).
Cross-Session Data Exposure via Caller-Controlled session_id
Project / Repository: arikusi/deepseek-mcp-server Affected version / commit tested: 1.6.0 / 04f28be2c6e99d3d4e443a6ae37cc35f0a71554a Vulnerability type: Authorization bypass / cross-session data exposure Authentication required: No
Summary
The process-global SessionStore accepts caller-supplied session_id values without binding them to any authenticated principal or transport session. An attacker can enumerate active session IDs via deepseek_sessions, then reuse a victim-controlled session_id in deepseek_chat to retrieve and continue the victim's conversation context.
Affected Code
src/session.ts:42- caller-controlled session IDs are looked up directly from the global in-memory map.src/session.ts:67- a new session is stored under the caller-controlled ID without ownership binding.src/session.ts:109-getMessages()retrieves messages for any supplied session ID.src/tools/deepseek-chat.ts:195-deepseek_chatcreates or reuses the suppliedsession_id.src/tools/deepseek-chat.ts:197- previous messages are loaded from the suppliedsession_id.src/tools/deepseek-chat.ts:198- previous messages are prepended into the attacker-controlled request.src/tools/deepseek-chat.ts:243- attacker-provided user messages are appended into the reused session.src/tools/deepseek-chat.ts:245- assistant responses are appended back into the reused session.src/tools/deepseek-sessions.ts:37-deepseek_sessions listenumerates all active sessions.src/tools/deepseek-sessions.ts:53- each enumerated session ID is rendered back to the caller.
PoC Overview
- Create a victim conversation with
session_id = "victim-session". - Call
deepseek_sessionswithaction = "list"and observe thatvictim-sessionis disclosed. - Call
deepseek_chatagain withsession_id = "victim-session"from a separate attacker flow. - The upstream request now includes the victim's prior messages before the attacker's message.
Validation Environment
Local runtime verification on Windows host with Node.js v24.11.1, using the repository code at the tested commit and a local mock DeepSeek client to capture the effective message list passed upstream.
Impact
Any reachable caller can enumerate active session IDs and read prior conversation history stored in memory for other callers within the same server process. The same flaw also allows attacker-controlled continuation of another user's session state.
Remediation
- Bind stored sessions to an authenticated transport session or other server-generated opaque identifier.
- Do not allow arbitrary user-supplied
session_idvalues to select existing server-side state. - Remove or restrict
deepseek_sessions listso it does not disclose unrelated session IDs. - Reject reuse of a session unless the caller proves ownership of that session.
Attached Evidence
01_deepseek-mcp-server_cross_session_data_exposure.txt
---
Patches (maintainer)
Fixed in 1.7.0. The HTTP transport's SessionStore is no longer a process-wide singleton: each MCP HTTP session gets its own store, injected into the deepseek_chat and deepseek_sessions tool handlers, so a session_id from one HTTP session cannot read, enumerate, or clear another session's state. STDIO transport was never affected (one process per client). Integration tests in src/transport-isolation.test.ts assert the isolation.
Affected versions >=1.4.2, <1.7.0 are deprecated on npm. Upgrade to 1.7.0 or later.
Workaround
If upgrading is not immediately possible, run in STDIO transport (unset TRANSPORT=http) or stop the HTTP server.
Credit
Reported independently by @232-323 and @2REBCat (tested against 1.6.0). The same root cause was found and fixed concurrently by the maintainer during a security audit, shipped in 1.7.0. All parties are credited as finders.
Note on severity
A connected client could read other clients' conversation history (C:H), inject messages into their sessions (I:L), and clear or delete other clients' sessions (A:L). Scope is unchanged: the impact stays within the application's own authorization boundary, which is a cross-tenant authorization bypass, so S:U is correct.
Credited to 232-323, arikusi.
Questions
- Is the STDIO transport of deepseek-mcp-server affected?
No. The maintainer states STDIO was never affected, since each client runs its own process with its own session store.
- Does the attacker need to guess the session id?
No. The
deepseek_sessionstool withaction: "list"returns every active session id to any caller, so guessing is unnecessary.- What breaks when I upgrade to 1.7.0?
HTTP clients that relied on sharing sessions across clients must be redesigned, since sessions are now isolated. The
activeSessionsstat reads 0 in HTTP mode. Library users must constructSessionStorethemselves.
References
How this page is made: the data panel comes from the GitHub Advisory Database, CISA’s KEV catalog, the NVD and FIRST EPSS, and updates twice a day. The analysis is written by an AI model from the sources listed above and checked by automated rules before it is published. Check versions against the vendor's advisory before you act. Methodology
More Other MCP servers and tools vulnerabilities
All Other MCP servers and tools entriesCVE-2026-77361
obsidian-tc : Symlink read-ACL scope bypass via lexical path checks
medium4.7Oct 23, 2026CVE-2026-114126
Storybook dev server vulnerable to code injection from the local network
high8.7Oct 22, 2026CVE-2026-113731
djust: Arbitrary absolute-path file read in the find_handlers_for_template MCP tool
low3.3Oct 21, 2026CVE-2026-114125
Storybook: Missing origin validation in Storybook preview allows code injection from malicious websites
critical9.4Oct 21, 2026CVE-2026-111770
MCP TypeScript server SDK: Shared transport or server instances delivered one HTTP client's messages to another
high7.7Oct 20, 2026GHSA-953h-535j-jg2v
agent-router: MCP session resume does not verify the embedded anti-hijacking subject; default Helm seed makes session IDs forgeable
medium6.8Oct 19, 2026
