nbconvert vulnerable to cross-site scripting (XSS) via multiple exploit paths
Medium5.4CVE-2021-32862 · Published Aug 10, 2022 · updated Sep 10, 2026
Affected versions
| Package | Affected | Fixed in |
|---|---|---|
| nbconvert PyPI | < 6.5.1 | 6.5.1 |
Details and references
Most of the fixes will be in this repo, though, so having it here gives us the private fork to work on patches Below is currently a duplicate of the original report: ---- Received on security@ipython.org unedited, I'm not sure if we want to make it separate advisories. Pasted raw for now, feel free to edit or make separate advisories if you have the rights to. I think the most important is to switch back from nbviewer.jupyter.org -> nbviewer.org at the cloudflare level I guess ? There might be fastly involved as well. --- ### Impact _What kind of vulnerability is it? Who is impacted?_ ### Patches _Has the problem been patched? What versions should users upgrade to?_ ### Workarounds _Is there a way for users to fix or remediate the vulnerability without upgrading?_ ### References _Are there any links users can visit to find out more?_ ### For more information If you have any questions or comments about this advisory: * Open an issue in [example link to repo](http://example.com) * Email us at [example email address](mailto:example@example.com) --- # GitHub Security Lab (GHSL) Vulnerability Report The [GitHub Security Lab](https://securitylab.github.com) team has identified potential security vulnerabilities in [nbconvert](https://github.com/jupyter/nbconvert). We are committed to working with you to help resolve these issues. In this report you will find everything you need to effectively coordinate a resolution of these issues with the GHSL team. If at any point you have concerns or questions about this process, please do not hesitate to reach out to us at `securitylab@github.com` (please include `GHSL-2021-1013`, `GHSL-2021-1014`, `GHSL-2021-1015`, `GHSL-2021-1016`, `GHSL-2021-1017`, `GHSL-2021-1018`, `GHSL-2021-1019`, `GHSL-2021-1020`, `GHSL-2021-1021`, `GHSL-2021-1022`, `GHSL-2021-1023`, `GHSL-2021-1024`, `GHSL-2021-1025`, `GHSL-2021-1026`, `GHSL-2021-1027` or `GHSL-2021-1028` as a reference). If you are _NOT_ the correct point of contact for this report, please let us know! ## Summary When using nbconvert to generate an HTML version of a user-controllable notebook, it is possible to inject arbitrary HTML which may lead to Cross-Site Scripting (XSS) vulnerabilities if these HTML notebooks are served by a web server (eg: nbviewer) ## Product nbconvert ## Tested Version [v5.5.0](https://github.com/jupyter/nbconvert/releases/tag/5.5.0) ## Details ### Issue 1: XSS in notebook.metadata.language_info.pygments_lexer (`GHSL-2021-1013`) Attacker in control of a notebook can inject arbitrary unescaped HTML in the `notebook.metadata.language_info.pygments_lexer` field such as the following: ```json "metadata": { "language_info": { "pygments_lexer": "ipython3-foo\"><script>alert(1)</script>" } } ``` This node is read in the [`from_notebook_node`](https://github.com/jupyter/nbconvert/blob/3c0f82d1acbcf2264ae0fa892141a037563aabd0/nbconvert/exporters/html.py#L135-L140) method: ```python def from_notebook_node(self, nb, resources=None, **kw): langinfo = nb.metadata.get('language_info', {}) lexer = langinfo.get('pygments_lexer', langinfo.get('name', None)) highlight_code = self.filters.get('highlight_code', Highlight2HTML(pygments_lexer=lexer, parent=self)) self.register_filter('highlight_code', highlight_code) return super().from_notebook_node(nb, resources, **kw) ``` It is then assigned to `language` var and passed down to [`_pygments_highlight`](https://github.com/jupyter/nbconvert/blob/3c0f82d1acbcf2264ae0fa892141a037563aabd0/nbconvert/filters/highlight.py#L90) ```python from pygments.formatters import LatexFormatter if not language: language=self.pygments_lexer latex = _pygments_highlight(source, LatexFormatter(), language, metadata) ``` In this method, the `language` variable is [concatenated to `highlight hl-` string to conform the `cssclass`](https://github.com/jupyter/nbconvert/blob/3c0f82d1acbcf2264ae0fa892141a037563aabd0/nbconvert/filters/highlight.py#L56) passed to the `HTMLFo
- CVSS 3.1
- CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
- Severity from
- GitHub (reviewed advisory)
- Weakness
- CWE-79
- Also known as
- CVE-2021-32862, GHSA-h274-fcvj-h2wm, PYSEC-2022-249
- github.com/jupyter/nbconvert/security/advisories/GHSA-9jmq-rx5f-8jwq
- github.com/jupyter/nbviewer/security/advisories/GHSA-h274-fcvj-h2wm
- nvd.nist.gov/vuln/detail/CVE-2021-32862
- github.com/jupyter/nbconvert
- github.com/pypa/advisory-database/tree/main/vulns/nbconvert/PYSEC-2022-249.yaml
- lists.debian.org/debian-lts-announce/2023/06/msg00003.html
More Jupyter advisories
All Jupyter| Date | Advisory | Severity | Fixed in |
|---|---|---|---|
| Jun 162022 | Jupyter server Token bruteforcing CVE-2022-29241High7.1fixed in 1.17.1, 2.0.0a1 | High7.1 | 1.17.1, 2.0.0a1 |
| Jun 162022 | Token bruteforcing. CVE-2022-29238Medium4.3fixed in 6.4.12 | Medium4.3 | 6.4.12 |
| May 242022 | Cross-Site Request Forgery in JupyterHub CVE-2020-36191Medium4.5fixed in 1.2.0b1 | Medium4.5 | 1.2.0b1 |
| May 172022 | Improper Input Validation in Jupyter Notebook CVE-2015-7337Critical9.8fixed in 4.0.5 | Critical9.8 | 4.0.5 |
| May 142022 | Improper Neutralization of Input During Web Page Generation in Jupyter Notebook CVE-2015-6938Medium6.1fixed in 4.0.5 | Medium6.1 | 4.0.5 |
| May 142022 | Improper Neutralization of Input During Web Page Generation in Jupyter Notebook CVE-2019-9644Medium5.4fixed in 5.7.6 | Medium5.4 | 5.7.6 |