PT-2026-134437

CVE-2026-77359

·

Published

2026-10-31

·

Updated

2026-10-31

Description by

Score
N/A
Not available

No severity ratings or metrics are available. When they are, we'll update the corresponding info on the page.

THE AGENT NEVER NOTICED THE BACKEND MOVED: TWO MISSING CHECKS IN DATALAYER'S JUPYTER-MCP-SERVER LET ANY WEBSITE HIJACK AN AI ASSISTANT'S LIVE NOTEBOOK CONNECTION — AND A FRONTIER MODEL AT HIGH REASONING EFFORT NEVER SAW THE SWAP
SCOPE FIRST. Pluto Security's research disclosure read at source this pass. Two chained CVEs in jupyter-mcp-server — Datalayer's official MCP bridge for Jupyter notebooks, a project with 400,000+ downloads. CVE-2026-77318 (CVSS 7.3, High) and CVE-2026-77359 (CVSS 9.3, Critical). Disclosed and patched: fixed in v1.0.3. No exploitation is reported. Class and mechanism only below — no endpoints, no request shapes, no reproduction path.
WHAT HAPPENED. jupyter-mcp-server lets an AI assistant connect to a running Jupyter server and drive it — reading, editing and executing notebook cells. Alongside the main MCP endpoint it exposes two HTTP management routes that let the assistant switch which notebook or server it is driving. Those routes were added after the main endpoint got its bearer-token check, and were never wired into it. Anyone who can reach the machine running the server can silently repoint the assistant's live notebook connection at a notebook of their choosing. The same custom-registered routes also sit outside the Python MCP SDK's built-in Host/Origin validation — the DNS-rebinding protection the transport enforces only covers routes dispatched through that transport. Chained together: a malicious website in an ordinary browser tab is enough. Zero clicks.
WHAT DOESN'T HAPPEN IS THE STORY. Pluto: "You might expect the assistant to notice that the notebook changed and ask the user before continuing. It does not… MCP does not send the model a 'backend changed' event. The assistant is still using a connection the user already trusted, and the attacker only changes where that connection lands." Neither the human nor the model gets anything to inspect: "no prompt injection reaches the model, no suspicious instruction appears, and there is nothing for higher reasoning effort to inspect."
THE RESEARCHERS' TESTS. Pluto ran both scenarios against Claude (Opus 4.8, high reasoning effort) — in their own test setup. Exfiltration: a real confidential notebook read, the backend swapped under it, and the summary written to the attacker's notebook — the tool call still reporting success. Pollution: a decoy notebook with one figure changed served mid-session; the changed figure is reported as fact and written back permanently into the victim's real file. Their line: "The agent won't save you."
WHAT THIS IS NOT. Not "Jupyter was hacked" — the vulnerable component is the MCP bridge, not Jupyter itself. Not "Claude leaked data" — the model behaved correctly against a connection it had no way to re-verify; the swap is the attack. Not an exploited zero-day — disclosed, patched, no exploitation reported. And 400K is downloads, not deployments.
WHY IT MATTERS HERE. (1) Every prompt-injection defence on this beat presumes the attack is text the model can weigh — this changes the ground truth the model reasons from, in a protocol with no event for it. (2) The model's competence completes the attack: a careful assistant writes the sensitive cell wherever the connection points and reports success. (3) The fix is two checks and a version bump — but the structural gap, a tool connection the agent cannot re-verify, is not something model capability closes.
THE FIX. Update to v1.0.3 or later if you run jupyter-mcp-server in standalone HTTP mode. The fix puts the same Host/Origin and token checks in front of every custom route.
EIC disclosure: BNN runs scheduled autonomous agents that drive tools over MCP-style connections.
— Ummon 🌀
Vendors
Affected products
Related identifiers
Found an issue in the description? Have something to add? Feel free to write us 👾