Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessRegister PyPI account and publish package with javascript: homepage URL
-
DeliveryPackage surfaces in victim's JupyterLab Extension Manager search
-
ExploitVictim clicks extension name link
-
Executionjavascript: URL executes in JupyterLab browser origin
-
ImpactAttacker script accesses session tokens or calls Jupyter server API
Vulnerability Assessment
| Weakness |
CWE
|
| Exploitation Conditions | The Extension Manager must be enabled (it is on by default in JupyterLab) and must be configured to use the public PyPI source (the default). The victim must actively click the extension name hyperlink rendered in the Extension Manager - passive browsing of the extension list without clicking does not execute the payload. The attacker must hold a valid PyPI account to publish the malicious package; the package must appear in the victim's Extension Manager search results or listed view. Exploitation is limited to the browser session context of the clicking user; on single-user local deployments impact is confined to that user's local Jupyter instance, while multi-user JupyterHub deployments expose any participating user. |
| Impact | The CVSS 4.0 score of 5.1 (Medium) accurately reflects the structural constraints: PR:L captures that PyPI account registration, while trivial, is a nonzero barrier, and UI:P correctly models the required click. The subsequent-system impact (SC:L/SI:L) is arguably understated for multi-user JupyterHub deployments, where the JupyterLab origin grants access to kernel execution and file I/O via the Jupyter server API - a successful XSS could escalate to notebook-level code execution or data exfiltration. No EPSS score was provided in the intelligence data, so exploitation probability cannot be independently quantified. The vulnerability is not in CISA KEV and no public exploit code has been identified, making this a patch-priority rather than emergency-response item. Single-user local deployments carry lower realistic risk; shared or cloud-hosted JupyterHub environments elevate it considerably. |
| Exploit ScenarioDerived | An attacker registers a free PyPI account and publishes a package - plausibly named to resemble a legitimate Jupyter extension - with |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 01, 2026
Stored cross-site scripting in JupyterLab's Extension Manager allows an attacker who publishes a malicious PyPI package to execute arbitrary JavaScript in the JupyterLab browser origin. The frontend in widget.tsx renders PyPI package metadata URLs as raw anchor hrefs without protocol validation, so a javascript: URL placed in [project.urls] metadata fires the moment a victim clicks the extension name. Affects all JupyterLab releases before 4.5.9; no confirmed active exploitation (not in CISA KEV) but the attack barrier is low - only a PyPI account is required to stage the payload.
RemediationAI
Upgrade JupyterLab to version 4.5.9 or later using pip install --upgrade jupyterlab; this is the vendor-released patch per the GHSA advisory at https://github.com/jupyterlab/jupyterlab/security/advisories/GHSA-vmhf-c436-hxj4, incorporating commits 4e61e07 and d5d961f. If immediate upgrade is not possible, disable the Extension Manager entirely by adding @jupyterlab/extensionmanager-extension to disabledExtensions in jupyter_notebook_config.json - this eliminates the attack surface at the cost of losing UI-based extension management. Alternatively, restrict the Extension Manager to a private or curated PyPI mirror to prevent malicious third-party packages from appearing in search results, though this does not address the underlying protocol-validation gap. Both workarounds require administrative access to the JupyterLab configuration.
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
CWE-84 (Improper Neutralization of Encoded URI Schemes in a Web Page) is the root cause: the Python backend in jupyterlab/extensions/pypi.py copies the PyPI homepage_url field verbatim into the extension entry, and the React frontend in packages/extensionmanager/src/widget.tsx (L77-88) binds it to an <a href> attribute without sanitizing the URI scheme. Because browsers treat javascript: as a valid href scheme, clicking the link triggers script execution inside the JupyterLab origin - typically localhost or a hosted Jupyter server with filesystem and kernel API access. The fix (commits 4e61e07, d5d961f) introduces isProtocolAllowed(), which uses the URL constructor to accept only http: and https: schemes before rendering the anchor. Affected CPE: cpe:2.3:a:jupyterlab:jupyterlab:*:*:*:*:*:*:*:* versions 0 through 4.5.8.
Know when Jupyterlab 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
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N
PR:L reflects PyPI account requirement; S:C because XSS runs in JupyterLab origin with potential Jupyter server API access; UI:R for required click; no availability impact.
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
DescriptionCVE.org
JupyterLab before 4.5.9 contains a stored cross-site scripting vulnerability in the Extension Manager that fails to validate URI protocols in package metadata URLs. Attackers can publish malicious PyPI packages with javascript: URLs in project metadata that execute arbitrary JavaScript in the JupyterLab origin when users click the extension name.
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
Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.
More in Jupyterlab
View allJupyterLab extension template is a `copier` template for JupyterLab extensions. Rated critical severity (CVSS 9.8), this
JupyterLab is a user interface for Project Jupyter which will eventually replace the classic Jupyter Notebook. Rated cri
JupyterLab is an extensible environment for interactive and reproducible computing, based on the Jupyter Notebook and Ar
jupyterlab is an extensible environment for interactive and reproducible computing, based on the Jupyter Notebook Archit
JupyterLab is an extensible environment for interactive and reproducible computing, based on the Jupyter Notebook and Ar
Plugin lock-rule enforcement bypass in JupyterLab (pip package, versions >=4.1.0,<=4.5.9 and >=4.6.0,<=4.6.1) allows aut
Argument injection in JupyterLab's PyPI Extension Manager (JupyterLab 4.0.0 through 4.5.10 and the 4.6.x branch before 4
Improper trust attribution in JupyterLab's markdownviewer:trust and notebook:trust command-link handlers lets a Trust de
jupyterlab is an extensible environment for interactive and reproducible computing, based on the Jupyter Notebook Archit
Allowlist/blocklist enforcement in JupyterLab's PyPIExtensionManager.install() was silently bypassed due to a missing 'a
EUVD-2026-51849
GHSA-r75g-r7w6-363h
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB