Werkzeug safe_join() allows Windows special device names
What fixes it
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
- github.com/pallets/werkzeug/commit/8d77320bcdf3a34941ec06dcf16b03c065cd21b6Fixvia CVE List
- github.com/pallets/werkzeug/releases/tag/3.1.9Fixvia CVE List
- github.com/pallets/werkzeug/security/advisories/GHSA-g6x2-hccm-hh4mAdvisoryvia CVE List
- github.com/advisories/GHSA-g6x2-hccm-hh4mAdvisoryvia GitHub
- nvd.nist.gov/vuln/detail/CVE-2026-102598Referencevia GitHub
- github.com/pallets/werkzeug/pull/3309Referencevia CVE List