Skip to main content

Jupyter Server EUVDEUVD-2026-82436

| CVE-2026-86049 HIGH
Insertion of Sensitive Information into Log File (CWE-532)
2026-09-17 https://github.com/jupyter-server/jupyter_server GHSA-c3mw-737p-c7g2
7.1
CVSS 3.1 · Vendor: https://github.com/jupyter-server/jupyter_server
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain read access to server logs
  2. Delivery
    Trigger or await a 500 with token-bearing Referer
  3. Exploit
    Extract plaintext token from log entry
  4. Execution
    Replay token to authenticate
  5. Impact
    Execute code via Jupyter session

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A09:2025 - Security Logging & Alerting Failures
ASVS 5.0
V16 - Security Logging and Error Handling Log data sanitization
Exploitation Conditions

Exploitation requires two concurrent conditions: (1) the attacker must be able to READ the Jupyter Server logs (local log files, host access, or a log-aggregation/SIEM pipeline), and (2) a valid token must have traversed the Referer header - which happens naturally during token-based login and notebook-launch flows where the token appears in the URL - coinciding with a request that returns HTTP 500. The 500 can be induced on demand (e.g., a malformed JSON POST to /api/kernels as shown in the PoC). Limiting factors: no direct remote attacker primitive - value is gated on log-read privilege; deployments that authenticate via headers/OAuth rather than ?token= URLs, or that already restrict log access, materially reduce exposure. Affects all jupyter_server versions <= 2.20.0; fixed in 2.21.0 which scrubs the Referer before logging.

Impact

The vendor CVSS 3.1 score is 7.1 (CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H), but the vector overstates the direct impact and mis-sets the attack vector. This is a CWE-532 sensitive-data-in-logs flaw: a token-bearing Referer header is written verbatim into a JSON header block whenever a request returns HTTP 500. The direct, primary impact is confidentiality (token disclosure); the I:H/A:H metrics reflect the DOWNSTREAM consequence - a leaked Jupyter token grants full session access and code execution - rather than an integrity/availability effect of the logging bug itself, so the base impact is best modeled as C:H/I:N/A:N. AV:N is also questionable: exploitation hinges on an actor who can READ the server logs, which is typically a local/privileged position (log files, log aggregation, or shared hosts), pushing toward AV:L and PR:L rather than a purely network-reachable primitive. A functional PoC is published in the GHSA advisory and a fixing commit/PR and regression test exist, so this is 'publicly available exploit code exists.' There is no EPSS, KEV, or SSVC data in the input; absence of KEV means no confirmed active exploitation. Net: a real, credible confidentiality/token-leak issue worth patching in exposed multi-tenant or shared-log deployments, but the 7.1 High rating is inflated by counting token-reuse consequences as base I/A impact, and real-world risk is gated by who can read logs plus a token actually flowing through a Referer during a 500.

Exploit ScenarioDerived

During normal token-based login or notebook-launch flows, a user's URL (containing ?token=...) is sent as the Referer header; when any request to that Jupyter Server returns a 500, the raw Referer - token included - is written to the server log. An attacker or insider with read access to those logs (local file, syslog, or a centralized log pipeline) harvests the plaintext token and replays it to gain authenticated access to the Jupyter Server. A working PoC (a malformed POST that reliably triggers a 500 while carrying a token in the Referer) is published in the GitHub advisory.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 17, 2026

Jupyter Server 2.20.0 and earlier writes the raw Referer header into a JSON header dump logged for every HTTP 500 response, so authentication tokens that appear in Jupyter's normal ?token= login and notebook-launch URLs are captured in log files in cleartext. The leak is not remotely exploitable on its own: it requires an actor who can read the server logs (local files, host compromise, or a log-aggregation/SIEM pipeline) combined with a token-bearing Referer and a 500 response, which an attacker can induce on demand with a malformed JSON POST to /api/kernels. Token theft from logs yields full API/kernel access, but impact is confined to confidentiality of the stolen token, so the vendor's 7.1 (AV:N/I:H) score overstates the realistic exposure versus a local log-read precondition; all versions up to 2.20.0 are affected and no public exploit code was identified at time of analysis.

RemediationAI

Upgrade jupyter_server to 2.21.0 or later (pip install -U 'jupyter_server>=2.21.0' in each environment/kernel image), which applies the fix from commit 52513529af7096e622c00911b17627b266294717 / PR #1681 that scrubs the Referer value through _scrub_uri() before it is logged alongside other header-dump fields; verify with python -c "import jupyter_server; print(jupyter_server.__version__)" in every environment, since stale copies inside container images or per-user venvs are the usual gap. Where upgrading is not immediately possible, compensate as follows: (1) restrict readability of the server log files and directories to the running user only (removes the log-read privilege the whole issue depends on, at the cost of complicating collection by non-root log shippers), and (2) refuse or sanitize Referer values at the log pipeline - strip token=, ?, and query strings in the SIEM/shipper redaction rules so already-collected entries are scrubbed, accepting that redaction must be maintained as an ongoing config rather than a code fix. Also prefer authentication schemes that keep tokens out of the URL (JupyterHub auth, OAuth, or header-based auth with short-lived per-user tokens) and avoid workflows that place ?token= in navigable URLs, though note Jupyter's own token login/launch flows do this by default and changing it can break existing client integrations. Treat any tokens that may already have been written to logs as compromised: rotate ServerApp.token/IdentityProvider credentials and invalidate existing session tokens, since pre-patch log entries cannot be un-leaked. No vendor-released patch issue remains here - 2.21.0 is available; the workarounds above are for environments where the upgrade cannot be deployed immediately.

Affected VersionsENISA

jupyter_server < 2.21.0

Affected Packages

pypi jupyter-server fix: 2.21.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in pypi

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

The issue is CWE-532 (Insertion of Sensitive Information into Log File), located in jupyter_server/log.py::log_request(). On non-success responses (the advisory and patch reference the 5xx path), the Tornado request handler builds a small JSON block of selected request headers - including the Referer value taken verbatim from request.headers - and emits it through the application logger. Token-based authentication in Jupyter puts the token in the URL query string, and browsers propagate the full URL into the Referer header when navigating between pages, so tokens naturally arrive in that header during login and notebook-launch flows. The upstream fix in commit 52513529af7096e622c00911b17627b266294717 (PR #1681) special-cases header == "Referer" and runs the value through the existing _scrub_uri() helper with the configured extra_log_scrub_param_keys before it is placed into the logged dictionary; a regression test asserts that REFERTOKEN no longer appears and that [secret] is substituted. The affected artifact is the PyPI package jupyter_server (CPE pkg:pip/jupyter_server), <= 2.20.0. Any downstream distribution that bundles an older jupyter_server (JupyterLab, Notebook 7, JupyterHub single-user images, container images, managed notebook platforms) inherits the behavior until the package is upgraded.

Know when Jupyter gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (https://github.com/jupyter-server/jupyter_server) PRIMARY 7.1 HIGH
AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
vuln.today AI 4.7 MEDIUM

Exploitation needs read access to server logs (AV:L, PR:L) plus a coincident token-bearing 500 (AC:H); direct impact is token disclosure (C:H), with I/A being downstream token-reuse effects not base impact.

3.1 AV:L/AC:H/PR:L/UI:N/S:U/C:H/I:N/A:N
4.0 AV:L/AC:H/AT:P/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
Red Hat 4.8 MEDIUM

Primary rating from Vendor (https://github.com/jupyter-server/jupyter_server).

CVSS VectorVendor: https://github.com/jupyter-server/jupyter_server

Attack Vector
Network
Attack Complexity
High
Privileges Required
Low
User Interaction
Required
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
High

DescriptionCVE.org

Summary

When a request returns a 500, jupyter_server/log.py logs a small JSON block of request headers.

The Referer header was copied into it as-is, so a token in the Referer URL ended up in the logs in plain text.

Impact

Anyone who can read the server logs can pick tokens out of these 500 entries. Tokens end up in the Referer during normal token-based login and launch flows.

Affected: all versions before 2.21.0.

PoC

Any malformed request that returns a 500 works:

bash
curl -i -X POST \
  -H 'Content-Type: application/json' \
  -H 'Referer: http://127.0.0.1:8899/tree?token=REFERTOKEN' \
  --data '{"name":123}' \
  'http://127.0.0.1:8899/api/kernels?token=VALIDTOKEN'

The log shows the token twice, once raw and once redacted:

"Referer": "http://127.0.0.1:8899/tree?token=REFERTOKEN",
[E ... ServerApp] 500 POST /api/kernels?token=[secret] (...) referer=http://127.0.0.1:8899/tree?token=[secret]

Patches

Fixed in 2.21.0 by 5251352. Header values are now scrubbed before the block is logged. Upgrade to 2.21.0 or later.

Workarounds

Limit who can read the server logs. If you can, avoid flows that put the token in the URL.

Technical POC Analysis

CWE-532 (Insertion of Sensitive Information into Log File) in jupyterserver/log.py, function logrequest, around line 102.

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

Jupyter Server versions 2.20.0 and earlier write the raw Referer header into a JSON header dump logged for every HTTP 500 response, which means authentication tokens carried in Jupyter's normal ?token= login and notebook-launch URLs can be captured in log files in cleartext. Anyone able to read those logs - administrators, an attacker with a foothold on the host, or a shared log-aggregation/SIEM pipeline - can recover a working token and obtain full API and kernel access to the affected server. The practical risk is highest in organizations that centralize or widely share Jupyter logs, where a credential-handling failure in a core data-science platform becomes a broad access-control problem rather than a narrow host issue.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.2%
Top 85% exploitable
Prevalence
High
Jupyter Server underpins JupyterLab/Notebook across data-science and ML environments
Threat Intel
1
1 source
Data Quality
7 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA Vendor GitHub VulDB

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact
High
Technical Impact
Total

Priority Score

36
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +36
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

CVE-2024-39700 CRITICAL POC
9.8 Jul 16

JupyterLab extension template is a `copier` template for JupyterLab extensions. Rated critical severity (CVSS 9.8), this

CVE-2021-32798 CRITICAL POC
9.6 Aug 09

The Jupyter notebook is a web-based notebook environment for interactive computing. Rated critical severity (CVSS 9.6),

CVE-2021-32797 CRITICAL POC
9.6 Aug 09

JupyterLab is a user interface for Project Jupyter which will eventually replace the classic Jupyter Notebook. Rated cri

CVE-2026-86258 HIGH POC
8.2 Sep 06

Path traversal in Jupyter nbviewer through version 1.0.1 allows unauthenticated remote attackers to read files from sibl

CVE-2020-26275 MEDIUM POC
6.1 Dec 21

The Jupyter Server provides the backend (i.e. Rated medium severity (CVSS 6.1), this vulnerability is remotely exploitab

CVE-2019-10856 MEDIUM POC
6.1 Apr 04

In Jupyter Notebook before 5.7.8, an open redirect can occur via an empty netloc. Rated medium severity (CVSS 6.1), this

CVE-2026-111057 CRITICAL
10.0 Oct 19

Unauthenticated remote command execution is possible in MLJAR Mercury 3.0.0 through 3.2.3 because a missing comma in the

CVE-2023-25574 CRITICAL
10.0 Feb 25

`jupyterhub-ltiauthenticator` is a JupyterHub authenticator for learning tools interoperability (LTI). Rated critical se

CVE-2024-28179 CRITICAL
9.8 Mar 20

Jupyter Server Proxy allows users to run arbitrary external processes alongside their Jupyter notebook servers and provi

CVE-2024-22415 CRITICAL
9.8 Jan 18

jupyter-lsp is a coding assistance tool for JupyterLab (code navigation + hover suggestions + linters + autocompletion +

CVE-2023-36018 CRITICAL
9.8 Nov 14

Visual Studio Code Jupyter Extension Spoofing Vulnerability. Rated critical severity (CVSS 9.8), this vulnerability is r

CVE-2021-39159 CRITICAL
9.8 Aug 25

BinderHub is a kubernetes-based cloud service that allows users to share reproducible interactive computing environments

Vendor StatusVendor

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy