{"id":"CVE-2026-44727","aliases":["GHSA-fcw5-x6j4-ccmp","PYSEC-2026-366"],"url":"https://o3.security/vulnerability/CVE-2026-44727","summary":"Jupyter Server: Stored XSS in `NbconvertFileHandler` / `NbconvertPostHandler` via missing `sandbox` CSP","details":"The nbconvert HTTP handlers in jupyter_server render user-authored notebook HTML under the Jupyter origin without a sandbox directive in their `Content-Security-Policy`. \n\nCombined with `nbconvert.HTMLExporter`'s default non-sanitizing behavior, a notebook carrying an HTML payload in a display_data output triggers stored XSS with cookie access, full /api/* authority, and kernel RCE.\n\n### Impact\n\nAn authenticated victim who navigates to `/nbconvert/html/<path>` containing attacker-authored output can have their token exfiltrated to another domain because it is executed in the Jupyter origin.\n\n### Patches\n\nFixed in v2.20.0, commit [6cbee8d](https://github.com/jupyter-server/jupyter_server/commit/6cbee8d65e71abac851c4492fea987ad080580bd)\n\n\n### Workarounds\n\nFor deployments where editing the installed jupyter_server is impractical (containerized builds, read-only images), adding this to jupyter_server_config.py has the same effect as the patch above without touching source files:\n\n```\nimport jupyter_server.nbconvert.handlers as _nb\n\ndef _csp(self):\n    return super(type(self), self).content_security_policy + \"; sandbox allow-scripts\"\n\n_nb.NbconvertFileHandler.content_security_policy = property(_csp)\n_nb.NbconvertPostHandler.content_security_policy = property(_csp)\n```","published":"2026-06-22T19:56:56.776Z","modified":"2026-09-12T03:46:42.282542501Z","cvss":null,"epss":{"score":0.00438,"percentile":0.37362,"asOf":"2026-09-17"},"cisaKev":null,"exploitsKnown":0,"affectedPackages":[{"ecosystem":"PyPI","name":"jupyter-server","fixedVersion":"2.20.0"}],"fix":{"url":"https://github.com/jupyter-server/jupyter_server/commit/6cbee8d65e71abac851c4492fea987ad080580bd","label":"jupyter-server/jupyter_server@6cbee8d"},"references":[{"type":"WEB","url":"https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-44727.json"},{"type":"ADVISORY","url":"https://access.redhat.com/errata/RHSA-2026:43038"},{"type":"ADVISORY","url":"https://access.redhat.com/errata/RHSA-2026:60520"},{"type":"ADVISORY","url":"https://access.redhat.com/security/cve/CVE-2026-44727"},{"type":"ADVISORY","url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/44xxx/CVE-2026-44727.json"},{"type":"ADVISORY","url":"https://github.com/jupyter-server/jupyter_server/security/advisories/GHSA-fcw5-x6j4-ccmp"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-44727"},{"type":"REPORT","url":"https://bugzilla.redhat.com/show_bug.cgi?id=2491516"},{"type":"FIX","url":"https://github.com/jupyter-server/jupyter_server/commit/6cbee8d65e71abac851c4492fea987ad080580bd"},{"type":"ADVISORY","url":"https://github.com/advisories/GHSA-fcw5-x6j4-ccmp"},{"type":"PACKAGE","url":"https://github.com/jupyter-server/jupyter_server"},{"type":"WEB","url":"https://github.com/pypa/advisory-database/tree/main/vulns/jupyter-server/PYSEC-2026-366.yaml"},{"type":"WEB","url":"https://pypi.org/project/jupyter-server"}],"provenance":{"sources":["OSV.dev","FIRST.org (EPSS)"],"lastVerified":"2026-09-12T03:46:42.282542501Z"}}