All vulnerabilities
CVE-2026-102598GHSA-g6x2-hccm-hh4mPYSEC-2026-4312

Werkzeug safe_join() allows Windows special device names

pallets WerkzeugpipLibraries & packages
CVSS
6.3Medium
ExploitationNo known exploitationNot in CISA KEV, which does not prove it is unexploitedCISA KEV
Exploit odds (EPSS)0.37%Chance of exploitation activity in the next 30 days, higher than 29% of CVEs. Scored 23 Oct 2026FIRST EPSS
Fixed in3.1.9Fixed versionGitHub
Published29 Sep 2026Updated 15 Oct 2026CVE List

What fixes it

  • 3.1.9Werkzeug, pipGitHub
  • 3.1.9werkzeug, PyPIOSVpip install "werkzeug>=3.1.9"

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

Description

Werkzeug's safe_join function allows Windows device names as filenames when they have an empty ADS marker on NTFS.

This was previously reported as https://github.com/pallets/werkzeug/security/advisories/GHSA-hgf8-39gv-g3f2, but the added filtering failed to account for the fact Windows allows special device names with an empty ADS marker, such as NUL:.

send_from_directory uses safe_join to safely serve files at user-specified paths under a directory. If the application is running on Windows and NTFS, and the requested path ends with a special device name, the file will be opened successfully, but reading will hang indefinitely.

Text from GitHub Advisory Database

Affected versions 53

  • Werkzeug, pip< 3.1.9GitHub
  • werkzeugaffected: < 3.1.9CVE List
  • werkzeug, PyPIfrom first release, fixed in 3.1.9OSV
  • werkzeug, PyPI0.1OSV
  • werkzeug, PyPI0.10OSV
  • werkzeug, PyPI0.10.1OSV
  • werkzeug, PyPI0.10.2OSV
  • werkzeug, PyPI0.10.3OSV
  • werkzeug, PyPI0.10.4OSV
  • werkzeug, PyPI0.11OSV
  • werkzeug, PyPI0.11.1OSV
  • werkzeug, PyPI0.11.10OSV
  • werkzeug, PyPI0.11.11OSV
  • werkzeug, PyPI0.11.12OSV
  • werkzeug, PyPI0.11.13OSV
  • werkzeug, PyPI0.11.14OSV
  • werkzeug, PyPI0.11.15OSV
  • werkzeug, PyPI0.11.2OSV
  • werkzeug, PyPI0.11.3OSV
  • werkzeug, PyPI0.11.4OSV
  • werkzeug, PyPI0.11.5OSV
  • werkzeug, PyPI0.11.6OSV
  • werkzeug, PyPI0.11.7OSV
  • werkzeug, PyPI0.11.8OSV
  • werkzeug, PyPI0.11.9OSV
  • werkzeug, PyPI0.12OSV
  • werkzeug, PyPI0.12.1OSV
  • werkzeug, PyPI0.12.2OSV
  • werkzeug, PyPI0.13OSV
  • werkzeug, PyPI0.14OSV
  • werkzeug, PyPI0.14.1OSV
  • werkzeug, PyPI0.15.0OSV
  • werkzeug, PyPI0.15.1OSV
  • werkzeug, PyPI0.15.2OSV
  • werkzeug, PyPI0.15.3OSV
  • werkzeug, PyPI0.15.4OSV
  • werkzeug, PyPI0.15.5OSV
  • werkzeug, PyPI0.15.6OSV
  • werkzeug, PyPI0.16.0OSV
  • werkzeug, PyPI0.16.1OSV
  • werkzeug, PyPI0.2OSV
  • werkzeug, PyPI0.3OSV
  • werkzeug, PyPI0.3.1OSV
  • werkzeug, PyPI0.4OSV
  • werkzeug, PyPI0.4.1OSV
  • werkzeug, PyPI0.5OSV
  • werkzeug, PyPI0.5.1OSV
  • werkzeug, PyPI0.6OSV
  • werkzeug, PyPI0.6.1OSV
  • werkzeug, PyPI0.6.2OSV
  • werkzeug, PyPI0.7OSV
  • werkzeug, PyPI0.7.1OSV
  • werkzeug, PyPI0.7.2OSV

References 6