Jupyter Server before 2.21.0 writes the raw Referer header to its logs when a request returns HTTP 500, bypassing the token scrubbing applied to the request URI, so any session token embedded in that Referer is stored in plaintext. The attack is hard to pull off (high complexity, user interaction required, low privileges, and a log-read prerequisite), and EPSS sits at 0.4% (66th percentile) with no KEV listing and a CISA SSVC decision of TRACK. Even so, a public PoC exists and the package has 1,892 downstream dependents and 41 other CVEs on record, while a stolen token gives full Jupyter permissions, which in practice means code execution in notebooks with access to data, models and cloud credentials. Upgrade jupyter_server to 2.21.0 or later, rotate any tokens that may have appeared in logs, and restrict and audit access to Jupyter log files and the log aggregation pipeline.
What is the risk?
Medium-to-high rather than critical. CVSS 7.1 reflects high confidentiality, integrity and availability impact if a token is recovered, but exploitation needs a 500 error triggered with a token-bearing Referer, a user action, and read access to the logs. EPSS is low (0.00416), the CVE is not in KEV, and SSVC says TRACK. Exposure is highest in shared, multi-user or centrally logged Jupyter deployments (JupyterHub-style, cloud notebooks, Kubernetes with log forwarding to SIEM or shared storage), where many people can read logs. Single-user localhost instances carry little risk.
How does the attack unfold?
What systems are affected?
How severe is it?
What is the attack surface?
What should I do?
1 step1) Upgrade jupyter_server to 2.21.0 or later (fix: PR #1681, commit 52513529). 2) Invalidate and rotate Jupyter tokens and passwords for instances running vulnerable versions, especially if logs were shipped to shared systems. 3) Search existing logs and SIEM indices for 5xx entries whose Referer contains 'token=' and purge or redact them. 4) Restrict read access to Jupyter logs and log aggregation, and apply log redaction rules for 'token=' query parameters at the collector. 5) Do not expose Jupyter directly to the internet; put it behind an authenticating proxy or VPN and prefer short-lived tokens or SSO. 6) Monitor for unusual kernel launches, new sessions from unexpected IPs, and use of tokens that appeared in logs.
What does CISA's SSVC say?
Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-86049?
Jupyter Server before 2.21.0 writes the raw Referer header to its logs when a request returns HTTP 500, bypassing the token scrubbing applied to the request URI, so any session token embedded in that Referer is stored in plaintext. The attack is hard to pull off (high complexity, user interaction required, low privileges, and a log-read prerequisite), and EPSS sits at 0.4% (66th percentile) with no KEV listing and a CISA SSVC decision of TRACK. Even so, a public PoC exists and the package has 1,892 downstream dependents and 41 other CVEs on record, while a stolen token gives full Jupyter permissions, which in practice means code execution in notebooks with access to data, models and cloud credentials. Upgrade jupyter_server to 2.21.0 or later, rotate any tokens that may have appeared in logs, and restrict and audit access to Jupyter log files and the log aggregation pipeline.
Is CVE-2026-86049 actively exploited?
Proof-of-concept exploit code is publicly available for CVE-2026-86049, increasing the risk of exploitation.
How to fix CVE-2026-86049?
1) Upgrade jupyter_server to 2.21.0 or later (fix: PR #1681, commit 52513529). 2) Invalidate and rotate Jupyter tokens and passwords for instances running vulnerable versions, especially if logs were shipped to shared systems. 3) Search existing logs and SIEM indices for 5xx entries whose Referer contains 'token=' and purge or redact them. 4) Restrict read access to Jupyter logs and log aggregation, and apply log redaction rules for 'token=' query parameters at the collector. 5) Do not expose Jupyter directly to the internet; put it behind an authenticating proxy or VPN and prefer short-lived tokens or SSO. 6) Monitor for unusual kernel launches, new sessions from unexpected IPs, and use of tokens that appeared in logs.
What systems are affected by CVE-2026-86049?
This vulnerability affects the following AI/ML architecture patterns: Notebook-based ML development environments, Training pipelines, Shared data science platforms, Model experimentation workspaces, Centralized logging for AI infrastructure.
What is the CVSS score for CVE-2026-86049?
CVE-2026-86049 has a CVSS v3.1 base score of 7.1 (HIGH). The EPSS exploitation probability is 0.42%.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0012Valid AccountsAML.T0055Unsecured CredentialsAML.T0091.000Application Access TokenCompliance Controls Affected
What are the technical details?
Original Advisory
Jupyter Server is the backend for Jupyter web applications. Prior to version 2.21.0, the 5xx request logging path in jupyter_server/log.py copies the Referer header into a JSON header block without applying the token scrubbing used for the request URI. A request that returns HTTP 500 while the Referer contains a token-bearing URL can therefore write that token to server logs in plaintext. An attacker who can read those logs can recover the token and use the affected user's Jupyter Server permissions. This issue is fixed in version 2.21.0.
Exploitation Scenario
An attacker with low-privilege access to a shared data science platform (or to a log aggregation system holding Jupyter logs) waits for, or induces, a request that makes the server return HTTP 500 while the victim's browser sends a Referer containing a URL with the Jupyter token, for example via a crafted link or page that leads the victim into an error path. The unscrubbed Referer is written to the server log. The attacker reads the log, extracts the token, and authenticates to the victim's Jupyter Server. They then open a terminal or notebook kernel, steal cloud and LLM API credentials, exfiltrate datasets and model files, or tamper with notebooks and pipelines.
Weaknesses (CWE)
CWE-532Insertion of Sensitive Information into Log FilePrimaryCWE-532Insertion of Sensitive Information into Log FilePrimaryCWE-532Insertion of Sensitive Information into Log FileCWE-532 — Insertion of Sensitive Information into Log File: The product writes sensitive information to a log file.
- [Architecture and Design, Implementation] Consider seriously the sensitivity of the information written into log files. Do not write secrets into the log files.
- [Distribution] Remove debug log files before deploying the application into production.
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:HReferences
- github.com/advisories/GHSA-c3mw-737p-c7g2
- github.com/jupyter-server/jupyter_server/commit/52513529af7096e622c00911b17627b266294717
- github.com/jupyter-server/jupyter_server/pull/1681
- github.com/jupyter-server/jupyter_server/releases/tag/v2.21.0
- github.com/jupyter-server/jupyter_server/security/advisories/GHSA-c3mw-737p-c7g2
Timeline
Related Vulnerabilities
CVE-2023-2557410.0JupyterHub LTI13: JWT forgery enables full auth bypass
Same package: jupyterCVE-2024-3970010.0JupyterLab extension-template: CI workflow RCE
Same package: jupyterCVE-2026-441809.8Jupyter Enterprise Gateway: root privilege bypass in Kubernetes
Same package: jupyterCVE-2026-235379.1Feast: unauth file write to RCE via /save-document
Same package: jupyterCVE-2026-545279.0jupyterlab-git: stored XSS escalates to full RCE
Same package: jupyter