Skip to main content

JupyterLab EUVDEUVD-2026-89338

| CVE-2026-102831 HIGH
Cross-site Scripting (XSS) (CWE-79)
2026-09-29 security-advisories@github.com GHSA-6966-vjj6-99xv
8.1
CVSS 3.1 · Vendor: github
View

Attack ChainAIDerived

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

  1. Access
    Craft cell JSON with trusted HTML script output
  2. Delivery
    Deliver to victim's system clipboard
  3. Exploit
    Victim pastes cell in JupyterLab
  4. Execution
    Sanitization bypassed, script runs in authenticated origin
  5. Impact
    Execute code / exfiltrate in JupyterLab session

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires a specific non-default configuration: useSystemClipboardForCells must be active AND pasteCodeCellsWithoutOutput must be disabled. Under those settings the system-clipboard cell-paste path accepts attacker-controlled cell JSON without clearing metadata.trusted, so a pasted code cell can mark its HTML output as trusted, bypass output sanitization, and execute script in the authenticated JupyterLab origin - notably without executing the cell. Limiting factors: the victim must paste attacker-supplied clipboard content (UI:R), only code cells are affected (Markdown and raw cells are sanitized and immune), and the two-part non-default config gate meaningfully narrows real-world exposure below the raw 8.1 CVSS.

Impact

This is a network-exploitable stored/DOM XSS (CWE-79) in JupyterLab with a vendor CVSS 3.1 of 8.1 (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N). The vector requires user interaction (UI:R - the victim must paste attacker-supplied content) but no privileges (PR:N) to stage the malicious clipboard payload. There is no public exploitation intelligence in the input: no EPSS score was supplied, the CVE is not in CISA KEV, and no standalone POC is referenced - the exploitation status is therefore 'no public exploit identified at time of analysis.' Note, however, that the fix commit (1a10a7da) ships a Jest regression test that fully demonstrates the technique (a code cell whose trusted HTML output runs window.__clipboardTrustPoc=1 via <script>), so the exploit mechanics are publicly documented even absent a weaponized tool. The high CVSS is tempered by two real limiters: exploitation depends on a NON-DEFAULT configuration (useSystemClipboardForCells active AND pasteCodeCellsWithoutOutput disabled) and on the victim performing a paste. This is a credible but conditional issue - real priority for environments that enable system-clipboard cell sharing, lower for default deployments. No signals conflict; the CVSS network vector and the description (clipboard paste in the browser) are consistent.

Exploit ScenarioDerived

An attacker crafts cell JSON containing a code cell whose HTML output includes a script payload and sets metadata.trusted, then delivers it so the victim copies it to the system clipboard (e.g., via a shared notebook snippet or a web page). In a JupyterLab instance where useSystemClipboardForCells is enabled and pasteCodeCellsWithoutOutput is disabled, the victim pastes the cell and the trusted-marked HTML bypasses output sanitization, executing script in the authenticated JupyterLab origin without the cell ever being run. The fix commit's regression test demonstrates the exact technique, though no standalone public exploit tool is referenced.

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 29, 2026

Pasting a crafted code cell from the system clipboard into JupyterLab 4.5.0 through 4.5.10 allows attacker-controlled script to run in the authenticated JupyterLab origin without the victim ever executing the cell, because the paste path fails to clear metadata.trusted and therefore bypasses HTML output sanitization (CWE-79 XSS, CVSS 8.1). The flaw is network-reachable and unauthenticated per the CVSS vector (PR:N), but it requires user interaction - the victim must paste attacker-supplied clipboard content - and it only triggers under the non-default combination of useSystemClipboardForCells enabled with pasteCodeCellsWithoutOutput disabled; Markdown and raw cells are sanitized and unaffected. An equivalent issue affects Notebook 7.5.0 through 7.6.2 and JupyterLite Core 0.7.0 through 0.8.3; no public exploit code or confirmed active exploitation was identified at time of analysis, and vendor fixes ship in JupyterLab 4.5.11 / 4.6.4, Notebook 7.6.3, and JupyterLite Core 0.8.4.

RemediationAI

Vendor-released patch: upgrade to JupyterLab 4.5.11 or 4.6.4 (respectively for the 4.5.x and 4.6.x lines), Notebook 7.6.3, and JupyterLite Core 0.8.4 - see https://github.com/jupyterlab/jupyterlab/security/advisories/GHSA-6966-vjj6-99xv and the release notes at https://github.com/jupyterlab/jupyterlab/releases/tag/v4.5.11 and https://github.com/jupyterlab/jupyterlab/releases/tag/v4.6.4. If patching cannot be done immediately, the most direct compensating control is to clear the 'useSystemClipboardForCells' option (or set it to false) so the application uses its internal clipboard that carries authenticated provenance; the trade-off is that very large cell payloads and cross-application copy/paste of cells will no longer work as smoothly, and users copying between two JupyterLab instances in different browsers must fall back to the internal buffer. An alternative is to re-enable 'pasteCodeCellsWithoutOutput' so pasted code cells have their outputs stripped, which neutralizes the injectable HTML but sacrifices output fidelity when pasting and can be surprising to users who expect outputs to travel with cells. Because the vulnerable path executes script in the authenticated JupyterLab origin without any cell execution, organizations that cannot apply either workaround should treat JupyterLab as untrusted-user software: restrict network access to the server, avoid multi-user deployments where one user can social-engineer a paste or influence another user's clipboard, and treat any session cookie or API token reachable from the JupyterLab origin as compromised if a suspicious paste is suspected. Note that the upstream commits in jupyterlab/apputils and jupyterlab/notebook constitute the fix itself; the tagged releases listed above are the confirmed patched versions.

Affected VersionsENISA

jupyterlite-core 0.7.0, < 0.8.4
jupyterlab 4.6.0, < 4.6.4
jupyterlab 4.5.0, < 4.5.11
notebook 7.5.0, < 7.6.3

Affected Packages

pypi jupyterlab fix: 4.5.11, 4.6.4
pypi jupyterlite fix: 0.8.4
pypi jupyterlite-core fix: 0.8.4
pypi notebook fix: 7.6.3

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 4 packages in pypi

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

Technical ContextAI · show details

JupyterLab (and Notebook 7, plus JupyterLite Core) uses a cell-level trust model: code cell outputs carrying metadata.trusted = true are rendered as-is, while untrusted outputs are passed through HTML sanitization before being injected into the DOM. Content arriving over the system clipboard is serialized as plain text under the Jupyter cell MIME type ('application/vnd.jupyter.cells'), which means it carries no authenticated provenance - yet the pre-fix paste implementation in packages/notebook/src/actions.tsx forwarded the deserialized cell objects, including their metadata, straight into the notebook. An attacker who seeds the victim's clipboard with a crafted cell JSON containing a text/html output (display_data or execute_result) and metadata.trusted = true therefore gets unsanitized HTML rendered in the trusted origin as soon as the user pastes, with no cell execution required. This is a classic CWE-79 improper-neutralization-of-input-during-web-page-generation issue: the trust attribute is taken from attacker-controlled input rather than from a trusted channel. The upstream fix adds SystemClipboard.matchesLastWrite() in packages/apputils/src/clipboard.ts, which tracks the last value the application itself wrote per MIME type, and Private.untrustSystemClipboardCells() in packages/notebook/src/actions.tsx, which deep-copies pasted cells and forces metadata.trusted = false for code cells (deleting it for other cell types) whenever the clipboard content did not originate from this application. Separate copies of the values are kept for the cells actually inserted and for clipboard-interaction bookkeeping, so the stripping cannot be bypassed through the interaction-recording path. Fix commits are 1a10a7da5ff655849b21581c2633b46483ae0be9, 7f9f29e29e0c83fb17b0f11da57d06b3c6a40d96, and cf6e89a8d315c4134cefa50c220bca296da466a7.

Know when JavaScript 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 (github) PRIMARY 8.1 HIGH
AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
vuln.today AI 8.1 HIGH

Attacker needs no privileges to stage the payload (PR:N) but the victim must paste it (UI:R); script in the authenticated origin can read/modify notebooks and run kernel code, so C:H/I:H, no availability impact.

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

Primary rating from Vendor (github).

CVSS VectorVendor: github

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

Lifecycle Timeline

2
Patch available
Sep 29, 2026 - 20:04 EUVD
CVE Published
Sep 29, 2026 - 19:17 cve.org
HIGH 8.1

DescriptionCVE.org

JupyterLab is an extensible environment for interactive and reproducible computing, based on the Jupyter Notebook Architecture. From JupyterLab 4.5.0 until 4.5.11 and 4.6.4, from Notebook 7.5.0 until 7.6.3, and from JupyterLite Core 0.7.0 until 0.8.4, the system clipboard cell-paste path accepts attacker-controlled cell JSON without clearing metadata.trusted. When useSystemClipboardForCells is active and pasteCodeCellsWithoutOutput is disabled, a pasted code cell can mark HTML output as trusted, bypass output sanitization, and execute script in the authenticated JupyterLab origin without executing the cell. Markdown and raw cells are not affected because their output is sanitized. This issue is fixed in JupyterLab 4.5.11 and 4.6.4, Notebook 7.6.3, and JupyterLite Core 0.8.4.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 5 pypi packages depend on jupyterlab (2 direct, 3 indirect)

Ecosystem-wide dependent count for version 4.6.0.

Technical POC Analysis

CWE-79 (Improper Neutralization of Input During Web Page Generation / XSS); GitHub also assigns CWE-345 (Insufficient Verification of Data Authenticity) - the second class is the more accurate descri…

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

A high-severity flaw in JupyterLab (4.5.0-4.5.10), with equivalents in Notebook 7.5.0-7.6.2 and JupyterLite Core 0.7.0-0.8.3, allows attacker-supplied clipboard content to execute code in the user's authenticated JupyterLab session as soon as it is pasted into a notebook cell. Because the compromise occurs inside an authenticated analyst or data-science session, an attacker could potentially reach the same data, credentials, and connected systems that session is authorized to use, making this a potential stepping stone to broader data or cloud access. Exploitation requires a non-default clipboard configuration and a user paste action, so exposure is limited to environments matching those conditions, but no public exploit code or active exploitation has been identified at this time.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.2%
Top 92% exploitable
Prevalence
High
JupyterLab/Notebook is a very widely deployed interactive computing environment across data science
Threat Intel
1
1 source
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA Vendor GitHub

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

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

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

CVE-2026-102827 CRITICAL POC
9.8 Sep 29

Command injection in simple-git, the Node.js library for running git commands and published on npm, affects all releases

CVE-2026-77615 HIGH POC
8.7 Sep 17

Stored DOM-based cross-site scripting in Paella Player's closed-caption rendering path (paella-core before 2.12.11) allo

CVE-2026-92776 HIGH POC
8.6 Sep 16

Authorization bypass in Wiki.js through 2.5.314 allows an authenticated user who has been granted access to at least one

CVE-2026-102826 HIGH POC
8.1 Sep 29

Untrusted git configuration includes reachable through simple-git before 4.0.0 let an attacker execute arbitrary command

CVE-2026-85715 HIGH POC
7.5 Sep 17

Improper memory allocation control in ExifReader before 4.41.1 allows remote attackers to exhaust heap memory and termin

CVE-2026-102278 HIGH POC
7.5 Sep 28

Deeply nested brace patterns cause unbounded recursion in the npm brace-expansion library, exhausting the native stack a

CVE-2026-102276 HIGH POC
7.5 Sep 28

Stack exhaustion in the npm library brace-expansion (all versions prior to 1.1.19, 2.1.5, 3.0.7, and 5.0.10) lets a craf

CVE-2026-92775 HIGH POC
7.1 Sep 16

Server-side request forgery in Wiki.js through 2.5.314 lets an authenticated user who holds page-editing permissions for

CVE-2026-101910 MEDIUM POC
6.9 Sep 28

The JavaScript library ip-address (npm) fails to treat the NAT64 local-use prefix 64:ff9b:1::/48 as private, so applicat

CVE-2026-101914 MEDIUM POC
6.5 Sep 28

Authorization bypass in the @grpc/grpc-js-xds package (the xDS/RBAC extension for @grpc/grpc-js) lets a request for one

CVE-2026-101912 MEDIUM POC
6.3 Sep 28

Cross-family subnet comparisons in the ip-address npm library (all versions before 10.7.1) can cause isInSubnet and isHo

CVE-2026-101911 MEDIUM POC
6.3 Sep 28

Denial of service in the ip-address JavaScript/npm library (all versions prior to 10.7.1) lets remote attackers stall or

Vendor StatusVendor

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