Repository navigation
Update dependency jupyterlab to v4 [SECURITY] - #93
Open
renovate[bot] wants to merge 1 commit into
Open
renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
renovate
Bot
force-pushed
the
renovate/pypi-jupyterlab-vulnerability
branch
from
August 29, 2024 23:58
04035f6 to
2b99e43
Compare
renovate
Bot
force-pushed
the
renovate/pypi-jupyterlab-vulnerability
branch
from
August 14, 2025 12:18
2b99e43 to
173cc3b
Compare
renovate
Bot
force-pushed
the
renovate/pypi-jupyterlab-vulnerability
branch
from
September 26, 2025 16:08
173cc3b to
c0c9e83
Compare
Contributor
Author
|
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
^3.0.0→^4.0.0JupyterLab vulnerable to potential authentication and CSRF tokens leak
CVE-2024-22421 / GHSA-44cc-43rp-5947
More information
Details
Impact
Users of JupyterLab who click on a malicious link may get their
AuthorizationandXSRFTokentokens exposed to a third party when running an olderjupyter-serverversion.Patches
JupyterLab 4.1.0b2, 4.0.11, and 3.6.7 were patched.
Workarounds
No workaround has been identified, however users should ensure to upgrade
jupyter-serverto version 2.7.2 or newer which includes a redirect vulnerability fix.References
Vulnerability reported by user @davwwwx via the bug bounty program sponsored by the European Commission and hosted on the Intigriti platform.
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:L/A:LReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
HTML injection in Jupyter Notebook and JupyterLab leading to DOM Clobbering
CVE-2024-43805 / GHSA-9q39-rmj3-p4r2
More information
Details
Impact
The vulnerability depends on user interaction by opening a malicious notebook with Markdown cells, or Markdown file using JupyterLab preview feature.
A malicious user can access any data that the attacked user has access to as well as perform arbitrary requests acting as the attacked user.
Patches
JupyterLab v3.6.8, v4.2.5 and Jupyter Notebook v7.2.2 were patched.
Workarounds
There is no workaround for the underlying DOM Clobbering susceptibility. However, select plugins can be disabled on deployments which cannot update in a timely fashion to minimise the risk. These are:
@jupyterlab/mathjax-extension:plugin- users will loose ability to preview mathematical equations@jupyterlab/markdownviewer-extension:plugin- users will loose ability to open Markdown previews@jupyterlab/mathjax2-extension:plugin(if installed with optionaljupyterlab-mathjax2package) - an older version of the mathjax plugin for JupyterLab 4.xTo disable these extensions run:
To confirm that the plugins were disabled run:
References
None
Notes
This change has a potential to break rendering of some markdown. There is a setting in Sanitizer which allows to revert to the previous sanitizer settings (
allowNamedProperties).Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:L/VA:L/SC:N/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
JupyterLab LaTeX typesetter links did not enforce
noopenerattributeCVE-2025-59842 / GHSA-vvfj-2jqx-52jm
More information
Details
Links generated with LaTeX typesetters in Markdown files and Markdown cells in JupyterLab and Jupyter Notebook did not include the
noopenerattribute.This is deemed to have no impact on the default installations. Theoretically users of third-party LaTeX-rendering extensions could find themselves vulnerable to reverse tabnabbing attacks if:
target=_blank(no such extensions are known at time of writing) andFor consistency with handling on other links, new versions of JupyterLab will enforce
noopenerandtarget=_blankon all links generated by typesetters. The former will harden the resilience of JupyterLab to extensions with lack of secure defaults in link rendering, and the latter will improve user experience by preventing accidental state loss when clicking on links rendered by LaTeX typesetters.Impact
Since the official LaTeX typesetter extensions for JupyterLab:
jupyterlab-mathjax(default),jupyterlab-mathjax2andjupyterlab-katexdo not include thetarget=_blank, there is no impact for JupyterLab users.Patches
JupyterLab 4.4.8
Workarounds
No workarounds are necessary.
References
None
Severity
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:A/VC:L/VI:N/VA:N/SC:N/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Jupyter Notebook Vulnerable to Authentication Token Theft via CommandLinker XSS
CVE-2026-40171 / GHSA-rch3-82jr-f9w9
More information
Details
Impact
A stored Cross-Site Scripting (XSS) vulnerability in Jupyter Notebook allows attackers to steal authentication tokens from users who open malicious notebook files and interact with elements that the attacker can make look indistinguishable from legitimate controls (single click interaction).
The vulnerability enables complete account takeover through the Jupyter REST API, allowing the attacker to:
Patches
Jupyter Notebook 7.5.6 and JupyterLab 4.5.7 include patches for this vulnerability.
Workarounds
The help extension can be disabled via CLI:
Hardening
The patched versions include a toggle to disable the command linker functionality altogether, for example via
overrides.json:{ "@jupyterlab/apputils-extension:sanitizer": { "allowCommandLinker": false } }Resources
Acknowledgments
Reported by Daniel Teixeira - NVIDIA AI Red Team
Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
JupyterLab's command linker attributes in HTML enable one-click command execution from untrusted content
CVE-2026-42557 / GHSA-mqcg-5x36-vfcg
More information
Details
JupyterLab's HTML sanitizer allowlists
data-commandlinker-commandanddata-commandlinker-argsonbuttonelements, whileCommandLinkerlistens for all click events ondocument.bodyand executes the named command without checking whether the element came from trusted JupyterLab UI. A notebook with a pre-saved HTML cell output containing a deceptive button can trigger arbitrary JupyterLab commands - including arbitrary code execution - on a single user click, without any code being submitted for execution by the user.Impact
An attacker who shares a notebook or a Markdown file - via email, GitHub, or a Binder link - can invoke an arbitrary command upon a single click by the victim. The button can be rendered inside the output area and be visually indistinguishable from a legitimate widget. No kernel needs to start; the HTML output is stored in the notebook file and displayed immediately on open.
Single-click impact
An attacker convincing the victim to click on a single button or link can:
The arbitrary code execution will be immediately visible to the user; and can be halted by the timely user intervention. The deletion of files can be silent and go unnoticed for some time.
Multi-click attacks
An attacker who convinces the victim to click on multiple buttons in specific order and to grant access to clipboard (or in scenarios where the user already granted keyboard access) can obtain full access to the terminal and execute arbitrary commands in the environment with access scope that might exceed that of available kernels. Only users of Chromium-based browsers are susceptible to this expanded variant of the attack.
The execution of commands in the terminal would be immediately visible to the user.
Impact of third-party extensions
The impact described above assumes a plain JupyterLab/Notebook installation. In environments with frontend extensions that contribute additional commands the attack surface is increased by the functionality covered by these commands.
Patches
JupyterLab 4.5.7
Workarounds
No workarounds are available for end-users.
Downstream applications inheriting from
JupyterFrontEndorJupyterLabcan effectively disable theCommandLinkerby passingcommandLinker: new CommandLinker({ commands: new CommandRegistry() })option in the initialization options.Hardening
The patched versions include a toggle to disable the command linker functionality altogether, for example via
overrides.json:{ "@jupyterlab/apputils-extension:sanitizer": { "allowCommandLinker": false } }Resources
Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
JupyterLab: Stored XSS in extension manager through package metadata unsanitized URI protocol
GHSA-vmhf-c436-hxj4
More information
Details
A malicious PyPI package can place a
javascript:URL in its[project.urls]metadata. JupyterLab's Extension Manager renders this as the extension's home-page link without validating the protocol, so a user who clicks the extension name executes attacker-controlled JavaScript in the JupyterLab origin.Details
One of the PyPI package's URL (jupyterlab/extensions/pypi.py) is copied straight into the
homepage_urlrendered by the frontend in packages/extensionmanager/src/widget.tsx#L77-L88.Impact
An attacker needs to publish a package to PyPI (no access to the target). When the package appears in a victim's extension manager list and the victim clicks the extension name, the payload runs in the JupyterLab origin.
Preconditions: Extension Manager enabled with the default PyPI source, the malicious package appears in the victim's list/search results.
Patches
Patched in 4.5.9, commits 4e61e07 and d5d961f
Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:N/VA:N/SC:L/SI:L/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
JupyterLab: Cross-site scripting (XSS) via crafted settings file (
overrides.json)CVE-2026-73417 / GHSA-pppj-hq3g-57pj
More information
Details
JupyterLab 4.5+ allows notebook settings to be shared and applied through an
overrides.jsonfile using theImportbutton in the Settings Editor.Certain notebook display settings were not properly validated before being applied. As a result, a crafted settings file could contain hidden instructions that run as code inside JupyterLab when imported, instead of only changing a display preference.
Because importing a settings file appears harmless, a user could import a file shared by another party without realizing it could do more. On multi-tenant file systems without proper permission control, another user could plant a malicious
overrides.json.Impact
When a malicious settings file is applied, the embedded code runs with the same access as the affected user. This could allow an attacker to read or modify that user's notebooks and files, and to run code on the user's behalf through the notebook server, including on any connected kernel.
User Interaction vs Privileges Required
Write access to a loaded settings location
If an attacker can write to a directory JupyterLab loads settings from (e.g. on shared or multi-tenant file system), they could place a crafted
overrides.jsonthat is applied to another user automatically at startup. This requires high privilages but no action by the victim.User-imported settings file
A user can import a crafted
overrides.jsonthrough theImportbutton in the Settings Editor, having received it from another party. This requires no privileges but a deliberate action by the victim, who reasonably expects a settings file to change preferences rather than run code.Patches
JupyterLab 4.6.2 and 4.5.10 were patched.
Workarounds
None
Hardening
overrides.json(or other configuration) readable by another user. A settings file in these locations is applied automatically, without an import step, so directory permissions are the primary control against cross-user tampering.Severity
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:L/SC:N/SI:N/SA:LReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
JupyterLab: Allowlist/blocklist check in
PyPIExtensionManager.install()not enforced for direct callers (missingawait)GHSA-whvh-wf3x-g77j
More information
Details
The extension allowlist/blocklist check inside
PyPIExtensionManager.install()was not enforced due to a missing await. For purposes of JupyterLab this was a secondary defense-in-depth check:install()was intended to enforce the allowlist/blocklist itself for any future uses and users calling this method directly (in addition to the separate check handling requests arriving through the HTTP API). The only runtime symptom was aRuntimeWarning: coroutine 'is_install_allowed' was never awaited.This has security implications only for deployments that combine all of the following:
PyPIExtensionManagerand callsinstall()directly with a package name influenced by untrusted user input (the stock JupyterLab HTTP handler is not affected - it performs its own awaited allowlist check before callinginstall());install()call is the only available package-install vector (otherwise a user with kernel access can install packages directly regardless of this check)Impact
Low. No exposure for stock JupyterLab: the HTTP API and Extension Manager UI enforce the listing through a separate, correctly awaited check. The gap affected only custom extensions or downstream integrations that called the public
install()method directly and relied on it to self-enforce.Patches
JupyterLab
v4.6.2andv4.5.10contain the patch.Users of applications that depend on JupyterLab, such as Notebook v7+, should update
jupyterlabpackage too.Workarounds
No action is required for deployments that only expose extension management through the JupyterLab HTTP API / Extension Manager UI, as that path was already enforcing the listing via the handler's own check. Deployments wanting to disable programmatic extension installation entirely can switch to the read-only extension manager:
or the following traitlet:
You can confirm that the read-only manager is in use from GUI:
Severity
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
JupyterLab: Image viewer allows XSS when opening malicious image in new browser tab
CVE-2026-73415 / GHSA-gx64-gj6p-pc4c
More information
Details
JupyterLab's image viewer allows for cross-site scripting (XSS) when a specially-crafted image file is opened through the image viewer and then opened in a new tab. This XSS issue can be used to cause remote code execution (RCE) on the JupyterLab server.
Impact
This vulnerability allows for arbitrary code execution.
Patches
JupyterLab
v4.6.2andv4.5.10contain the patch.Workarounds
Disable the image viewer plugin:
Confirm with:
Severity
CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:A/VC:H/VI:H/VA:L/SC:N/SI:N/SA:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
CVE-2026-102830 / GHSA-3jqq-pw4j-pqcj
More information
Details
Description
A language pack ships a
Plural-Formsheader saying how the language counts, for examplenplurals=2; plural=(n != 1);. JupyterLab turns that string into a function withnew Function, so the header gets executed. The check that meant to keep it safe was a regular expression. The regex was anchored at the start but not at the end, so it accepted any string that began with a valid plural rule and ignored everything after it.A header such as the following passed the check, and the part after the plural rule ran in the JupyterLab page as soon as the first plural string was translated:
Users are affected if all of the following are true:
An installation using the default English locale loads no catalogue and is not affected.
Impact
The code in the header ran in the JupyterLab page, in the same origin and session as the authenticated user. It could call the Jupyter Server REST API as that user: read and write any file under the server root, start a kernel and run code in it, and open a terminal where terminals are enabled. Nothing had to be clicked; translating one plural string was enough, and that happens during normal use of the interface.
What this changes is who has to be trusted. A language pack is a Python package, and installing one is already a privileged act, so an attacker who can get any package installed has server-side code execution regardless of this issue. The header is different because it is catalogue metadata: it travels with translation content, through the translation pipeline that carries strings from Crowdin into the language packs, and it is reviewed as text rather than as code. Anyone able to change a catalogue, or to publish a pack under a name someone installs, got JavaScript execution in every browser that selected that language.
Note: the impact is much more limited on JupyterLite which typically does not have access to most of the surfaces that this flaw exposes.
Patches
JupyterLab
v4.6.4andv4.5.11contain the patch. The check now has to match the whole header, so a plural rule followed by anything else is rejected and no function is built from it.JupyterLab 3.x reached end of life and receives no patch. Its users should move to a supported 4.x release.
Users of applications that depend on JupyterLab, such as Notebook v7+, should update
jupyterlabpackage too.Workarounds
Use the English locale, which loads no catalogue:
or the following traitlet:
Everyone then sees the interface in English, whatever language they had selected.
To check what is installed instead of switching, report any pack whose header carries more than a plural rule:
The command prints nothing when every catalogue is sound. A line of output names the pack to remove.
Severity
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
jupyterlab/jupyterlab (jupyterlab)
v4.5.11Compare Source
4.5.11
(Full Changelog)
Security fixes
Bugs fixed
Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See our definition of contributors.
(GitHub contributors page for this release)
@krassowski (activity) | @MUFFANUJ (activity)
v4.5.10Compare Source
4.5.10
(Full Changelog)
Security patches
Bugs fixed
4.5.xbranch #19186 (@krassowski, @MUFFANUJ)Maintenance and upkeep improvements
Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See our definition of contributors.
(GitHub contributors page for this release)
@krassowski (activity) | @MUFFANUJ (activity)
v4.5.9Compare Source
4.5.9
(Full Changelog)
Bugs fixed
jupyter labextension buildcrash onwebpack ≥ 5.107#19021 (@Darshan808, @krassowski)homepage_url#19003 (@Yann-P)Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See our definition of contributors.
(GitHub contributors page for this release)
@arun-357 (activity) | @Darshan808 (activity) | @krassowski (activity) | @MUFFANUJ (activity) | @Yann-P (activity)
v4.5.8Compare Source
4.5.8
(Full Changelog)
Bugs fixed
getValue()throws #18938 (@AliMahmoudDev)packagingmin version pin #18910 (@krassowski)anchorfor prompt overlay #18840 (@CrafterKolyan)Maintenance and upkeep improvements
Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See our definition of contributors.
(GitHub contributors page for this release)
@AliMahmoudDev (activity) | @CrafterKolyan (activity) | @Darshan808 (activity) | @krassowski (activity)
v4.5.7Compare Source
4.5.7
(Full Changelog)
Security patches
Bugs fixed
Maintenance and upkeep improvements
4.5.xbranch #18817 (@krassowski).jp-VariableRenderer-TrustButtonCSS rule #18762 (@Carreau).jp-Cell-PlaceholderCSS rules #18761 (@Carreau)Documentation improvements
Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See our definition of contributors.
(GitHub contributors page for this release)
@Carreau (activity) | @filipeoliveira05 (activity) | @flaviomartins (activity) | @itsmejay80 (activity) | @jtpio (activity) | @krassowski (activity) | @martinRenou (activity) | @MUFFANUJ (activity) | @utsav-develops (activity)
v4.5.6Compare Source
4.5.6
(Full Changelog)
Bugs fixed
fullwindowing mode #18522 (@krassowski)gettextmethods #18597 (@tmetzl)filebrowser:searchcommand #18593 (@krassowski)filebrowser:create-new-filecontext menu selector #18588 (@jtpio)codeinput inCodeConsolewhen configured #18554 (@agriyakhetarpal)Maintenance and upkeep improvements
Contributors to this release
The following people contributed discussions, new ideas, code and documentation contributions, and review.
See our definition of contributors.
(GitHub contributors page for this release)
@agriyakhetarpal (activity) | @IsabelParedes (activity) | @jtpio (activity) | @krassowski (activity) | @soniya-malviy (activity) | @tmetzl (activity)
v4.5.5Compare Source
4.5.5
(Full Changelog)
Bugs fixed
@codemirror/view, fixing slow selection when line wrapping is enabled #18479 (@krassowski)Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.