jupyterlite-core
Wasm powered Jupyter running in the browser 💡
Activity
- Latest release
- 56m ago
- Total releases
- 107
- Cadence
- ~8 days
- Last 12 months
- 28
Reach
- Stars
- 4.9k
Details
- License
- custom
- First release
- Jan 17, 2023
| Version | Released | |
|---|---|---|
0.9.0b0
pre
| ||
0.8.6
patch
| ||
0.8.5
patch
| ||
0.9.0a2
pre
| ||
0.8.4
patch
| ||
0.8.3
patch
3 CVEs
CVE-2026-102832
GHSA-jwrc-gm9j-263p
Oct 15, 2026
JupyterLab: Command link trust prompt in JupyterLab can trust a document other than the one clicked
4.2
/ 10
Medium
Network
High
None
Required
Unchanged
Low
Low
None
DescriptionA Markdown file or a notebook output can carry a button that runs a JupyterLab command. Since 4.5.7 the first click on such a button opens a prompt naming the command, with Cancel, Run Once and Trust. Choosing Trust runs the command and marks the document trusted, so its later buttons run without a prompt. Which document gets marked is decided when the user answers, not when they click. Both trust commands read whichever document is current at that moment: Users are affected if all of the following are true:
ImpactThe user loses control over which document they trusted. Every button in the document that was (incorrectly) marked as trusted runs from then on without a prompt, so if that document also came from an untrusted source, its buttons fire on a single click with no confirmation. That is the state the prompt was added to prevent, in GHSA-mqcg-5x36-vfcg. The command that ran had the user's consent, because the prompt named it and they pressed Trust. The document they were reading stays untrusted, so it prompts again on the next click. Notebooks are written to diskWhen the document marked is a notebook, the effect outlives the browser session. A Markdown preview marked this way stays trusted only until it is closed. Nothing is written to disk. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsGiven the high complexity of a potential exploit, we advise treating this as a defense in-depth and update at earliest opportunity, rather than apply the workarounds listed below. However, for users running in highly sensitive environments who are unable to upgrade the workarounds are included below. Turn off command linker, which removes the ability to execute frontend commands altogether:
In such configuration the buttons in Markdown files and notebook outputs then do nothing when clicked. Documentation and extensions that use command links for navigation stop working, and the setting applies to every document, not only untrusted ones. If disabling that setting is not desirable and update is not possible, advise users to choose "Run Once" rather than "Trust". "Run Once" makes the command run but no document is marked, so nothing can be trusted in error. Affected versions
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 15, 2026 · Source: OSV.dev
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.8.2
patch
3 CVEs
CVE-2026-102832
GHSA-jwrc-gm9j-263p
Oct 15, 2026
JupyterLab: Command link trust prompt in JupyterLab can trust a document other than the one clicked
4.2
/ 10
Medium
Network
High
None
Required
Unchanged
Low
Low
None
DescriptionA Markdown file or a notebook output can carry a button that runs a JupyterLab command. Since 4.5.7 the first click on such a button opens a prompt naming the command, with Cancel, Run Once and Trust. Choosing Trust runs the command and marks the document trusted, so its later buttons run without a prompt. Which document gets marked is decided when the user answers, not when they click. Both trust commands read whichever document is current at that moment: Users are affected if all of the following are true:
ImpactThe user loses control over which document they trusted. Every button in the document that was (incorrectly) marked as trusted runs from then on without a prompt, so if that document also came from an untrusted source, its buttons fire on a single click with no confirmation. That is the state the prompt was added to prevent, in GHSA-mqcg-5x36-vfcg. The command that ran had the user's consent, because the prompt named it and they pressed Trust. The document they were reading stays untrusted, so it prompts again on the next click. Notebooks are written to diskWhen the document marked is a notebook, the effect outlives the browser session. A Markdown preview marked this way stays trusted only until it is closed. Nothing is written to disk. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsGiven the high complexity of a potential exploit, we advise treating this as a defense in-depth and update at earliest opportunity, rather than apply the workarounds listed below. However, for users running in highly sensitive environments who are unable to upgrade the workarounds are included below. Turn off command linker, which removes the ability to execute frontend commands altogether:
In such configuration the buttons in Markdown files and notebook outputs then do nothing when clicked. Documentation and extensions that use command links for navigation stop working, and the setting applies to every document, not only untrusted ones. If disabling that setting is not desirable and update is not possible, advise users to choose "Run Once" rather than "Trust". "Run Once" makes the command run but no document is marked, so nothing can be trusted in error. Affected versions
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 15, 2026 · Source: OSV.dev
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.9.0a1
pre
| ||
0.9.0a0
pre
| ||
0.8.1
patch
3 CVEs
CVE-2026-102832
GHSA-jwrc-gm9j-263p
Oct 15, 2026
JupyterLab: Command link trust prompt in JupyterLab can trust a document other than the one clicked
4.2
/ 10
Medium
Network
High
None
Required
Unchanged
Low
Low
None
DescriptionA Markdown file or a notebook output can carry a button that runs a JupyterLab command. Since 4.5.7 the first click on such a button opens a prompt naming the command, with Cancel, Run Once and Trust. Choosing Trust runs the command and marks the document trusted, so its later buttons run without a prompt. Which document gets marked is decided when the user answers, not when they click. Both trust commands read whichever document is current at that moment: Users are affected if all of the following are true:
ImpactThe user loses control over which document they trusted. Every button in the document that was (incorrectly) marked as trusted runs from then on without a prompt, so if that document also came from an untrusted source, its buttons fire on a single click with no confirmation. That is the state the prompt was added to prevent, in GHSA-mqcg-5x36-vfcg. The command that ran had the user's consent, because the prompt named it and they pressed Trust. The document they were reading stays untrusted, so it prompts again on the next click. Notebooks are written to diskWhen the document marked is a notebook, the effect outlives the browser session. A Markdown preview marked this way stays trusted only until it is closed. Nothing is written to disk. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsGiven the high complexity of a potential exploit, we advise treating this as a defense in-depth and update at earliest opportunity, rather than apply the workarounds listed below. However, for users running in highly sensitive environments who are unable to upgrade the workarounds are included below. Turn off command linker, which removes the ability to execute frontend commands altogether:
In such configuration the buttons in Markdown files and notebook outputs then do nothing when clicked. Documentation and extensions that use command links for navigation stop working, and the setting applies to every document, not only untrusted ones. If disabling that setting is not desirable and update is not possible, advise users to choose "Run Once" rather than "Trust". "Run Once" makes the command run but no document is marked, so nothing can be trusted in error. Affected versions
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 15, 2026 · Source: OSV.dev
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.8.0
minor
3 CVEs
CVE-2026-102832
GHSA-jwrc-gm9j-263p
Oct 15, 2026
JupyterLab: Command link trust prompt in JupyterLab can trust a document other than the one clicked
4.2
/ 10
Medium
Network
High
None
Required
Unchanged
Low
Low
None
DescriptionA Markdown file or a notebook output can carry a button that runs a JupyterLab command. Since 4.5.7 the first click on such a button opens a prompt naming the command, with Cancel, Run Once and Trust. Choosing Trust runs the command and marks the document trusted, so its later buttons run without a prompt. Which document gets marked is decided when the user answers, not when they click. Both trust commands read whichever document is current at that moment: Users are affected if all of the following are true:
ImpactThe user loses control over which document they trusted. Every button in the document that was (incorrectly) marked as trusted runs from then on without a prompt, so if that document also came from an untrusted source, its buttons fire on a single click with no confirmation. That is the state the prompt was added to prevent, in GHSA-mqcg-5x36-vfcg. The command that ran had the user's consent, because the prompt named it and they pressed Trust. The document they were reading stays untrusted, so it prompts again on the next click. Notebooks are written to diskWhen the document marked is a notebook, the effect outlives the browser session. A Markdown preview marked this way stays trusted only until it is closed. Nothing is written to disk. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsGiven the high complexity of a potential exploit, we advise treating this as a defense in-depth and update at earliest opportunity, rather than apply the workarounds listed below. However, for users running in highly sensitive environments who are unable to upgrade the workarounds are included below. Turn off command linker, which removes the ability to execute frontend commands altogether:
In such configuration the buttons in Markdown files and notebook outputs then do nothing when clicked. Documentation and extensions that use command links for navigation stop working, and the setting applies to every document, not only untrusted ones. If disabling that setting is not desirable and update is not possible, advise users to choose "Run Once" rather than "Trust". "Run Once" makes the command run but no document is marked, so nothing can be trusted in error. Affected versions
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 15, 2026 · Source: OSV.dev
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.8.0rc0
pre
3 CVEs
CVE-2026-102832
GHSA-jwrc-gm9j-263p
Oct 15, 2026
JupyterLab: Command link trust prompt in JupyterLab can trust a document other than the one clicked
4.2
/ 10
Medium
Network
High
None
Required
Unchanged
Low
Low
None
DescriptionA Markdown file or a notebook output can carry a button that runs a JupyterLab command. Since 4.5.7 the first click on such a button opens a prompt naming the command, with Cancel, Run Once and Trust. Choosing Trust runs the command and marks the document trusted, so its later buttons run without a prompt. Which document gets marked is decided when the user answers, not when they click. Both trust commands read whichever document is current at that moment: Users are affected if all of the following are true:
ImpactThe user loses control over which document they trusted. Every button in the document that was (incorrectly) marked as trusted runs from then on without a prompt, so if that document also came from an untrusted source, its buttons fire on a single click with no confirmation. That is the state the prompt was added to prevent, in GHSA-mqcg-5x36-vfcg. The command that ran had the user's consent, because the prompt named it and they pressed Trust. The document they were reading stays untrusted, so it prompts again on the next click. Notebooks are written to diskWhen the document marked is a notebook, the effect outlives the browser session. A Markdown preview marked this way stays trusted only until it is closed. Nothing is written to disk. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsGiven the high complexity of a potential exploit, we advise treating this as a defense in-depth and update at earliest opportunity, rather than apply the workarounds listed below. However, for users running in highly sensitive environments who are unable to upgrade the workarounds are included below. Turn off command linker, which removes the ability to execute frontend commands altogether:
In such configuration the buttons in Markdown files and notebook outputs then do nothing when clicked. Documentation and extensions that use command links for navigation stop working, and the setting applies to every document, not only untrusted ones. If disabling that setting is not desirable and update is not possible, advise users to choose "Run Once" rather than "Trust". "Run Once" makes the command run but no document is marked, so nothing can be trusted in error. Affected versions
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 15, 2026 · Source: OSV.dev
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.8.0b1
pre
3 CVEs
CVE-2026-102832
GHSA-jwrc-gm9j-263p
Oct 15, 2026
JupyterLab: Command link trust prompt in JupyterLab can trust a document other than the one clicked
4.2
/ 10
Medium
Network
High
None
Required
Unchanged
Low
Low
None
DescriptionA Markdown file or a notebook output can carry a button that runs a JupyterLab command. Since 4.5.7 the first click on such a button opens a prompt naming the command, with Cancel, Run Once and Trust. Choosing Trust runs the command and marks the document trusted, so its later buttons run without a prompt. Which document gets marked is decided when the user answers, not when they click. Both trust commands read whichever document is current at that moment: Users are affected if all of the following are true:
ImpactThe user loses control over which document they trusted. Every button in the document that was (incorrectly) marked as trusted runs from then on without a prompt, so if that document also came from an untrusted source, its buttons fire on a single click with no confirmation. That is the state the prompt was added to prevent, in GHSA-mqcg-5x36-vfcg. The command that ran had the user's consent, because the prompt named it and they pressed Trust. The document they were reading stays untrusted, so it prompts again on the next click. Notebooks are written to diskWhen the document marked is a notebook, the effect outlives the browser session. A Markdown preview marked this way stays trusted only until it is closed. Nothing is written to disk. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsGiven the high complexity of a potential exploit, we advise treating this as a defense in-depth and update at earliest opportunity, rather than apply the workarounds listed below. However, for users running in highly sensitive environments who are unable to upgrade the workarounds are included below. Turn off command linker, which removes the ability to execute frontend commands altogether:
In such configuration the buttons in Markdown files and notebook outputs then do nothing when clicked. Documentation and extensions that use command links for navigation stop working, and the setting applies to every document, not only untrusted ones. If disabling that setting is not desirable and update is not possible, advise users to choose "Run Once" rather than "Trust". "Run Once" makes the command run but no document is marked, so nothing can be trusted in error. Affected versions
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 15, 2026 · Source: OSV.dev
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.8.0b0
pre
3 CVEs
CVE-2026-102832
GHSA-jwrc-gm9j-263p
Oct 15, 2026
JupyterLab: Command link trust prompt in JupyterLab can trust a document other than the one clicked
4.2
/ 10
Medium
Network
High
None
Required
Unchanged
Low
Low
None
DescriptionA Markdown file or a notebook output can carry a button that runs a JupyterLab command. Since 4.5.7 the first click on such a button opens a prompt naming the command, with Cancel, Run Once and Trust. Choosing Trust runs the command and marks the document trusted, so its later buttons run without a prompt. Which document gets marked is decided when the user answers, not when they click. Both trust commands read whichever document is current at that moment: Users are affected if all of the following are true:
ImpactThe user loses control over which document they trusted. Every button in the document that was (incorrectly) marked as trusted runs from then on without a prompt, so if that document also came from an untrusted source, its buttons fire on a single click with no confirmation. That is the state the prompt was added to prevent, in GHSA-mqcg-5x36-vfcg. The command that ran had the user's consent, because the prompt named it and they pressed Trust. The document they were reading stays untrusted, so it prompts again on the next click. Notebooks are written to diskWhen the document marked is a notebook, the effect outlives the browser session. A Markdown preview marked this way stays trusted only until it is closed. Nothing is written to disk. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsGiven the high complexity of a potential exploit, we advise treating this as a defense in-depth and update at earliest opportunity, rather than apply the workarounds listed below. However, for users running in highly sensitive environments who are unable to upgrade the workarounds are included below. Turn off command linker, which removes the ability to execute frontend commands altogether:
In such configuration the buttons in Markdown files and notebook outputs then do nothing when clicked. Documentation and extensions that use command links for navigation stop working, and the setting applies to every document, not only untrusted ones. If disabling that setting is not desirable and update is not possible, advise users to choose "Run Once" rather than "Trust". "Run Once" makes the command run but no document is marked, so nothing can be trusted in error. Affected versions
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 15, 2026 · Source: OSV.dev
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.6
patch
3 CVEs
CVE-2026-102832
GHSA-jwrc-gm9j-263p
Oct 15, 2026
JupyterLab: Command link trust prompt in JupyterLab can trust a document other than the one clicked
4.2
/ 10
Medium
Network
High
None
Required
Unchanged
Low
Low
None
DescriptionA Markdown file or a notebook output can carry a button that runs a JupyterLab command. Since 4.5.7 the first click on such a button opens a prompt naming the command, with Cancel, Run Once and Trust. Choosing Trust runs the command and marks the document trusted, so its later buttons run without a prompt. Which document gets marked is decided when the user answers, not when they click. Both trust commands read whichever document is current at that moment: Users are affected if all of the following are true:
ImpactThe user loses control over which document they trusted. Every button in the document that was (incorrectly) marked as trusted runs from then on without a prompt, so if that document also came from an untrusted source, its buttons fire on a single click with no confirmation. That is the state the prompt was added to prevent, in GHSA-mqcg-5x36-vfcg. The command that ran had the user's consent, because the prompt named it and they pressed Trust. The document they were reading stays untrusted, so it prompts again on the next click. Notebooks are written to diskWhen the document marked is a notebook, the effect outlives the browser session. A Markdown preview marked this way stays trusted only until it is closed. Nothing is written to disk. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsGiven the high complexity of a potential exploit, we advise treating this as a defense in-depth and update at earliest opportunity, rather than apply the workarounds listed below. However, for users running in highly sensitive environments who are unable to upgrade the workarounds are included below. Turn off command linker, which removes the ability to execute frontend commands altogether:
In such configuration the buttons in Markdown files and notebook outputs then do nothing when clicked. Documentation and extensions that use command links for navigation stop working, and the setting applies to every document, not only untrusted ones. If disabling that setting is not desirable and update is not possible, advise users to choose "Run Once" rather than "Trust". "Run Once" makes the command run but no document is marked, so nothing can be trusted in error. Affected versions
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 15, 2026 · Source: OSV.dev
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.5
patch
3 CVEs
CVE-2026-102832
GHSA-jwrc-gm9j-263p
Oct 15, 2026
JupyterLab: Command link trust prompt in JupyterLab can trust a document other than the one clicked
4.2
/ 10
Medium
Network
High
None
Required
Unchanged
Low
Low
None
DescriptionA Markdown file or a notebook output can carry a button that runs a JupyterLab command. Since 4.5.7 the first click on such a button opens a prompt naming the command, with Cancel, Run Once and Trust. Choosing Trust runs the command and marks the document trusted, so its later buttons run without a prompt. Which document gets marked is decided when the user answers, not when they click. Both trust commands read whichever document is current at that moment: Users are affected if all of the following are true:
ImpactThe user loses control over which document they trusted. Every button in the document that was (incorrectly) marked as trusted runs from then on without a prompt, so if that document also came from an untrusted source, its buttons fire on a single click with no confirmation. That is the state the prompt was added to prevent, in GHSA-mqcg-5x36-vfcg. The command that ran had the user's consent, because the prompt named it and they pressed Trust. The document they were reading stays untrusted, so it prompts again on the next click. Notebooks are written to diskWhen the document marked is a notebook, the effect outlives the browser session. A Markdown preview marked this way stays trusted only until it is closed. Nothing is written to disk. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsGiven the high complexity of a potential exploit, we advise treating this as a defense in-depth and update at earliest opportunity, rather than apply the workarounds listed below. However, for users running in highly sensitive environments who are unable to upgrade the workarounds are included below. Turn off command linker, which removes the ability to execute frontend commands altogether:
In such configuration the buttons in Markdown files and notebook outputs then do nothing when clicked. Documentation and extensions that use command links for navigation stop working, and the setting applies to every document, not only untrusted ones. If disabling that setting is not desirable and update is not possible, advise users to choose "Run Once" rather than "Trust". "Run Once" makes the command run but no document is marked, so nothing can be trusted in error. Affected versions
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 15, 2026 · Source: OSV.dev
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.8.0a2
pre
3 CVEs
CVE-2026-102832
GHSA-jwrc-gm9j-263p
Oct 15, 2026
JupyterLab: Command link trust prompt in JupyterLab can trust a document other than the one clicked
4.2
/ 10
Medium
Network
High
None
Required
Unchanged
Low
Low
None
DescriptionA Markdown file or a notebook output can carry a button that runs a JupyterLab command. Since 4.5.7 the first click on such a button opens a prompt naming the command, with Cancel, Run Once and Trust. Choosing Trust runs the command and marks the document trusted, so its later buttons run without a prompt. Which document gets marked is decided when the user answers, not when they click. Both trust commands read whichever document is current at that moment: Users are affected if all of the following are true:
ImpactThe user loses control over which document they trusted. Every button in the document that was (incorrectly) marked as trusted runs from then on without a prompt, so if that document also came from an untrusted source, its buttons fire on a single click with no confirmation. That is the state the prompt was added to prevent, in GHSA-mqcg-5x36-vfcg. The command that ran had the user's consent, because the prompt named it and they pressed Trust. The document they were reading stays untrusted, so it prompts again on the next click. Notebooks are written to diskWhen the document marked is a notebook, the effect outlives the browser session. A Markdown preview marked this way stays trusted only until it is closed. Nothing is written to disk. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsGiven the high complexity of a potential exploit, we advise treating this as a defense in-depth and update at earliest opportunity, rather than apply the workarounds listed below. However, for users running in highly sensitive environments who are unable to upgrade the workarounds are included below. Turn off command linker, which removes the ability to execute frontend commands altogether:
In such configuration the buttons in Markdown files and notebook outputs then do nothing when clicked. Documentation and extensions that use command links for navigation stop working, and the setting applies to every document, not only untrusted ones. If disabling that setting is not desirable and update is not possible, advise users to choose "Run Once" rather than "Trust". "Run Once" makes the command run but no document is marked, so nothing can be trusted in error. Affected versions
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 15, 2026 · Source: OSV.dev
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.4
patch
2 CVEs
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.3
patch
2 CVEs
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.2
patch
2 CVEs
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.8.0a1
pre
3 CVEs
CVE-2026-102832
GHSA-jwrc-gm9j-263p
Oct 15, 2026
JupyterLab: Command link trust prompt in JupyterLab can trust a document other than the one clicked
4.2
/ 10
Medium
Network
High
None
Required
Unchanged
Low
Low
None
DescriptionA Markdown file or a notebook output can carry a button that runs a JupyterLab command. Since 4.5.7 the first click on such a button opens a prompt naming the command, with Cancel, Run Once and Trust. Choosing Trust runs the command and marks the document trusted, so its later buttons run without a prompt. Which document gets marked is decided when the user answers, not when they click. Both trust commands read whichever document is current at that moment: Users are affected if all of the following are true:
ImpactThe user loses control over which document they trusted. Every button in the document that was (incorrectly) marked as trusted runs from then on without a prompt, so if that document also came from an untrusted source, its buttons fire on a single click with no confirmation. That is the state the prompt was added to prevent, in GHSA-mqcg-5x36-vfcg. The command that ran had the user's consent, because the prompt named it and they pressed Trust. The document they were reading stays untrusted, so it prompts again on the next click. Notebooks are written to diskWhen the document marked is a notebook, the effect outlives the browser session. A Markdown preview marked this way stays trusted only until it is closed. Nothing is written to disk. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsGiven the high complexity of a potential exploit, we advise treating this as a defense in-depth and update at earliest opportunity, rather than apply the workarounds listed below. However, for users running in highly sensitive environments who are unable to upgrade the workarounds are included below. Turn off command linker, which removes the ability to execute frontend commands altogether:
In such configuration the buttons in Markdown files and notebook outputs then do nothing when clicked. Documentation and extensions that use command links for navigation stop working, and the setting applies to every document, not only untrusted ones. If disabling that setting is not desirable and update is not possible, advise users to choose "Run Once" rather than "Trust". "Run Once" makes the command run but no document is marked, so nothing can be trusted in error. Affected versions
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 15, 2026 · Source: OSV.dev
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.8.0a0
pre
3 CVEs
CVE-2026-102832
GHSA-jwrc-gm9j-263p
Oct 15, 2026
JupyterLab: Command link trust prompt in JupyterLab can trust a document other than the one clicked
4.2
/ 10
Medium
Network
High
None
Required
Unchanged
Low
Low
None
DescriptionA Markdown file or a notebook output can carry a button that runs a JupyterLab command. Since 4.5.7 the first click on such a button opens a prompt naming the command, with Cancel, Run Once and Trust. Choosing Trust runs the command and marks the document trusted, so its later buttons run without a prompt. Which document gets marked is decided when the user answers, not when they click. Both trust commands read whichever document is current at that moment: Users are affected if all of the following are true:
ImpactThe user loses control over which document they trusted. Every button in the document that was (incorrectly) marked as trusted runs from then on without a prompt, so if that document also came from an untrusted source, its buttons fire on a single click with no confirmation. That is the state the prompt was added to prevent, in GHSA-mqcg-5x36-vfcg. The command that ran had the user's consent, because the prompt named it and they pressed Trust. The document they were reading stays untrusted, so it prompts again on the next click. Notebooks are written to diskWhen the document marked is a notebook, the effect outlives the browser session. A Markdown preview marked this way stays trusted only until it is closed. Nothing is written to disk. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsGiven the high complexity of a potential exploit, we advise treating this as a defense in-depth and update at earliest opportunity, rather than apply the workarounds listed below. However, for users running in highly sensitive environments who are unable to upgrade the workarounds are included below. Turn off command linker, which removes the ability to execute frontend commands altogether:
In such configuration the buttons in Markdown files and notebook outputs then do nothing when clicked. Documentation and extensions that use command links for navigation stop working, and the setting applies to every document, not only untrusted ones. If disabling that setting is not desirable and update is not possible, advise users to choose "Run Once" rather than "Trust". "Run Once" makes the command run but no document is marked, so nothing can be trusted in error. Affected versions
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 15, 2026 · Source: OSV.dev
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.1
patch
2 CVEs
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0
minor
2 CVEs
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev
CVE-2026-102831
PYSEC-2026-4060
GHSA-6966-vjj6-99xv
PYSEC-2026-4057
PYSEC-2026-4058
PYSEC-2026-4112
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via notebook cells pasted from the system clipboard
8.1
/ 10
High
Network
Low
None
Required
Unchanged
High
High
None
DescriptionJupyterLab 4.5.0 enabled copying and pasing cells through the system clipboard. The paste path parses clipboard text as cell JSON and inserts the cells without clearing
Users are affected if all of the following are true:
ImpactThe script runs in the JupyterLab page, in the same origin and session as the authenticated user, so it can 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. It runs on paste, without the user executing anything. Only the output of a code cell can run a script this way. Markdown and raw cells are always sanitized, as the trust documentation states. The attacker needs no JupyterLab account and no access to the server, only the user's clipboard at the moment of the paste. A web page can replace the text you copy from it, or write the clipboard directly once you have given it permission. Both need you to click or press a key on that page first. PatchesJupyterLab Users of applications that depend on JupyterLab, such as Notebook v7+, should update WorkaroundsOn 4.5.2 and later, confirm that the system clipboard is not in use for cells. The setting is off by default; check Settings, Notebook, or the raw value:
With that setting off, cell copy and paste use JupyterLab's in-application clipboard, which never leaves the page. The cost is that cells can no longer be copied between browser tabs or windows. On 4.5.0 and 4.5.1 there is no such setting, and every paste reads the system clipboard and upgrade is highly recommended. Pasting cells without their outputs also stops the script from running, at the cost of discarding outputs on every paste:
Affected versions
0.7.0
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
+ 5 more Show less
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0rc2
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0rc1
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0rc0
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0b1
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0b0
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0a7
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0a6
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0a5
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0a4
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0a3
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0a2
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.4
patch
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0a1
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.7.0a0
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.3
patch
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.2
patch
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.1
patch
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.0
minor
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.0rc0
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.0b1
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.0b0
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.0a10
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.0a9
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.0a8
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.0a7
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev | ||
0.6.0a6
pre
1 CVE
CVE-2026-102830
PYSEC-2026-4059
GHSA-3jqq-pw4j-pqcj
PYSEC-2026-4056
Oct 01, 2026
JupyterLab: Cross-site scripting (XSS) in JupyterLab via crafted language package (jupyterlab.json)
6.8
/ 10
Medium
Network
High
None
Required
Unchanged
High
High
None
DescriptionA language pack ships a 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.
ImpactThe 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. PatchesJupyterLab 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 WorkaroundsUse 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. Affected versions
0.0.0a0
0.1.0
0.1.0a0
0.1.0a1
0.1.0b19
0.1.0b20
0.1.0b21
0.1.0b22
0.1.0rc0
0.1.1
0.1.2
0.1.3
+ 88 more Show less
0.2.0
0.2.0a0
0.2.0a1
0.2.0a2
0.2.0a3
0.2.0a4
0.2.0b0
0.2.0b1
0.2.0rc0
0.2.0rc1
0.2.1
0.2.2
0.2.3
0.3.0
0.3.0a0
0.3.0a1
0.3.0b0
0.3.0rc0
0.3.0rc1
0.4.0
0.4.0a0
0.4.0a1
0.4.0a2
0.4.0a3
0.4.0b0
0.4.0b1
0.4.0rc0
0.4.1
0.4.2
0.4.3
0.4.4
0.4.5
0.5.0
0.5.0a0
0.5.0a1
0.5.0a2
0.5.0b0
0.5.0rc0
0.5.1
0.6.0
0.6.0a0
0.6.0a1
0.6.0a10
0.6.0a2
0.6.0a3
0.6.0a4
0.6.0a5
0.6.0a6
0.6.0a7
0.6.0a8
0.6.0a9
0.6.0b0
0.6.0b1
0.6.0rc0
0.6.1
0.6.2
0.6.3
0.6.4
0.7.0
0.7.0a0
0.7.0a1
0.7.0a2
0.7.0a3
0.7.0a4
0.7.0a5
0.7.0a6
0.7.0a7
0.7.0b0
0.7.0b1
0.7.0rc0
0.7.0rc1
0.7.0rc2
0.7.1
0.7.2
0.7.3
0.7.4
0.7.5
0.7.6
0.8.0
0.8.0a0
0.8.0a1
0.8.0a2
0.8.0b0
0.8.0b1
0.8.0rc0
0.8.1
0.8.2
0.8.3
Fixed in
0.8.4
References
Updated Oct 01, 2026 · Source: OSV.dev |