Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain read access to server logs
-
DeliveryTrigger or await a 500 with token-bearing Referer
-
ExploitExtract plaintext token from log entry
-
ExecutionReplay token to authenticate
-
ImpactExecute 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H
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.
Primary rating from Vendor (https://github.com/jupyter-server/jupyter_server).
CVSS VectorVendor: https://github.com/jupyter-server/jupyter_server
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:
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
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.
Apply vendor patch.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
JupyterLab extension template is a `copier` template for JupyterLab extensions. Rated critical severity (CVSS 9.8), this
The Jupyter notebook is a web-based notebook environment for interactive computing. Rated critical severity (CVSS 9.6),
JupyterLab is a user interface for Project Jupyter which will eventually replace the classic Jupyter Notebook. Rated cri
Path traversal in Jupyter nbviewer through version 1.0.1 allows unauthenticated remote attackers to read files from sibl
The Jupyter Server provides the backend (i.e. Rated medium severity (CVSS 6.1), this vulnerability is remotely exploitab
In Jupyter Notebook before 5.7.8, an open redirect can occur via an empty netloc. Rated medium severity (CVSS 6.1), this
Unauthenticated remote command execution is possible in MLJAR Mercury 3.0.0 through 3.2.3 because a missing comma in the
`jupyterhub-ltiauthenticator` is a JupyterHub authenticator for learning tools interoperability (LTI). Rated critical se
Jupyter Server Proxy allows users to run arbitrary external processes alongside their Jupyter notebook servers and provi
jupyter-lsp is a coding assistance tool for JupyterLab (code navigation + hover suggestions + linters + autocompletion +
Visual Studio Code Jupyter Extension Spoofing Vulnerability. Rated critical severity (CVSS 9.8), this vulnerability is r
BinderHub is a kubernetes-based cloud service that allows users to share reproducible interactive computing environments
EUVD-2026-82436
GHSA-c3mw-737p-c7g2
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB