CVE-2026-67338: JupyterLab: stored XSS via malicious extension metadata
MEDIUMJupyterLab's Extension Manager fails to validate URI protocols in package metadata, letting an attacker publish a PyPI package with a javascript: URL that executes arbitrary JavaScript in the JupyterLab origin the moment a user clicks the extension's name. This matters because JupyterLab notebooks are the default workbench for data scientists and ML engineers, and code running in the JupyterLab origin can potentially reach the session's auth token and REST API, turning a single click into server-level compromise. The absolute exploitation probability is low (EPSS 0.175%), there's no public PoC or Nuclei template, it's not in CISA KEV, and CISA's own SSVC decision is TRACK — so this is not an urgent fire drill, though its EPSS percentile still places it above the median CVE in relative likelihood. Upgrade to JupyterLab 4.5.9 or later; until then, treat unfamiliar PyPI extensions in the Extension Manager as untrusted and avoid clicking extension names from unverified publishers, and consider restricting outbound Extension Manager searches to vetted internal package sources.
What is the risk?
Medium severity (CVSS 6.1, AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N). Network-reachable and low complexity, but blocked by a mandatory user-interaction gate (clicking the malicious extension name) and yields only low confidentiality/integrity impact per the vector — no availability impact. Scope is Changed, meaning the XSS can affect resources beyond the vulnerable component (e.g., the browser session/origin), which is the main reason this isn't rated low. No active exploitation, no KEV listing, no public exploit code or scanner template, and EPSS absolute probability is under 0.2%. Overall: real but contained risk, gated by social engineering and requiring a user to actively browse and click on a specific untrusted package.
How does the attack unfold?
How severe is it?
What is the attack surface?
What should I do?
1 step-
Patch: upgrade JupyterLab to 4.5.9 or later, which fixes URI protocol validation in Extension Manager package metadata rendering. Workaround if patching is delayed: disable or restrict the Extension Manager for non-admin users, or block installation of extensions from unvetted PyPI packages via an internal allowlist. User awareness: train users not to click extension names/links from unfamiliar or newly-published packages in the Extension Manager UI. Detection: monitor JupyterLab server logs for anomalous extension search/install activity and review browser-side CSP violation reports if CSP is enforced; audit recently installed extensions for suspicious metadata URLs (javascript: scheme) as an IOC.
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-67338?
JupyterLab's Extension Manager fails to validate URI protocols in package metadata, letting an attacker publish a PyPI package with a javascript: URL that executes arbitrary JavaScript in the JupyterLab origin the moment a user clicks the extension's name. This matters because JupyterLab notebooks are the default workbench for data scientists and ML engineers, and code running in the JupyterLab origin can potentially reach the session's auth token and REST API, turning a single click into server-level compromise. The absolute exploitation probability is low (EPSS 0.175%), there's no public PoC or Nuclei template, it's not in CISA KEV, and CISA's own SSVC decision is TRACK — so this is not an urgent fire drill, though its EPSS percentile still places it above the median CVE in relative likelihood. Upgrade to JupyterLab 4.5.9 or later; until then, treat unfamiliar PyPI extensions in the Extension Manager as untrusted and avoid clicking extension names from unverified publishers, and consider restricting outbound Extension Manager searches to vetted internal package sources.
Is CVE-2026-67338 actively exploited?
No confirmed active exploitation of CVE-2026-67338 has been reported, but organizations should still patch proactively.
How to fix CVE-2026-67338?
Patch: upgrade JupyterLab to 4.5.9 or later, which fixes URI protocol validation in Extension Manager package metadata rendering. Workaround if patching is delayed: disable or restrict the Extension Manager for non-admin users, or block installation of extensions from unvetted PyPI packages via an internal allowlist. User awareness: train users not to click extension names/links from unfamiliar or newly-published packages in the Extension Manager UI. Detection: monitor JupyterLab server logs for anomalous extension search/install activity and review browser-side CSP violation reports if CSP is enforced; audit recently installed extensions for suspicious metadata URLs (javascript: scheme) as an IOC.
What systems are affected by CVE-2026-67338?
This vulnerability affects the following AI/ML architecture patterns: notebook-based ML/data science development environments, training and experimentation pipelines (JupyterLab front-end), supply chain / package ecosystem (PyPI).
What is the CVSS score for CVE-2026-67338?
CVE-2026-67338 has a CVSS v3.1 base score of 6.1 (MEDIUM). The EPSS exploitation probability is 0.17%.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0010.001 AI Software AML.T0011 User Execution AML.T0011.001 Malicious Package Compliance Controls Affected
What are the technical details?
Original Advisory
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.
Exploitation Scenario
An attacker registers a PyPI package designed to look like a legitimate JupyterLab extension (e.g., mimicking a popular ML tooling name) and sets a javascript: URI in the project metadata URL field. The package is indexed and becomes visible via JupyterLab's Extension Manager search. A data scientist searching for new extensions browses the results and clicks the malicious package's name, triggering execution of the attacker's JavaScript within the JupyterLab origin. The script attempts to read session tokens or cookies from the JupyterLab origin and exfiltrate them to an attacker-controlled endpoint, or manipulates the DOM to trick the user into further unsafe actions — potentially escalating to abuse of the Jupyter server's REST/kernel API if a valid token is captured.
Weaknesses (CWE)
CWE-84 Improper Neutralization of Encoded URI Schemes in a Web Page
Primary
CWE-84 Improper Neutralization of Encoded URI Schemes in a Web Page CWE-84 — Improper Neutralization of Encoded URI Schemes in a Web Page: The web application improperly neutralizes user-controlled input for executable script disguised with URI encodings.
- [Implementation] Resolve all URIs to absolute or canonical representations before processing.
- [Implementation] Carefully check each input parameter against a rigorous positive specification (allowlist) defining the specific characters and format allowed. All input should be neutralized, not just parameters that the user is supposed to specify, but all data in the request, including tag attributes, hidden fields, cookies, headers, the URL itself, and so forth. A common mistake that leads to continuing XSS vulnerabilities is to validate only fields that are expected to be redisplayed by the site. We often encounter data from the request that is reflected by the application server or the application that the development team did not anticipate. Also, a field that is not currently reflected may be used by a future developer. Therefore, validating ALL parts of the HTTP request is recommended.
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N References
- github.com/jupyterlab/jupyterlab/commit/4e61e07d0a91145b53fbf96ac74b0387f6bc51f6
- github.com/jupyterlab/jupyterlab/commit/d5d961f6e10a6442dddbf94d9a976b3897055a12
- github.com/jupyterlab/jupyterlab/security/advisories/GHSA-vmhf-c436-hxj4
- vulncheck.com/advisories/jupyterlab-before-stored-xss-via-extension-manager
Timeline
Related Vulnerabilities
CVE-2025-59528 10.0 Flowise: Unauthenticated RCE via MCP config injection
Same attack type: Supply Chain CVE-2024-2912 10.0 BentoML: RCE via insecure deserialization (CVSS 10)
Same attack type: Supply Chain CVE-2023-3765 10.0 MLflow: path traversal allows arbitrary file read
Same attack type: Supply Chain CVE-2025-5120 10.0 smolagents: sandbox escape enables unauthenticated RCE
Same attack type: Supply Chain CVE-2026-21858 10.0 n8n: Input Validation flaw enables exploitation
Same attack type: Code Execution