Skip to main content

JupyterLab EUVDEUVD-2026-89459

| CVE-2026-102904 MEDIUM
Improper Neutralization of Argument Delimiters in a Command ('Argument Injection') (CWE-88)
2026-09-29 GitHub_M GHSA-3325-v43h-43rv
5.4
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Authenticate with extension API access
  2. Delivery
    Call PyPI extension uninstall endpoint
  3. Exploit
    Inject pip option-like name (-r/--requirement/--log)
  4. Execution
    pip reads local file or fetches internal URL
  5. Impact
    Reflected parse error leaks first line/response

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Argument sanitization
Exploitation Conditions

Exploitation requires ALL of: (1) the PyPI Extension Manager is enabled; (2) the attacker is an authenticated account that can call the extension API (PR:L); and (3) kernels and terminals are disabled or delegated to remote hosts - because otherwise the same user could already read files and make outbound requests directly, nullifying any escalation. The concrete injection vectors are pip option-like uninstall names: a requirements option (-r / --requirement=) to make the server read a local file or fetch an internal URL with content reflected via parse errors, or a --log option to create/corrupt a chosen path with pip-generated log text. Limiting factors: authentication is mandatory (not remote-unauthenticated), no arbitrary file content or arbitrary disclosed line can be chosen, and there is no code execution or availability impact beyond ordinary package removal.

Impact

This is a genuine but moderate-severity issue best characterized as argument (parameter) injection (CWE-88), not remote code execution despite the 'RCE' tag. The vendor CVSS3.1 vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N (5.4) is consistent with the description: an authenticated (PR:L) user with extension-API access injects pip option-like arguments into the uninstall path, yielding limited file read / internal-URL fetch (C:L) and limited path create/corrupt via pip logs (I:L), with no availability impact (A:N). No EPSS score, no CISA KEV listing, and no public exploit code are provided in the input, so exploitation status is 'no public exploit identified at time of analysis.' Critically, the vendor itself scopes the real impact narrowly: the security benefit only exists when kernels and terminals are disabled or delegated to remote hosts - otherwise an authenticated user can already read files and make outbound requests directly, making this a no-op escalation. There is no signal conflict between CVSS and description; both point to a constrained, authenticated, conditionally-exploitable flaw. Net assessment: a real defense-in-depth fix worth patching, but not an urgent widespread-exploitation priority. The 'RCE' tag overstates impact - the description explicitly states the injection 'does not add code execution or availability impact.'

Exploit ScenarioDerived

In a locked-down JupyterHub-style deployment where kernels and terminals are disabled but the PyPI Extension Manager is left enabled, an authenticated low-privilege user calls the extension uninstall API and supplies an option-like extension name such as '-r/tmp/secret' or '--requirement=http://169.254.169.254/latest/meta-data/'. Because uninstall names were passed to 'python -m pip uninstall' without option validation, pip reads the local file or fetches the internal URL, and reflected parse errors return the first unparsable line or response content back to the attacker; a pip log option can also create/corrupt a chosen path. No public POC is referenced, though the fix commit and its regression tests demonstrate the exact malicious inputs.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.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

Argument injection in JupyterLab's PyPI Extension Manager (JupyterLab 4.0.0 through 4.5.10 and the 4.6.x branch before 4.6.4) lets an authenticated account with extension API access submit pip option-like uninstall names - such as '-r/--requirement=' or '--log' - that are forwarded to 'python -m pip uninstall' without sanitization, causing the server to read a local file or fetch an internal URL (with content partially reflected through parse errors) or to create/corrupt a chosen path with pip-generated log text. Exploitation is highly conditional: the PyPI Extension Manager must be enabled, the attacker must be an authenticated user able to call the extension API (PR:L per the CVSS vector), and kernels and terminals must be disabled or delegated to remote hosts - otherwise that same user could already read files and make outbound requests directly. Note that despite the 'RCE' tag on this record, this is parameter injection (CWE-88) with only low confidentiality and integrity impact (CVSS 5.4) and no code execution; no public exploit code has been identified at time of analysis, and there is no CISA KEV confirmation of active exploitation.

RemediationAI

Vendor-released patch: upgrade JupyterLab to 4.5.11 or 4.6.4 (or a later release on the applicable branch), which adds the is_uninstall_allowed() validation hook, returns HTTP 422 for rejected uninstall names, and inserts a '--' option terminator before the package name in the pip invocation - see the advisory https://github.com/jupyterlab/jupyterlab/security/advisories/GHSA-3325-v43h-43rv 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 immediate upgrading is not possible, the most effective compensating control is to remove the exposure entirely by disabling the PyPI Extension Manager (configure a read-only or non-PyPI extension manager, or remove the extension-manager extension via page config) - the trade-off is that users lose in-browser package install/uninstall and must manage extensions from the command line. Alternatively, restrict the extension manager API route (lab/api/extensions) at the reverse proxy or Jupyter Server authorization layer so that only fully trusted administrators can POST uninstall requests; since the vector is PR:L, any authenticated user with extension API access is otherwise a potential source. Note that patching the underlying pip call to use the '--' delimiter (as upstream did) is the only mitigation that preserves functionality without validation changes, and generic network controls (egress filtering) only partially reduce the internal-URL fetch variant while doing nothing for the local-file read or pip-log write variants. As a hygiene measure, ensure the extension API is not exposed to untrusted multi-user audiences in shared JupyterHub deployments, where authenticated users commonly satisfy the PR:L prerequisite.

Affected VersionsENISA

jupyterlab 4.6.0, < 4.6.4
jupyterlab 4.0.0, < 4.5.11

Affected Packages

pypi jupyterlab fix: 4.5.11, 4.6.4

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 root cause is CWE-88 (Improper Neutralization of Argument Delimiters in a Command / 'Argument Injection'). JupyterLab's extension manager handler (jupyterlab/handlers/extension_manager_handler.py, ExtensionHandler.post) previously validated extension names for the install path - PyPIExtensionManager.is_install_allowed applied packaging.utils.canonicalize_name(name, validate=True) - but for the uninstall path it passed the caller-supplied name straight into PyPIExtensionManager.uninstall and then into a subprocess invocation of 'python -m pip uninstall <name>'. Because no validation and no '--' end-of-options delimiter were applied, a name beginning with a dash is interpreted by pip as an option rather than a package: '-r <file>' / '--requirement=<file>' makes pip read a requirements file, which on parse failure is reflected back in the HTTP error, disclosing the first unparsable line or a snippet of an internal HTTP response; '--log <path>' makes pip write its own log text to an attacker-chosen path, allowing file creation or corruption. The upstream fix introduces an is_uninstall_allowed() hook on the manager base class, implements PyPIExtensionManager.is_uninstall_allowed() using the same _is_valid_package_name() helper (rejecting names such as '-r/tmp/requirements.txt', '-rrequirements.txt', '--requirement=/tmp/requirements.txt' and '--help'), returns an HTTP 422 from ExtensionHandler.post when the check fails, and inserts a '--' separator before the package name in the pip command. Affected CPE: cpe:2.3:a:jupyterlab:jupyterlab:*:*:*:*:*:*:*:*, spanning all JupyterLab 4.x releases before the fixed versions. The impact ceiling is deliberately bounded: the requester cannot choose an arbitrary disclosed line or arbitrary file content, and package removal itself is the only availability effect - the injection adds no code execution and no availability impact beyond ordinary uninstall.

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

Vendor (GitHub_M) PRIMARY 5.4 MEDIUM
AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N
vuln.today AI 5.4 MEDIUM

Authenticated extension-API user (PR:L) over the network (AV:N), low complexity (AC:L); limited file/SSRF read (C:L) and constrained path corruption (I:L), no availability impact (A:N).

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

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

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

Lifecycle Timeline

2
Patch available
Sep 29, 2026 - 22:19 EUVD
CVE Published
Sep 29, 2026 - 20:47 cve.org
MEDIUM 5.4

DescriptionCVE.org

JupyterLab is an extensible environment for interactive and reproducible computing, based on the Jupyter Notebook Architecture. From JupyterLab 4.0.0 until 4.5.11 and 4.6.4, the PyPI Extension Manager uninstall request reaches ExtensionHandler.post, which validates extension names for installation but passes uninstall names to PyPIExtensionManager.uninstall and python -m pip uninstall without rejecting option-like values. The security impact requires that the PyPI Extension Manager is enabled, the account can call the extension API, and kernels and terminals are disabled or delegated to remote hosts; otherwise the user can already read files and make outbound requests directly. An authenticated user with extension API access can supply a pip requirements option to make the server read a local file or fetch an internal URL, and reflected parse errors can return the first unparsable line or response content. A pip log option can also create or corrupt a chosen path with pip-generated log text, but the requester cannot select an arbitrary disclosed line or arbitrary file content, and the injection does not add code execution or availability impact beyond ordinary package removal. This issue is fixed in JupyterLab 4.5.11 and 4.6.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.

Threat Intelligence Overview

EPSS Score
0.2%
Top 90% exploitable
Prevalence
High
JupyterLab is a very widely deployed interactive computing environment across data-science and enterprise
Threat Intel
1
1 sources
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 MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.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· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
High
Technical Impact
Partial

Priority Score

27
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +27
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0
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-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-2024-22421 MEDIUM
6.5 Jan 19

JupyterLab is an extensible environment for interactive and reproducible computing, based on the Jupyter Notebook and Ar

CVE-2024-43805 MEDIUM
6.1 Aug 28

jupyterlab is an extensible environment for interactive and reproducible computing, based on the Jupyter Notebook Archit

CVE-2024-22420 MEDIUM
6.1 Jan 19

JupyterLab is an extensible environment for interactive and reproducible computing, based on the Jupyter Notebook and Ar

CVE-2026-73627 MEDIUM
6.0 Aug 13

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

CVE-2026-67338 MEDIUM
5.1 Aug 01

Stored cross-site scripting in JupyterLab's Extension Manager allows an attacker who publishes a malicious PyPI package

CVE-2026-102832 MEDIUM
4.2 Oct 13

Improper trust attribution in JupyterLab's markdownviewer:trust and notebook:trust command-link handlers lets a Trust de

CVE-2025-59842 LOW
2.1 Sep 26

jupyterlab is an extensible environment for interactive and reproducible computing, based on the Jupyter Notebook Archit

CVE-2026-73626 HIGH
7.7 Aug 13

Allowlist/blocklist enforcement in JupyterLab's PyPIExtensionManager.install() was silently bypassed due to a missing 'a

Vendor StatusVendor

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